Perl 69 ไบต์
s;.;y/XVI60-9/CLXVIX/dfor$a[$_].="32e$&"%72726;gefor 1..100;print"@a"
ทำงานโดยใช้สูตรเวทย์มนตร์ นิพจน์"32e$&"%72726
แปลงค่าตัวเลขแต่ละตัวในลักษณะดังต่อไปนี้:
0⇒32, 1⇒320, 2⇒3200, 3⇒32000, 4⇒29096, 5⇒56, 6⇒560, 7⇒5600, 8⇒56000, 9⇒50918
หลังจากใช้การแปลy/016/IXV/
เรามีสิ่งนี้แทน:
0⇒32, 1⇒32 I , 2⇒32 II , 3⇒32 III , 4⇒29 I 9 V , 5⇒5 V , 6⇒5 VI , 7⇒5 VII , 8⇒5 VIII , 9⇒5 ฉัน 9 X 8
ส่วนที่เหลือของตัวเลข ( 2-57-9
) จะถูกลบออก หมายเหตุว่านี้อาจจะดีขึ้นโดยหนึ่งไบต์โดยใช้สูตรซึ่งแปล012
แทนการ016
ลดความซับซ้อนของการ/XVI60-9/
/XVI0-9/
ฉันไม่สามารถหามันได้ แต่บางทีคุณอาจจะโชคดีกว่า
เมื่อมีการแปลงหนึ่งหลักในลักษณะนี้กระบวนการจะทำซ้ำสำหรับตัวเลขถัดไปเพิ่มผลลัพธ์และการแปลXVI
s ก่อนหน้าเป็นCLX
พร้อมกันการแปลสำหรับตัวเลขใหม่จะเกิดขึ้น
อัปเดตการ
ค้นหาแบบละเอียดไม่ได้เปิดเผยอะไรที่สั้นลง อย่างไรก็ตามฉันพบโซลูชัน 69 ไบต์ทางเลือก:
s;.;y/XVI0-9/CLXIXV/dfor$a[$_].="57e$&"%474976;gefor 1..100;print"@a"
อันนี้ใช้การ0-2
แทนที่IXV
แต่มีโมดูโล่ที่ยาวกว่าหนึ่งหลัก
อัปเดต: 66 65 ไบต์
รุ่นนี้มีความแตกต่างอย่างเห็นได้ชัดดังนั้นฉันควรจะพูดสักสองสามคำเกี่ยวกับมัน สูตรที่ใช้จริงนานกว่าหนึ่งไบต์!
ไม่สามารถย่อสูตรให้สั้นลงกว่านี้ได้ฉันตัดสินใจตีกอล์ฟลงในสิ่งที่ฉันมี ไม่นานจนกระทั่งฉันจำเพื่อนเก่าของฉัน$\
ได้ เมื่อมีการprint
ออก$\
งบจะถูกผนวกเข้ากับส่วนท้ายของเอาต์พุตโดยอัตโนมัติ ฉันสามารถกำจัดสิ่ง$a[$_]
ก่อสร้างที่น่าอึดอัดใจสำหรับการปรับปรุงสองไบต์:
s;.;y/XVI60-9/CLXVIX/dfor$\.="32e$&"%72726;ge,$\=!print$"for 1..100
ดีขึ้นมาก แต่$\=!print$"
ก็ยังดู verbose เล็กน้อย จากนั้นฉันก็จำสูตรทางเลือกความยาวเท่ากันที่ฉันพบซึ่งไม่ได้มีตัวเลข3
ในการแปลงหลักใด ๆ ดังนั้นควรใช้$\=2+print
แทนและแทนที่ผลลัพธ์3
ด้วยช่องว่าง:
s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;ge,$\=2+print for 1..100
นอกจากนี้ยังมี 67 ไบต์เนื่องจากช่องว่างระหว่างความจำเป็นและprint
for
แก้ไข : สิ่งนี้สามารถปรับปรุงได้ทีละหนึ่งไบต์โดยเลื่อนprint
ไปทางด้านหน้า:
$\=2+print!s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;gefor 1..100
เนื่องจากการทดแทนจำเป็นต้องประเมินอย่างสมบูรณ์ก่อนprint
การมอบหมาย$\
จะยังคงเกิดขึ้นครั้งสุดท้าย การลบช่องว่างระหว่างge
และfor
จะออกคำเตือนการคัดค้าน แต่ไม่ถูกต้อง
แต่ถ้ามีสูตรที่ไม่ได้ใช้1
ทุกที่$\=2+print
ก็จะกลายเป็น$\=print
เงินออมสองไบต์ แม้ว่ามันจะยาวกว่าหนึ่งไบต์ แต่ก็ยังเป็นการปรับปรุง
เมื่อปรากฎว่ามีสูตรดังกล่าวอยู่ แต่มีความยาวมากกว่าหนึ่งไบต์หนึ่งไบต์ทำให้ได้คะแนนสุดท้าย65 ไบต์ :
$\=print!s;.;y/XVI60-9/CLXXI V/dfor$\.="37e$&"%97366;gefor 1..100
ระเบียบวิธี
คำถามที่ถูกถามว่าอาจจะมีการค้นหาสูตรดังกล่าว โดยทั่วไปแล้วการค้นหาสูตรเวทย์มนตร์เพื่อทำให้ชุดข้อมูลทั่วไปเป็นเรื่องของความน่าจะเป็น นั่นคือคุณต้องการเลือกรูปแบบที่น่าจะเป็นไปได้ที่จะสร้างสิ่งที่คล้ายกับผลลัพธ์ที่ต้องการ
การส่งเลขโรมันสองสามตัวแรก:
0:
1: I
2: II
3: III
4: IV
5: V
6: VI
7: VII
8: VIII
9: IX
มีระเบียบที่จะเห็น โดยเฉพาะตั้งแต่0-3และจากนั้นอีก5-8 คำแต่ละคำที่ต่อเนื่องจะเพิ่มขึ้นตามความยาวโดยหนึ่งตัวเลข ถ้าเราต้องการที่จะสร้างแผนที่จากตัวเลขการเลขที่เราต้องการที่จะมีการแสดงออกที่ยังเพิ่มความยาวโดยหนึ่งหลักสำหรับแต่ละระยะต่อเนื่อง ตัวเลือกเชิงตรรกะคือk • 10 dโดยที่dคือตัวเลขที่สอดคล้องกันและkคือค่าคงที่จำนวนเต็มใด ๆ
ใช้งานได้สำหรับ0-3แต่4ต้องแบ่งรูปแบบ เราสามารถทำอะไรที่นี่ตะปูบนโมดูโลคือ:
k • 10 d % mที่ม.เป็นบางระหว่างk • 10 3และk • 10 4 สิ่งนี้จะทำให้ช่วง0-3ไม่ถูกแตะต้องและแก้ไข4เพื่อไม่ให้มีสี่I
s หากเรา จำกัด การค้นหาอัลกอริธึมของเราเช่นนั้นสิ่งตกค้างแบบแยกส่วนของ5เราเรียกมันว่าjน้อยกว่าm / 1000นี่จะทำให้มั่นใจได้ว่าเราก็มีความสม่ำเสมอจาก5-8เช่นกัน ผลที่ได้คืออะไรเช่นนี้:
0: k
1: k0
2: k00
3: k000
4: ????
5: j
6: j0
7: j00
8: j000
9: ????
ในขณะที่คุณสามารถดูถ้าเราแทนที่0
ด้วยI
, 0-3และ5-8มีการรับประกันทั้งหมดที่จะแมปได้อย่างถูกต้อง! ค่าสำหรับ4และ9จำเป็นต้องบังคับให้เดรัจฉาน โดยเฉพาะอย่างยิ่ง4จำเป็นต้องมีหนึ่ง0
และหนึ่งj
(ตามลำดับที่) และ9ต้องมีหนึ่ง0
ตามด้วยหลักอื่น ๆ ที่ไม่ปรากฏที่อื่น แน่นอนว่ามีสูตรอื่น ๆ อีกจำนวนมากซึ่งความบังเอิญบังเอิญอาจทำให้เกิดผลลัพธ์ที่ต้องการ บางคนอาจจะสั้นกว่านี้ แต่ฉันไม่คิดว่าจะมีผู้ใดประสบความสำเร็จเท่าที่ควร
ฉันยังทดลองกับการทดแทนหลายครั้งI
และ / หรือV
ประสบความสำเร็จ แต่อนิจจาไม่มีอะไรสั้นไปกว่าสิ่งที่ฉันมีอยู่แล้ว นี่คือรายการโซลูชันที่สั้นที่สุดที่ฉันพบ (จำนวนโซลูชัน 1-2 ไบต์ที่หนักกว่ามากเกินกว่ารายการ):
y/XVI60-9/CLXVIX/dfor$\.="32e$&"%72726
y/XVI0-9/CLXIXV/dfor$\.="57e$&"%474976
y/XVI0-9/CLXIVXI/dfor$\.="49e$&"%87971
y/XVI0-9/CLXIIXIV/dfor$\.="7e$&"%10606 #
y/XVI0-9/CLXIIXIV/dfor$\.="7e$&"%15909 # These are all essentially the same
y/XVI0-9/CLXIIXIV/dfor$\.="7e$&"%31818 #
y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535 # Doesn't contain 3 anywhere
y/XVI60-9/CLXXI V/dfor$\.="37e$&"%97366 # Doesn't contain 1 anywhere