루비
개정판 3, 55 바이트
i=1
'S, OJ1*$HCH(#%0'.bytes{|e|puts "%x"%i+=e*130&9011}
Randomra의 아이디어에 대한 추가 개발로 아래의 출력 및 차이 표를 고려하십시오. 차이 테이블은 이전과 같이 압축하고 65 = 2 진 1000001을 곱하고 마스크 11001100110011을 적용하여 확장 할 수 있습니다. 그러나 Ruby는 8 비트 문자로 예측 가능하지 않습니다 (유니 코드로 해석하는 경향이 있습니다).
놀랍게도, 마지막 열은 완전히 균일합니다. 이 때문에 압축시 데이터에 대해 오른쪽 이동을 수행 할 수 있습니다. 이렇게하면 모든 코드가 7 비트 ASCII가됩니다. 확장에서는 단순히 65 대신 65 * 2 = 130을 곱하면됩니다.
첫 번째 열도 완전히 균일합니다. 따라서 제어 문자를 피하기 위해 필요한 경우 각 요소에 1을 추가 할 수 있습니다 (각 바이트에 32 개). 원하지 않는 1은 마스크 11001100110011 대신 10001100110011 = 9011을 사용하여 제거됩니다.
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 비트의 엔트로피에 적합 할 것입니다.
Randomra의 증분 방식을 사용하는 Rev 2, 58 바이트
i=0
'UPEIP@bPHPBETTEPRADT'.bytes{|e|puts "%x"%i+=e*65&819}
마지막으로 순진한 솔루션보다 짧은 것입니다. Rev 1의 바이트 패킹 방법을 사용한 Randomra의 증분 방식.
rev 1, 72 바이트, rev 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)로 AND.A.B.C
.
일부 ASCII 코드는 제어 문자를 피하기 위해 7 번째 비트 세트를 가지고 있습니다. 즉, 필요한 값보다 64가 높습니다. 이 비트는 마스크 (819)에 의해 제거되기 때문에, 값 C
이 3 인 경우를 제외하고 는 이월이 발생하지 않는다. 한 곳에서만 수정해야합니다 (대신 g
사용해야합니다)c
합니다).
개정 0, ungolfed 버전
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 16 진수) 16 진수로 재생성됩니다 .
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