红宝石
Rev 3,55字节
i=1
'S, OJ1*$HCH(#%0'.bytes{|e|puts "%x"%i+=e*130&9011}
作为对Randomra想法的进一步发展,请考虑下面的输出和差异表。可以像以前一样压缩差异表,并通过乘以65 =二进制1000001并应用掩码11001100110011进行扩展。但是,Ruby无法正常使用8位字符(它倾向于将它们解释为Unicode。)
令人惊讶的是,最后一栏完全是偶数。因此,在压缩中我们可以对数据执行右移。这样可以确保所有代码均为7位ASCII。在扩展中,我们只需乘以65 * 2 = 130而不是65。
第一列也完全是偶数。因此,如果需要,我们可以在每个元素上加1(每个字节32个),以避免任何控制字符。使用掩码10001100110011 = 9011代替11001100110011除去不需要的1。
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
尽管我在表中使用15个字节,但实际上每个字节我只使用6位,总共90位。实际上,每个字节只有36个可能的值,总共为2.21E23个可能性。这将适合77位熵。
Rev 2,58个字节,使用Randomra的增量方法
i=0
'UPEIP@bPHPBETTEPRADT'.bytes{|e|puts "%x"%i+=e*65&819}
最后,比天真的解决方案还短。Randomra的增量方法,具有Rev.1的字节打包方法。
修订版1,72字节,修订版0的修订版
出于对高尔夫的原因,对基线进行了一些更改以适应代码的重新排序,但仍比幼稚的解决方案长。
i=0
'UPUIYD&!)$&V*).);c+*'.bytes{|e|i+=1;puts "%x"%(i/2*273+(e*65&819))}
偏移量以4的格式编码到魔术弦的每个字符中BAC
,即1代表右手符号,16代表中间符号,左手符号四角插入4的位置。为了提取它们,将ascii码乘以65(二进制1000001)得到BACBAC
,然后与819(二进制1100110011)相加得到.A.B.C
。
某些ASCII码设置了第7位,即比要求的值高64,以避免控制字符。因为该位被掩码819除去,所以这无关紧要,除非当值C
是3时,这会导致残留。这只能在一个地方纠正(而不是g
必须使用c
。)
Rev 0,未发布版本
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}
输出量
111
121
222
423
433
433
455
465
665
675
677
778
888
998
a99
aa9
abb
abc
bbc
ccc
说明
从以下解决方案中,我减去了基线,给出了我存储为数据的偏移量。基线在代码中以十六进制数的形式重新生成i/2*273
(273十进制= 111十六进制。)
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