ルビー
Rev 3、55バイト
i=1
'S, OJ1*$HCH(#%0'.bytes{|e|puts "%x"%i+=e*130&9011}
Randomraのアイデアをさらに発展させるために、以下の出力と差異の表を検討してください。差分テーブルは以前のように圧縮でき、65 = binary 1000001を掛けてマスク11001100110011を適用することで拡張できます。ただし、Rubyは8ビット文字では予測どおりに動作しません(Unicodeとして解釈する傾向があります)。
驚くべきことに、最後の列は完全に均等です。このため、圧縮では、データに対して右シフトを実行できます。これにより、すべてのコードが7ビットASCIIになります。展開では、65ではなく65 * 2 = 130を乗算します。
最初の列も完全に均等です。したがって、必要に応じて各要素に1(各バイトに32)を追加して、制御文字を回避できます。不要な1は、マスク1111100110011 = 9011を代わりに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
テーブルには15バイトを使用していますが、実際には各バイトの6ビットのみを使用しており、合計90ビットです。実際、各バイトに可能な値は36のみであり、合計で2.21E23の可能性があります。これは、77ビットのエントロピーに収まります。
Revra、58バイト、Randomraのインクリメンタルアプローチを使用
i=0
'UPEIP@bPHPBETTEPRADT'.bytes{|e|puts "%x"%i+=e*65&819}
最後に、単純なソリューションよりも短いもの。Revraのバイトパッキング方式を使用したRandomraのインクリメンタルアプローチ。
Rev 1、72バイト、rev 0のゴルフバージョン
ゴルフの理由でコードの並べ替えに対応するためにベースラインにいくつかの変更が加えられましたが、それでもナイーブなソリューションよりも長くかかりました。
i=0
'UPUIYD&!)$&V*).);c+*'.bytes{|e|i+=1;puts "%x"%(i/2*273+(e*65&819))}
オフセットは、形式4でベース4のマジックストリングの各文字にエンコードされますBAC
。つまり、1は右側のシンボルを表し、16は中央のシンボルを表し、左側のシンボルは4の位置に蹄鉄を打ちます。それらを抽出するために、ASCIIコードに65(バイナリ1000001)を掛けてを与えBACBAC
、次に819(バイナリ1100110011)でANDを与えてを与え.A.B.C
ます。
ASCIIコードの中には、制御文字を避けるために、必要な値より64高い7番目のビットが設定されているものがあります。このビットはマスク819によって削除されるため、値C
が3でキャリーオーバーが発生する場合を除き、これは重要ではありません。これは1つの場所でのみ修正する必要があります(代わりに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
説明
次のソリューションから、ベースラインを減算し、データとして保存するオフセットを指定します。ベースラインは、コード内の16進数として再生成されますi/2*273
(10進数273 = 16進数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