String-Arrays komprimieren
UPDATE: Die Tools in diesem Tipp wurden neu geschrieben, verbessert und in meinen Japt-Interpreter integriert . Um die besten Ergebnisse zu erzielen, wird empfohlen, diesen Kompressor über einem der unten aufgeführten zu verwenden. Ich werde diesen Tipp wiederholen, wenn ich etwas mehr Zeit habe, und ihn unter Berücksichtigung des neuen Kompressors neu schreiben.
Einführung
Wenn Ihr Code ein Array von Zeichenfolgen enthält, ist es am offensichtlichsten, wenn Sie jede ZeichenfolgeOc
einzeln durchlaufen . In diesem Tipp wird mit dem Array gearbeitet ["lollipop","marshmallow","nougat","oreo"]
, das anfänglich 42 Byte wiegt. Durchlaufen jeder Zeichenfolge Oc
gibt uns:
[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]
Das sind jetzt 33 Bytes, eine ordentliche Ersparnis.
Schritt 1
Aber wir können es besser machen. Wenn wir das Array zu einer durch Zeilenumbrüche getrennten Zeichenfolge zusammenfügen, können wir die Klammern, Kommas und überflüssigen Backticks entfernen und nach Zeilenumbrüchen aufteilen, um unser Array zu erhalten. Wenn wir das auf unser Beispielarray anwenden, erhalten wir Folgendes:
`lo¥ipop
Ú\hÚaow
Í
eo`·
Bis zu 26 Bytes jetzt.
Schritt 2
Aber wir können es noch besser machen! Wir könnten einen Kleinbuchstaben verwenden, um die Zeichenfolgen anstelle einer neuen Zeile abzugrenzen, die möglicherweise in die Komprimierung einbezogen wird. z
wird in keiner unserer Saiten verwendet, also lasst uns das mal sehen, wie wir uns verstehen.
`lo¥ipopzÚ\hÚaowzÍzeo`qz
Ah, Nüsse - keine Besserung da; unsere Byteanzahl ist um eins gestiegen! Es könnte ein weiterer Brief, den Sie verwenden können , aber je nach Zeichenketten, könnte es durchaus ein paar zu versuchen - in unserem Beispiel gibt es 11: b,c,d,f,j,k,q,v,x,y,z
. Jeder Versuch wäre ziemlich mühsam, wo dieses handliche Werkzeug ist Spiel. Geben Sie Ihre durch Zeilenumbrüche getrennten Zeichenfolgen ein, und es wird versucht, die Zeichenfolgen mit jedem Buchstaben abzugrenzen, der in keiner der Zeichenfolgen enthalten ist, und Folgendes ausgegeben:
- die kürzeste komprimierte Zeichenfolge,
- das verwendete Trennzeichen und
- seine Länge.
Das Durchlaufen unserer Beispielzeichenfolgen zeigt, dass b
die besten Ergebnisse erzielt werden:
`lo¥ipáæqrÚaowbÍÞo`qb
Und da haben Sie es, wir haben nur 24 Bytes.
Schritt 3
Aber wir können es noch besser machen! Wenn die Reihenfolge der Zeichenfolgen in Ihrem Array keine Rolle spielt, gibt es möglicherweise eine andere Permutation in Kombination mit einem anderen Begrenzer, die sogar noch kürzer ausfallen könnte. Es wird jedoch viel mühsamer sein, jede Möglichkeit auszuprobieren. Mit unseren 4 Saiten können Sie 24 verschiedene Permutationen ausprobieren. Mit jedem der 11 möglichen Buchstaben wird das zu 264! Hier kommt dieses Tool ins Spiel. Geben Sie erneut Ihre durch Zeilenumbrüche getrennten Zeichenfolgen ein, und es wird jede Kombination aus jeder Permutation und jedem Begrenzungsbuchstaben ausprobiert, wobei Folgendes ausgegeben wird:
- die Reihenfolge der Zeichenfolgen in der kürzesten komprimierten Zeichenfolge,
- die komprimierte Zeichenfolge,
- das verwendete Trennzeichen und
- seine Länge.
Das Durchlaufen unserer Beispielzeichenfolgen zeigt, dass "nougat","oreo","lollipop","marshmallow"
mit b
als Trennzeichen die besten Ergebnisse erzielt werden, mit einer letzten Bytezahl von nur 23:
`ÍÞo½o¥ipáæqrÚaow`qb
Bonus-Tipp: Integer-Array-Komprimierung
Sie können dasselbe Prinzip auf Arrays von ganzen Zahlen anwenden, indem Sie zuerst jedes in eine höhere Basis konvertieren. Unter Verwendung dieses Beispiels 36-Byte-Array:
[588181,156859,595676,475330,680474]
Wir können das auf 29 Bytes reduzieren, indem wir es zuerst in ein Array von Basis-32-Strings konvertieren und dann durch das erste Komprimierungsprogramm ausführen:
`huclt4p5r5ÛÊg62tkogq`qt mnH
Oder nur 27 Bytes mit dem zweiten Programm:
`4p5Ïcl5ÛÊg62tkogq`qt mnH
Sie können möglicherweise ein weiteres Byte oder 2 zusätzlich dazu speichern, indem Sie die Ganzzahlkonvertierung in eine Methode verschieben, die Sie bereits auf dem Array ausführen.
Anmerkungen
- Vergessen Sie nicht, die
q<letter>(<space>)
Kosten von 1 oder 2 zusätzlichen Bytes zu berücksichtigen ·
. Sie können möglicherweise eine der Unicode - Verknüpfungen verwenden , um ein Byte zurückzugewinnen. Dies hängt von Ihrem Trennzeichen ab ( qÊ
ist dasselbe wieql<space>
, zum Beispiel).
- Ein Wort der Vorsicht bei der Verwendung des letzten Werkzeugs: Je mehr Zeichenfolgen Sie haben, desto mehr Permutationen sind vorhanden und desto langsamer wird das Programm ausgeführt, bis es schließlich zusammenbricht. Wie oben beschrieben, gibt es mit unseren 4 Beispielzeichenfolgen und 11 möglichen Buchstaben 264 mögliche Kombinationen. Erhöhen Sie die Anzahl der Zeichenfolgen um nur 1 mit den gleichen 11 Buchstaben, und wir haben bereits 1320 Kombinationen zum Ausprobieren. (Sie können dieses Tool verwenden, um die Anzahl der Kombinationen zu zählen, wenn Sie möchten).
Credits
- Oliver für die Inspiration, die Werkzeuge in diesem Tipp zu erstellen.
- ETH-Produktionen zum Korrekturlesen.