Rubis
Rév 3, 55 octets
i=1
'S, OJ1*$HCH(#%0'.bytes{|e|puts "%x"%i+=e*130&9011}
Pour développer davantage l'idée de Randomra, considérons le tableau des sorties et des différences ci-dessous. La table des différences peut être compressée comme précédemment et développée en multipliant par 65 = binaire 1000001 et en appliquant un masque 11001100110011. Cependant, Ruby ne fonctionne pas de manière prévisible avec des caractères 8 bits (il a tendance à les interpréter comme Unicode.)
Étonnamment, la dernière colonne est entièrement uniforme. Pour cette raison, en compression, nous pouvons effectuer un changement de droits sur les données. Cela garantit que tous les codes sont ASCII 7 bits. En expansion, nous multiplions simplement par 65 * 2 = 130 au lieu de 65.
La première colonne est également entièrement uniforme. Par conséquent, nous pouvons ajouter 1 à chaque élément (32 à chaque octet) si nécessaire, pour éviter tout caractère de contrôle. Le 1 indésirable est supprimé en utilisant le masque 10001100110011 = 9011 au lieu de 11001100110011.
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
Bien que j'utilise 15 octets pour la table, je n'utilise vraiment que 6 bits de chaque octet, soit un total de 90 bits. Il n'y a en fait que 36 valeurs possibles pour chaque octet, soit 2,21E23 au total. Cela rentrerait dans 77 bits d'entropie.
Rev 2, 58 octets, en utilisant l'approche incrémentale de Randomra
i=0
'UPEIP@bPHPBETTEPRADT'.bytes{|e|puts "%x"%i+=e*65&819}
Enfin, quelque chose de plus court que la solution naïve. L'approche incrémentale de Randomra, avec la méthode bytepacking de Rev 1.
Rev 1, 72 octets, version golfée de rev 0
Certaines modifications ont été apportées à la ligne de base pour permettre une réorganisation du code pour des raisons de golf, mais elles sont toujours plus longues que la solution naïve.
i=0
'UPUIYD&!)$&V*).);c+*'.bytes{|e|i+=1;puts "%x"%(i/2*273+(e*65&819))}
Les décalages sont codés dans chaque caractère de la chaîne magique au format base 4 BAC
, c'est-à-dire avec les 1 représentant le symbole de droite, les 16 représentant le symbole du milieu et le symbole de gauche chausse-pied en position de 4. Pour les extraire, le code ascii est multiplié par 65 (binaire 1000001) pour donner BACBAC
, puis il est andé avec 819 (binaire 1100110011) pour donner .A.B.C
.
Certains des codes ascii ont le 7e bit défini, c'est-à-dire qu'ils sont 64 supérieurs à la valeur requise, pour éviter les caractères de contrôle. Du fait que ce bit est supprimé par le masque 819, ceci est sans conséquence, sauf lorsque la valeur de C
est 3, ce qui provoque un report. Cela doit être corrigé en un seul endroit (au lieu de g
nous devons l'utiliser c
.)
Rev 0, version non golfée
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}
Production
111
121
222
423
433
433
455
465
665
675
677
778
888
998
a99
aa9
abb
abc
bbc
ccc
Explication
De la solution suivante, je soustrais la ligne de base, donnant le décalage que je stocke en tant que données. La ligne de base est régénérée sous la forme d'un nombre hexadécimal dans le code par i/2*273
(273 décimal = 111 hex.)
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