Rubin
Rev 3, 55 Byte
i=1
'S, OJ1*$HCH(#%0'.bytes{|e|puts "%x"%i+=e*130&9011}
Beachten Sie als Weiterentwicklung von Randomras Idee die folgende Ausgabe- und Differenztabelle. Die Differenztabelle kann wie zuvor komprimiert und durch Multiplizieren mit 65 = binär 1000001 und Anwenden einer Maske 11001100110011 erweitert werden. Ruby funktioniert jedoch nicht vorhersehbar mit 8-Bit-Zeichen (es interpretiert sie tendenziell als Unicode).
Überraschenderweise ist die letzte Spalte völlig gerade. Aus diesem Grund können wir bei der Komprimierung eine Verschiebung der Rechte an den Daten vornehmen. Dies stellt sicher, dass alle Codes 7-Bit-ASCII sind. Bei der Erweiterung multiplizieren wir einfach mit 65 * 2 = 130 anstatt mit 65.
Die erste Spalte ist auch ganz gerade. Daher können wir bei Bedarf zu jedem Element 1 hinzufügen (32 zu jedem Byte), um Steuerzeichen zu vermeiden. Die unerwünschte 1 wird mit der Maske 10001100110011 = 9011 anstelle von 11001100110011 entfernt.
Solution 59 of document linked in question
Start0001
Out Diff
2223 2222
2433 0210
2433 0000
4445 2012
6555 2110
6577 0022
6687 0110
6887 0200
8897 2010
aa99 2202
caa9 2010
cab9 0010
cbbb 0102
cdbd 0202
cddd 0020
Obwohl ich 15 Bytes für die Tabelle verwende, verwende ich wirklich nur 6 Bits von jedem Byte, was insgesamt 90 Bits entspricht. Tatsächlich gibt es nur 36 mögliche Werte für jedes Byte, was insgesamt 2.21E23 Möglichkeiten entspricht. Das würde in 77 Bits Entropie passen.
Rev 2, 58 Bytes, mit Randomras inkrementellem Ansatz
i=0
'UPEIP@bPHPBETTEPRADT'.bytes{|e|puts "%x"%i+=e*65&819}
Schließlich etwas kürzer als die naive Lösung. Randomras inkrementeller Ansatz mit der Bytepack-Methode von Rev. 1.
Rev 1, 72 Bytes, Golfversion von Rev 0
Einige Änderungen wurden an der Grundlinie vorgenommen, um eine Neuordnung des Codes aus Golfgründen zu berücksichtigen, kamen aber immer noch länger als die naive Lösung.
i=0
'UPUIYD&!)$&V*).);c+*'.bytes{|e|i+=1;puts "%x"%(i/2*273+(e*65&819))}
Die Offsets werden in jedem Zeichen der magischen Zeichenkette in Basis 4 im Format codiert BAC
, dh die Einsen stehen für das rechte Symbol, die Sechsen für das mittlere Symbol und das linke Symbol werden an die Position der Vier gesetzt. Um sie zu extrahieren, wird der ASCII-Code mit 65 (binär 1000001) multipliziert, um zu geben BACBAC
, und dann wird er mit 819 (binär 1100110011) anded, um zu geben .A.B.C
.
Einige der ASCII-Codes haben das 7. Bit gesetzt, dh sie sind 64 höher als der erforderliche Wert, um Steuerzeichen zu vermeiden. Da dieses Bit von der Maske 819 entfernt wird, ist dies nicht von Belang, außer wenn der Wert C
3 ist, was einen Übertrag verursacht. Dies muss nur an einer Stelle korrigiert werden (statt g
wir müssen verwenden c
.)
Rev. 0, ungolfed version
a= %w{000 010 000 201 100 100 011 021 110 120 011 112 111 221 211 221 122 123 112 222}
i=2
a.each{|e|puts "%x"%(i/2*273+e.to_i(16));i+=1}
Ausgabe
111
121
222
423
433
433
455
465
665
675
677
778
888
998
a99
aa9
abb
abc
bbc
ccc
Erläuterung
Von der folgenden Lösung subtrahiere ich die Grundlinie und gebe den Versatz an, den ich als Daten speichere. Die Grundlinie wird im Code als Hexadezimalzahl um i/2*273
(273 Dezimal = 111 Hex.) Neu generiert .
solution baseline offset
AAA AAA 000
ABA AAA 010
BBB BBB 000
DBC BBB 201
DCC CCC 100
DCC CCC 100
DEE DDD 011
DFE DDD 021
FFE EEE 110
FGE EEE 120
FGG FFF 011
GGH FFF 112
HHH GGG 111
IIH GGG 221
JII HHH 211
JJI HHH 221
JKK III 122
JKL III 123
KKL JJJ 112
LLL JJJ 222