Kleiner Programmierwettbewerb

Wir suchen einen Algorithmus zum Komprimieren sehr kurzer Texte (Es handelt sich um SMS). Die Texte sind
in der Regel in deutscher Sprache verfasst und ca. 80 Zeichen lang.
Diese sollen nach der Komprimierung über ein Netzwerk übertragen werden
und danach wieder dekomprimiert werden. Der Speicherbedarf der Software
ist für den Wettbewerb unerheblich, d.h. es können Wörterbücher und co
beliebiger Größe verwendet werden. Der Algorithmus soll verlustfrei
arbeiten bis auf folgende Ausnahmen:

– nach dem Dekomprimieren dürfen alle Buchstaben Großbuchstaben sein.
– Umlaute und das „ß“ dürfen nach dem Dekomprimieren ausgeschrieben sein.
– Alle nicht-Buchstaben – also auch Zahlen – ausser “ !.-:)“ dürfen nach
dem Dekomprimieren ein „.“ sein

Gewinner ist der Algorithmus, der auf eine Textsammlung angewandt das
beste Durchschnittsergebnis erzielt. Der Algorithmus muss unter GPL oder
BSD Lizenz stehen und wird von uns veröffentlicht. Als Preis winken
neben ewigen Ruhm eine Nennung im Quellcode, auf unserer Website und auf
dem LNDW-Poster!

Der Wettbewerb läuft bis Ende Februar. Einsendungen bitte per Mail an
mich. Der Algorithmus sollte am besten in c oder Java abgefasst sein.

Der Beitrag wurde am Donnerstag, den 27. Januar 2011 um 12:56 Uhr von Heiko Will veröffentlicht und wurde unter Allgemein abgelegt. Sie können die Kommentare zu diesem Eintrag durch den RSS 2.0 Feed verfolgen. Sie können einen Kommentar schreiben, oder einen Trackback auf Ihrer Seite einrichten.

21 Reaktionen zu “Kleiner Programmierwettbewerb”

  1. hmpf

    Hi,

    Hätte ein paar fragen :
    1. welche zeichen sind in der eingabe erlaubt?
    2. alle sms in deutscher sprache?

    grüße

  2. Kaspar

    Warum 80 Zeichen? SMS sind doch 160 Zeichen lang…

  3. Heiko Will

    Ja, aber 160 zeichen über eine Kugelbahn sind je nach Komprimierung über 1000 Kugeln…

  4. Heiko Will

    Hallo,

    in der Eingabe sind alle Zeichen erlaubt – das ist aber irrelevant, da ich ja die Zeichen der Ausgabe vorgegeben habe. D.h. alle nicht Buchstaben und die 6 erlaubten Sonderzeichen können schon vor dem Komprimieren durch den „.“ ersetzt werden.

  5. Heiko Will

    Die Texte sind in deutscher Sprache, es müssen aber auch alle anderen Wörter/Texte übertragen werden können. Da 99% in deutscher Sprache sein werden, spielt der Komprimierungsgrad der nicht deutschen in der Summe aber keine Rolle.

  6. Heiko Will

    Super wäre es, ein Beispielwörterbuch mit SMS-Sprache zu haben. Will nicht mal jemand eine einschlägige Internetseite parsen und hier als TXT zur Verfügung stellen?…

  7. Heiko Will

    Hier gibt es diverse Wortlisten, nach Häufigkeit sortiert:
    https://wortschatz.uni-leipzig.de/html/wliste.html

  8. Hasan

    Ist das Versenden über ein Netzwerk ein echtes Versenden, so dass man beim Dekrompieren „Fehler erkennen“ und/oder „Fehler korrigieren“ soll oder ist das irrelevant?

  9. Heiko Will

    Es ist ein echtes Versenden (auf dieser Website erklärt). Allerdings findet auf den unteren Layer eine Fehlererkennung statt, so dass Euer Algorithmus von einer fehlerfreien Übertragung ausgehen kann.

  10. Ich

    In welcher Zeichencodierung ist die Eingabe? Bei UTF-8 würden die Umlaute und das ß 2 Bytes brauchen. Bei ISO-8859-1 wäre es nur ein Byte. Das wäre zum Einlesen wichtig.

  11. Heiko Will

    Das Ursprungsformat ist ISO 8859-1 (ASCII). Arbeitet für die Eingabe einfach mit normalen String (egal ob UTF8 oder ASCII), komprimiert das ganze dan wie Ihr wollt und entkomprimiert das ganze wieder als String, der dann eben nur noch die erlaubten 32 Zeichen enthält.

  12. Ich

    Ich korrigiere nur ungerne, aber ISO 8859-1 ist nicht das gleiche wie ASCII.

  13. Maik

    Wird dem Algorithmus die vollständige Sammlung von SMS gegeben, oder nur eine SMS nach der anderen?

  14. Heiko Will

    BItte auch den Rest der Seite lesen. Es geht hier um echte Datenübertragung. Wir empfangen eine SMS aus dem Publikum und übertragen diese mittels einer Kugelbahn. Da wir so wenig Kugeln wie nötig nutzen wollen, muss die SMS komprimiert werden. Eurer Fantasie sind dabei keine Grenzen gesetzt.
    Eine Wortdatei können wir nicht stellen, da wir ja nicht wissen was für SMS die Leute schreiben werden. Erfahrungsgemäß kommen aber Sachen wie „Hallo [NAME]“ oder ähnliches recht häufig vor.

  15. Julius

    Wie soll denn der kodierte Byte-Stream repräsentiert werden? Einfach als String von ‚0‘en und ‚1‘en, oder kodiert in 32bit Integers, oder …?

  16. Heiko Will

    Am besten als char array oder wie auch immer, aber nicht als String.

  17. Marco

    Gibt’s bekommt man am Ende mitgeteilt auf welchen Platz man mit seinem Algo gekommen ist – oder wird es gar ein Ranking geben?

  18. LB

    Hier mein Vorschlag für einen Algorithmus:
    Die Bedinungen stehen ja schon oben:
    -das Alphabet hat 32 Zeichen
    -ca. 80 Zeichen Text werden versandt
    -Speicherbedarf unerheblich

    Meine Idee ist ganz simpel, braucht für eine SMS mit 160 Zeichen – NACH Konvertierung in das 32-Zeichen Alphabet – maximal 235Kugeln. Bei maximal 80 Zeichen sind es 203 Kugeln.

    Eine Lookup-Tabelle…

    alle 160^32 Möglichkeiten generieren und in einer Tabelle ablegen und durchnummerieren.

    zum Komprimieren den Text in der Tabelle suchen und die Zahl übertragen, beim Dekomprimieren die Zahl nachschlagen und den Text ausgeben.

    Vermutlich sprengt die Tabelle doch ein wenig den Rahmen…

    LG LB

  19. Heiko Will

    @Marco: Ein Ranking sollte kein Problem sein. Ich würde eines mit den Ergebnissen unseres Testtextes erstellen – worauf der Sieger basiert. Und zusätzlich noch Eines das aus den echten auf der LNDW verschickten SMS generiert ist – also das Praxisranking.

    @LB: Dem ganzen liegt ein Rechenfehler zugrunde. Da Deine Betrachtung die Entropie des Textes überhaupt nicht betrachtet, könnte ich Deinen Ansatz rekursiv anwenden und Text würde jede Runde kleiner.
    Eine SMS aus 80 Zeichen mit einem Alphabet aus 32 Zeichen hat 80*5 Bit – das sind 400 Bit. 400 Bit sind 2^400 Kombinationen und 2^400 Kombinationen kannst Du bijektiv nur in Log2(2^400)=80 Bit repräsentieren. Du brauchst also keinerlei Speicher, da Deine Representation bei entsprechender Abbildungsvorschrift die Nachricht selber ist. Probier das mal bei einem Byte. Das hat 8 Bit und 256 Kombinationen. Diese 256 Kombinationen kannst Du jetzt in eine Lookup Tabelle eintragen und jeder einen key geben und nur den Übertragen. Trotzdem ist die Keylänge 8 Bit.

  20. Stefan Friesel

    @Heiko: 1) char array heißt, wir können nur Vielfache von 8 Bit als Code ausgeben? 2) Darf der Codec beim Benchmark auch Dateien erstellen, die zwischen den Aufrufen erhalten bleiben?

  21. Heiko Will

    @Stefan: Du kannst auch zusätzlich zum array die Menge der relevanten Bits zurückgeben, dann kannst Du evtl. 7 Bit sparen ;-). Dateien erstellen wäre mir nicht so lieb, aber behalte alles was Du brauchst im Speicher und besorg Dir den mit malloc, so das der überlebt. Wenn es nicht anders geht, kannst Du auch Dateien nutzen.

Schreibe einen Kommentar

Captcha
Refresh
Hilfe
Hinweis / Hint
Das Captcha kann Kleinbuchstaben, Ziffern und die Sonderzeichzeichen »?!#%&« enthalten.
The captcha could contain lower case, numeric characters and special characters as »!#%&«.