Hồng ngọc
Rev 3, 55byte
i=1
'S, OJ1*$HCH(#%0'.bytes{|e|puts "%x"%i+=e*130&9011}
Là một sự phát triển hơn nữa về ý tưởng của Randomra, hãy xem xét bảng đầu ra và sự khác biệt dưới đây. Bảng khác biệt có thể được nén như trước và được mở rộng bằng cách nhân với 65 = nhị phân 1000001 và áp dụng mặt nạ 11001100110011. Tuy nhiên, Ruby không hoạt động có thể dự đoán được với các ký tự 8 bit (nó có xu hướng diễn giải chúng là Unicode.)
Đáng ngạc nhiên, cột cuối cùng là hoàn toàn thậm chí. Do đó, trong quá trình nén, chúng tôi có thể thực hiện quyền chuyển đổi dữ liệu. Điều này đảm bảo tất cả các mã là 7 bit ASCII. Trong mở rộng, chúng tôi chỉ cần nhân với 65 * 2 = 130 thay vì 65.
Cột đầu tiên cũng hoàn toàn đồng đều. Do đó, chúng ta có thể thêm 1 cho mỗi phần tử (32 cho mỗi byte) khi cần thiết, để tránh mọi ký tự điều khiển. 1 không mong muốn được loại bỏ bằng cách sử dụng mặt nạ 10001100110011 = 9011 thay vì 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
Mặc dù tôi sử dụng 15 byte cho bảng, tôi chỉ thực sự sử dụng 6 bit của mỗi byte, tổng cộng là 90 bit. Thực tế, chỉ có 36 giá trị có thể có cho mỗi byte, tổng cộng là 2,21E23. Điều đó sẽ phù hợp với 77 bit của entropy.
Rev 2, 58 byte, sử dụng phương pháp gia tăng của Randomra
i=0
'UPEIP@bPHPBETTEPRADT'.bytes{|e|puts "%x"%i+=e*65&819}
Cuối cùng, một cái gì đó ngắn hơn giải pháp ngây thơ. Cách tiếp cận gia tăng của Randomra, với phương pháp khai thác của Rev 1.
Rev 1, 72 byte, phiên bản golf của rev 0
Một số thay đổi đã được thực hiện cho đường cơ sở để phù hợp với việc sắp xếp lại mã cho các lý do chơi gôn, nhưng vẫn còn lâu hơn giải pháp ngây thơ.
i=0
'UPUIYD&!)$&V*).);c+*'.bytes{|e|i+=1;puts "%x"%(i/2*273+(e*65&819))}
Các độ lệch được mã hóa thành từng ký tự của chuỗi ma thuật ở định dạng cơ sở 4 BAC
, tức là với số 1 đại diện cho biểu tượng tay phải, số 16 đại diện cho biểu tượng ở giữa và biểu tượng bên trái được đặt vào vị trí của 4. Để trích xuất chúng, mã ascii được nhân với 65 (nhị phân 1000001) để cung cấp BACBAC
, sau đó nó được gắn với 819 (nhị phân 1100110011) để cung cấp .A.B.C
.
Một số mã ascii có tập bit thứ 7, tức là chúng cao hơn 64 so với giá trị bắt buộc, để tránh các ký tự điều khiển. Bởi vì bit này được loại bỏ bởi mặt nạ 819, điều này là không quan trọng, ngoại trừ khi giá trị C
là 3, gây ra sự chuyển giao. Điều này phải được sửa ở một nơi duy nhất (thay vì g
chúng ta phải sử dụng c
.)
Rev 0, phiên bản chưa được chỉnh sửa
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}
Đầu ra
111
121
222
423
433
433
455
465
665
675
677
778
888
998
a99
aa9
abb
abc
bbc
ccc
Giải trình
Từ giải pháp sau đây, tôi trừ đường cơ sở, đưa ra phần bù mà tôi lưu trữ dưới dạng dữ liệu. Đường cơ sở được tái tạo thành một số thập lục phân trong mã theo i/2*273
(273 thập phân = 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