Ihre heutige Mission ist es, einen Textkompressor zu erfinden.
Aufgabe
Sie werden zwei Funktionen schreiben:
Der Packer ist eine Funktion, die eine Zeichenfolge aus ASCII-Zeichen (U + 0000 bis U + 007F) akzeptiert und eine Unicode-Zeichenfolge (U + 0000 bis U + 10FFFF) mit möglichst wenigen Zeichen ausgibt.
Der Entpacker ist eine Funktion, die eine codierte Unicode-Zeichenfolge akzeptiert und genau die ursprüngliche ASCII-Zeichenfolge ausgibt.
Eingang
Die einzige autorisierte Eingabe ist die ASCII-Zeichenfolge (für den Packer) und die gepackte Unicode-Zeichenfolge (für den Entpacker). Keine Benutzereingabe, keine Internetverbindung, keine Verwendung des Dateisystems.
Ihre Funktionen können auf diese Liste englischer Wörter zugreifen . Sie können diese Liste als lokale TXT-Datei verwenden oder ihren Inhalt in Ihrem Quellcode als Zeichenfolge oder als Array von Zeichenfolgen kopieren .
Sie können die folgenden Ausschnitte in Ihren Funktionen nicht fest codieren.
Ausgabe
Die einzige autorisierte Ausgabe für beide Funktionen ist eine Zeichenfolge.
Die Ausgabe des Entpackers muss genau die gleichen Zeichen enthalten wie die Eingabe des Packers.
Ihre Ein- und Ausgänge können eine beliebige Zeichenkodierung verwenden, die alle Unicode-Zeichen unterstützt (UTF-8/16/32, GB18030, ...), da Ihre Punktzahl nur von der Anzahl der Unicode-Zeichen in der Ausgabe abhängt. Bitte geben Sie an, welche Codierung Sie verwenden.
Mit dem folgenden Tool können Sie die Anzahl der Unicode-Zeichen in Ihrer Ausgabe ermitteln: http://mothereff.in/byte-counter
Wertung
Ihr Eintrag muss in der Lage sein, die 10 folgenden Textausschnitte (die ich in diesem Forum aufgenommen habe) zu packen und zu entpacken.
Ihre Punktzahl ergibt sich aus der Summe der Größen Ihrer 10 gepackten Zeichenfolgen (in Unicode-Zeichen) und der Größe Ihrer beiden Funktionen (auch in Unicode-Zeichen).
Zählen Sie nicht die Größe des Wörterbuchs, wenn Sie es verwenden.
Bitte geben Sie in Ihren Einträgen die "Punktzahl" jedes Snippets und dessen gepackte Version an.
Die niedrigste Punktzahl gewinnt.
Daten
Hier sind die Codefragmente zur Berechnung Ihrer Punktzahl:
1: Rick Roll lyrics (1870b): Wir sind keine Fremden, um Golf zu kodieren, Sie kennen die Regeln und ich auch
Wir sind keine Fremden zu lieben Sie kennen die Regeln und ich auch Ein volles Engagement ist das, woran ich denke Sie würden das von keinem anderen Kerl bekommen Ich will dir nur sagen, wie ich mich fühle Muss dich verstehen lassen Gebe dich nie auf Ich werde dich nicht enttäuschen Ich werde niemals herumlaufen und dich im Stich lassen Ich werde dich niemals zum Weinen bringen Ich werde mich nie verabschieden Ich werde niemals lügen und dich verletzen Wir kennen uns schon so lange Dein Herz hat geschmerzt, aber Du bist zu schüchtern, um es zu sagen Drinnen wissen wir beide, was los ist Wir kennen das Spiel und werden es spielen Und wenn Sie mich fragen, wie ich mich fühle Sag mir nicht, dass du zu blind bist, um zu sehen Gebe dich nie auf Ich werde dich nicht enttäuschen Ich werde niemals herumlaufen und dich im Stich lassen Ich werde dich niemals zum Weinen bringen Ich werde mich nie verabschieden Ich werde niemals lügen und dich verletzen Gebe dich nie auf Ich werde dich nicht enttäuschen Ich werde niemals herumlaufen und dich im Stich lassen Ich werde dich niemals zum Weinen bringen Ich werde mich nie verabschieden Ich werde niemals lügen und dich verletzen (Oh, gib dich auf) (Oh, gib dich auf) (Oh) Niemals geben, niemals geben (Gib dich auf) (Oh) Niemals geben, niemals geben (Gib dich auf) Wir kennen uns schon so lange Dein Herz hat geschmerzt, aber Du bist zu schüchtern, um es zu sagen Drinnen wissen wir beide, was los ist Wir kennen das Spiel und werden es spielen Ich will dir nur sagen, wie ich mich fühle Muss dich verstehen lassen Gebe dich nie auf Ich werde dich nicht enttäuschen Ich werde niemals herumlaufen und dich im Stich lassen Ich werde dich niemals zum Weinen bringen Ich werde mich nie verabschieden Ich werde niemals lügen und dich verletzen Gebe dich nie auf Ich werde dich nicht enttäuschen Ich werde niemals herumlaufen und dich im Stich lassen Ich werde dich niemals zum Weinen bringen Ich werde mich nie verabschieden Ich werde niemals lügen und dich verletzen Gebe dich nie auf Ich werde dich nicht enttäuschen Ich werde niemals herumlaufen und dich im Stich lassen Ich werde dich niemals zum Weinen bringen Ich werde mich nie verabschieden Ich werde niemals lügen und dich verletzen
2: Der Golfer (412b): Golf ASCII-art
'\. . |> 18 >> \. '. | O >>. 'o | \. | / \. | / /. ' | jgs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^
3: die Zahl Diamant (233b): Drucken Sie diesen Diamanten
1 121 12321 1234321 123454321 12345654321 1234567654321 123456787654321 12345678987654321 123456787654321 1234567654321 12345654321 123454321 1234321 12321 121 1
4: Das Alphabet viermal (107b): Drucken Sie das Alphabet viermal aus
abcdefghijklmnopqrstuvwxyz qwertyuiopasdfghjklzxcvbnm pyfgcrlaoeuidhtnsqjkxbmwvz zyxwvutsrqponmlkjihgfedcba
5: Old McDonald's Lyrics (203b): Alte MacDonald-Funktion
Der alte MacDonald hatte eine Farm, EIEIO, Und auf dieser Farm hatte er eine Kuh, EIEIO, Mit einem Moo Moo hier und einem Moo Moo dort, Hier ein Moo, dort ein Moo, überall ein Moo Moo, Der alte MacDonald hatte eine Farm, EIEIO!
6: Rock Around the Clock lyrics (144b): Rock Around the Clock
1, 2, 3 Uhr, 4 Uhr Rock, 5, 6, 7 Uhr, 8 Uhr Rock, 9, 10, 11 Uhr, 12 Uhr Rock, Wir werden heute Abend rund um die Uhr rocken.
7: Hallo Welt (296b): Sagen Sie der Welt in ASCII-Kunst "Hallo"
_ _ _ _ _ _ _ | | | | ___ | | | ___ __ _____ _ __ | | __ | | | | | _ | | / _ \ | | / _ \ \ \ / \ / / _ \ | '__ | | / _` | | | _ | __ / | | (_) | \ VV / (_) | | | | (_ | | _ | | _ | | _ | \ ___ | _ | _ | \ ___ () \ _ / \ _ / \ ___ / _ | | _ | \ __, _ (_) | /
8: Irischer Segen (210b): Ein alter irischer Segen
Möge die Straße aufsteigen, um dich zu treffen Moege der Wind immer in deinem Ruecken sein Möge die Sonne warm auf dein Gesicht scheinen Der Regen fällt sanft auf deine Felder Und bis wir uns wiedersehen Möge Gott dich in seiner hohlen Hand halten
9: Es gab eine alte Dame Texte (1208b): Es gab eine alte Dame
Da war eine alte Dame, die eine Fliege verschluckt hat. Ich weiß nicht, warum sie diese Fliege verschluckt hat, Vielleicht stirbt sie. Es gab eine alte Dame, die eine Spinne verschluckt hat, Das zappelte und zappelte und zappelte in ihr. Sie schluckte die Spinne, um die Fliege zu fangen, Ich weiß nicht, warum sie diese Fliege verschluckt hat, Vielleicht stirbt sie. Es gab eine alte Dame, die einen Vogel verschluckt hat, Wie absurd, einen Vogel zu schlucken. Sie schluckte den Vogel, um die Spinne zu fangen, Sie schluckte die Spinne, um die Fliege zu fangen, Ich weiß nicht, warum sie diese Fliege verschluckt hat, Vielleicht stirbt sie. Es gab eine alte Dame, die eine Katze verschluckt hat, Stellen Sie sich vor, Sie schlucken eine Katze. Sie schluckte die Katze, um den Vogel zu fangen, Sie schluckte den Vogel, um die Spinne zu fangen, Sie schluckte die Spinne, um die Fliege zu fangen, Ich weiß nicht, warum sie diese Fliege verschluckt hat, Vielleicht stirbt sie. Es gab eine alte Dame, die einen Hund verschluckt hat, Was für ein Schwein, einen Hund zu schlucken. Sie schluckte den Hund, um die Katze zu fangen, Sie schluckte die Katze, um den Vogel zu fangen, Sie schluckte den Vogel, um die Spinne zu fangen, Sie schluckte die Spinne, um die Fliege zu fangen, Ich weiß nicht, warum sie diese Fliege verschluckt hat, Vielleicht stirbt sie. Es gab eine alte Dame, die ein Pferd verschluckt hat, Sie ist natürlich gestorben.
10: Gettysburg-Adresse (1452b): Wie zufällig ist die Gettysburg-Adresse
Vor vier Jahren und sieben Jahren brachten unsere Väter auf diesem Kontinent eine neue Nation hervor, die in Freiheit gezeugt wurde und der Aussage verpflichtet war, dass alle Menschen gleich geschaffen sind. Jetzt befinden wir uns in einem großen Bürgerkrieg und prüfen, ob diese Nation oder irgendeine Nation, die so konzipiert und so engagiert ist, lange Bestand haben kann. Wir sind auf einem großen Schlachtfeld dieses Krieges getroffen. Wir sind gekommen, um einen Teil dieses Feldes als letzte Ruhestätte für diejenigen, die hier ihr Leben gaben, zu widmen, damit diese Nation leben könnte. Es ist insgesamt passend und richtig, dass wir dies tun sollten. Aber im weiteren Sinne können wir nicht widmen, wir können nicht weihen, wir können diesen Boden nicht heiligen. Die tapferen Männer, lebend und tot, die hier gekämpft haben, haben es geweiht, weit über unsere arme Macht, hinzuzufügen oder abzulenken. Die Welt wird sich weder merken noch lange daran erinnern, was wir hier sagen. aber es kann nie vergessen, was sie hier getan haben. Es ist vielmehr für uns, die Lebenden hier der unvollendeten Arbeit zu widmen, die die Kämpfer hier bisher so edel vorangetrieben haben. Es ist vielmehr unsere Aufgabe, uns hier der großen Aufgabe zu widmen, die vor uns liegt - dass wir uns von diesen geehrten Toten verstärkt der Sache widmen, für die sie das letzte volle Maß an Hingabe geleistet haben -, dass wir uns hier entschieden haben, dass diese Toten es nicht tun sollen umsonst gestorben, dass diese Nation unter Gott eine neue Geburt der Freiheit haben wird, und dass die Regierung des Volkes durch das Volk für das Volk nicht von der Erde zugrunde geht.
Insgesamt (unkomprimiert): 6135 Zeichen / Byte.
Habe Spaß!
private static final String RICK_ROLL_RETURN = "We're no strangers to love...
Antworten:
Haskell - 5322 Punkte
Byte Code:
686
Originalgröße :
6147
= 1871+415+234+108+204+145+297+211+1209+1453
Codierte Größe:
4636
= 1396+233+163+92+153+115+197+164+979+1144
Ergebnis :
686+ 4636
Komprimierung der Zeichenanzahl:
~25%
Code
Abgesehen von Optimierungen werden hier Werte zwischen
0
und7f
in Unicode-Zeichen als Hauptfaktoren gespeichert.Die Anzahl der Bytes der codierten Ausgabe wird nicht verringert, sondern nur die Anzahl der Unicode-Zeichen. Zum Beispiel enthält Test # 4
108
Zeichen und die codierte Ausgabe92
. Ihre jeweiligen Größen sind jedoch108
und364
Bytes.Wie es funktioniert
Codierung
n
.n
wird dann in eine Liste ihrer Primfaktoren umgewandeltps
.1
. Dies bedeutet, dass sie, die Faktoren, als Indizes mit nur 5 Bits gespeichert werden können.1
ist ein Sonderfall und wird durch eine leere Liste dargestellt.ps
der Kodierung kann jetzt begonnen werden.ps
wird in der Liste der 32 eindeutigen Faktoren in ihren Index umgewandelta
).ps
muss abgeflacht werden. Um die Integrität der Daten zu gewährleisten, wird jede Liste in eine andere Liste mit zwei Teilen konvertiertfs
.fs
können dann durch Bitverschiebung in Unicode-Zeichen gepackt werden.Dekodierung
1
passt, möchte ich Sie daran erinnernproduct [] == 1
.Tests
Das Verwenden dieser Schnittstelle zum Testen wäre schmerzhaft. Daher habe ich diese Funktion verwendet, um die folgenden Ergebnisse bereitzustellen.
Probe
Die Ausgabe der Codierungsfunktion
g
für Test Nr. 4 ist dies"\99429\582753\135266\70785\35953\855074\247652\1082563\68738\49724\164898\68157\99429\67973\1082404\587873\73795\298017\330818\198705\69861\1082435\595009\607426\36414\69873\855074\265249\346275\67779\68738\77985\1082513\821353\132131\101410\247652\1082562\49724\164898\67649\594977\34915\67746\50273\135265\103997\563265\103457\1086021\99399\584802\70753\73889\34882\582722\411459\67779\68740\1084516\1082563\1091681\103491\313282\49724\164897\68705\135741\69858\50241\607426\35905\608421\1082435\69858\50274\71777\43075\298018\280517\1082404\67971\36017\955425\67665\919600\100452\132129\214883\35057\856097\101474\70753\135737"
oder, wenn Sie ein Kenner des Kauderwels sind, dies
𘑥𡁢𑒁豱𐲂숼𨐢𘑥𐦅𒁃𰠱𑃥踾𑃱𐲂𓂡𠐣𘰢숼𨐢𐡁衣쑡𡁡𘑇𑑡𒂡衂𐲄숼𨐡𡈽𑃢쑁豁𑃢쑢ꡃ𐦃貱𐡑𘡤𠐡裱𘱢𑑡𡈹
Zusätzliche Hinweise
edTest
die Größe der Tests alle konsistent, unterscheiden sich jedoch immer noch von der in der Frage angegebenen Größe.—
) , dass ich mit ersetzt ,-
da sie außerhalb des0
-7f
Bereich.00
Basisfall,01
Alles10
wiederholen , Wiederholen mit Ausnahme des Letzten,11
Wiederholen mit Ausnahme der letzten zwei.quelle
abcdefghijklm...
zu𘑥𡁢𑒁豱...
, könnte man es erklären , ein wenig mehr , bitte? Außerdem habe ich die Zeichenanzahl korrigiert und die Gedankenstriche in # 10 in der Frage umgewandelt. Meine Charcounts sind aber immer noch anders als deine. Keine Ahnung warum, ich habe das Tool mothereff.in verwendet.C ++ (C ++ 11), 2741 Punkte
Diese Antwort verwendet UTF-32 als Kodierung für den komprimierten Text.
Char zählt und erzielte
Code: 593 Zeichen (der abschließende Zeilenumbruch wird entfernt)
Komprimierte Texte (Unicode-Zeichen) : 654 + 145 + 82 + 38 + 51 + 104 + 73 + 423 + 506 = 2148 (gezählt mit
wc -m
der Anzahl der Unicode-Zeichen anstelle von Bytes, die Anzahl der Bytes ist wie bei der Antwort von @ gxtaillon , höher als die Originale, insgesamt 8413 Bytes, gezählt mitwc -c
).Komprimierungsrate (ASCII zu Unicode) : 35,01% (unter Verwendung der 6135 Bytes aus der Frage (wie
wc -c
))In acht nehmen:
Viele Shells können die von diesem Programm erzeugten Unicode-Zeichen nicht verarbeiten. Das Dekomprimieren kann daher dazu führen, dass der Text an einer Stelle abgeschnitten wird, an der die Shell kein Zeichen verarbeiten kann, da die Eingabe über
stdin
die Shell erfolgt.Kompilieren
Es sollte mit
clang++
und kompiliertg++ -std=c++11
werden, zeigt jedoch einige Warnungen zur Priorität des Operators an, da ein Ausdruck wieb<<20-n&0xFFFFF
nicht((b << 20) - n) & 0xFFFFF
wie erwartet, sondern wie behandelt wird(b << (20 - n)) & 0xFFFFF
.Verwendung
./compress
../compress c
zum Komprimieren oder./compress d
Dekomprimieren aus. (Vorsicht, wenn Sie die Option weglassen, erhalten Sie ein SEGFAULT (die Fehlerprüfung ist so zeichenintensiv ...) und andere Optionen (z. B. usingD
anstelle vond
) können zu unerwarteten Ergebnissen führenstdin
und der Ausgang beschriebenstdout
Wie es funktioniert
Ungolfed
Erläuterung
Da alle Unicode-Zeichen von
U+0000
bisU+10FFFF
zulässig sind, können 20 Bit pro Unicode-Zeichen verwendet werden:U+FFFFF
Zeichen verwendet werden Verwendet 20 Bit und ist weiterhin im zulässigen Bereich enthalten. Daher versuchen wir nur, alle einzelnen ASCII-Zeichenbits in die Unicode-Zeichen zu packen, um mehrere ASCII-Zeichen in einem Unicode-Zeichen zu speichern. Wir müssen jedoch auch die Anzahl der im letzten Unicode-Zeichen verwendeten Bits speichern, da nicht verwendete Garbage-Bits andernfalls als ordnungsgemäß komprimierte ASCII-Zeichen interpretiert werden können. Da die maximale Anzahl verwendeter Bits im letzten Unicode-Zeichen 20 beträgt, benötigen wir dafür 5 Bits, die am Anfang der komprimierten Daten stehen.Beispielausgabe
Dies ist die Ausgabe von Beispiel 4 (wie von angegeben
less
):(
쏏𦛏
Geben Sie<U+C3CF><U+266CF>
als Zeichencodes an, aber ich hätte das vielleicht falsch verstanden.)quelle
Python 3, 289 + 818 = 1107 Punkte
Nur leicht golfen.
Die Gesamtcodegröße beträgt 289 Bytes und codiert die angegebenen 6135 Bytes in 818 Unicode-Zeichen. Die Gesamtanzahl der ausgegebenen Bytes beträgt 3201 Bytes und ist damit erheblich kleiner als die ursprünglichen Eingaben.
Codiert mit zlib und anschließend mit Unicode-Codierung. Es war eine zusätzliche Logik erforderlich, um Ersatzzeichen zu vermeiden (die Python wirklich hasst).
Beispielausgabe von # 4 aus Sicht von
less
(37 Unicode-Zeichen):Treiberprogramm zum Testen:
Anzahl der Ausgangsbytes:
quelle
p
der Packer,u
ist der Entpacker.Python 2 - 1141 Punkte
Die Codegröße ist
281
Byte und codiert die6135
Bytes in860
Unicode-Zeichen.Wie es funktioniert:
Um zu kodieren:
19
Bitgruppen auf, fügen Sie1
am Anfang jedes Bits ein Bit hinzu und konvertieren Sie sie dann in Unicode-Zeichen.Dekodierung ist das Gegenteil.
Beachten Sie, dass einige Python-Versionen nur Unicode-Zeichen bis zu verarbeiten
0xFFFF
können und dieser Code daher a auslöstValueError
.quelle