ทับทิม
Rev 3, 55bytes
i=1
'S, OJ1*$HCH(#%0'.bytes{|e|puts "%x"%i+=e*130&9011}
ในการพัฒนาเพิ่มเติมเกี่ยวกับแนวคิดของ Randomra ให้พิจารณาผลลัพธ์และตารางความแตกต่างด้านล่าง ตารางความแตกต่างสามารถบีบอัดได้เหมือนก่อนและขยายโดยการคูณด้วย 65 = ไบนารี 1000001 และใช้รูปแบบ 11001100110011 อย่างไรก็ตามทับทิมไม่สามารถคาดเดาได้ด้วยอักขระ 8 บิต (มันมีแนวโน้มที่จะตีความว่าเป็น Unicode)
น่าแปลกที่คอลัมน์สุดท้ายยังมีความเท่าเทียมกัน ด้วยเหตุนี้ในการบีบอัดข้อมูลเราจึงสามารถทำการเลื่อนสิทธิบนข้อมูลได้ สิ่งนี้ทำให้มั่นใจว่ารหัสทั้งหมดเป็น 7 บิต ASCII ในการขยายตัวเราเพียงคูณด้วย 65 * 2 = 130 แทน 65
คอลัมน์แรกยังมีความเท่าเทียมกัน ดังนั้นเราสามารถเพิ่ม 1 ในแต่ละองค์ประกอบ (32 ถึงแต่ละไบต์) ตามความจำเป็นเพื่อหลีกเลี่ยงอักขระควบคุมใด ๆ 1 ที่ไม่ต้องการถูกลบออกโดยใช้มาสก์ 10001100110011 = 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 บิตของเอนโทรปี
Rev 2, 58 ไบต์โดยใช้วิธีการเพิ่มเติมของ Randomra
i=0
'UPEIP@bPHPBETTEPRADT'.bytes{|e|puts "%x"%i+=e*65&819}
ในที่สุดสิ่งที่สั้นกว่าโซลูชันไร้เดียงสา วิธีการเพิ่มของ Randomra ด้วยวิธี bytepacking ของ Rev 1
Rev 1, 72 ไบต์, golfed เวอร์ชัน 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) เพื่อให้.A.B.C
เพื่อให้
รหัส ascii บางตัวมีการตั้งค่าบิตที่ 7 นั่นคือ 64 สูงกว่าค่าที่ต้องการเพื่อหลีกเลี่ยงอักขระควบคุม เนื่องจากบิตนี้ถูกลบโดย mask 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