หนึ่งการมอบหมาย, 2075 (เหมาะสมที่สุด)
นี่ควรเป็นค่าที่ดีที่สุด (เว้นแต่ฉันจะมีข้อผิดพลาดใหญ่ในการให้เหตุผลหรือการทดสอบของฉัน sucks)
ก่อนอื่นเลย มีเพียง 7 หมายเลขที่แตกต่างกัน (mod 128) คุณสามารถแสดงเป็น 99 ค่าทั้งหมด 7 หรือมากกว่า 9 ประเมินเป็นหมายเลขเดียวกัน 71 (เพราะ 10 ^ 8 mod 128 == 0, 10 ^ 9 mod 128 == 0, ... )
หากหนึ่งใน 4 ค่าที่คุณสามารถแสดงออกด้วยจำนวนเก้าแม้การส่งออกจำนวนนี้เป็นทางออกที่ดีที่สุดอย่างชัดเจน
มิฉะนั้นฉันพยายามที่จะไปให้ถึงจำนวนที่มีหนึ่งคำสั่งมอบหมาย (มอบหมายให้ 99) และพิมพ์ 99 เพราะปรากฎขนาดโปรแกรมสูงสุดด้วยวิธีนี้คือ 22 ถ่าน การใช้ Goto ชัดเจนยิ่งกว่านั้นแน่นอน ความเป็นไปได้เพียงอย่างเดียวที่อาจมีการเอาชนะโซลูชันที่ได้รับมอบหมายเดียวคือโซลูชันที่มีสองการมอบหมาย ฉันทดสอบนี้ (หวังว่าจะไม่มีข้อผิดพลาดรหัสสำหรับสิ่งนี้ค่อนข้างยุ่ง) และไม่พบวิธีแก้ปัญหาสำหรับ ASCII char ใด ๆ
ดังนั้นการตรวจสอบเฉพาะหมายเลข 4 โดยตรงและวิธีการกำหนดหนึ่งเดียวควรเพียงพอที่จะค้นหาโซลูชันที่เหมาะสมที่สุด โปรแกรม Python (เข้ากันได้ 2 และ 3) ต่อไปนี้สร้างโปรแกรมทั้งหมดและสรุปความยาวของมัน ใช้วิธีการ IDA * แบบง่าย
from itertools import count
def nines_to_dec(nines):
return ((10**nines - 1) // 9) % 128
def shortest_representation(ascii_value):
# try simple output,
# max code length is 8, (8 nines == 10 nines == 12 nines == ...)
# if this works, than this is the shortest representation
for nines in range(2, 9, 2):
if nines_to_dec(nines) == ascii_value:
return "9" * nines
# otherwise try one assignment
for length in count(1):
result = assignment(ascii_value, length, [])
if result:
return "99 " + result + "\n99"
def assignment(value, left, nines_list):
if left == 0:
eval_numbers = [nines_to_dec(nines) for nines in nines_list]
if (sum(eval_numbers[::2]) - sum(eval_numbers[1::2])) % 128 == value:
return " ".join("9" * nines for nines in nines_list)
else:
return False
for nines in range(1, 8):
left2 = left - nines - 1 # -1 for space
if left2 >= 0:
result = assignment(value, left2, nines_list + [nines])
if result:
return result
return False
lengths = []
for i in range(128):
program =shortest_representation(i)
lengths.append(len(program))
print("ASCII-value: {}, ASCII-char: {}".format(i, chr(i)))
print(program)
print(sorted(lengths))
print(sum(lengths))
ผลลัพธ์เป็นรูปแบบต่อไปนี้:
....
ASCII-value: 65, ASCII-char: A
99 9 999999 9999999
99
ASCII-value: 66, ASCII-char: B
99 9 99 9999 99
99
ASCII-value: 67, ASCII-char: C
99 9 99 9 99 9999
99
....
คุณสามารถค้นหาผลลัพธ์ที่สมบูรณ์ได้ที่: http://pastebin.com/bKXLAArq
ถ่านกับโปรแกรมที่สั้นที่สุด (2 ถ่าน) เป็นvertical tab - 11
ที่มีความยาวโปรแกรมของ 2, ตัวอักษรที่มีโปรแกรมที่ยาวที่สุด (22 ถ่าน) เป็นและbell - 7
A - 65
ผลรวมสำหรับโปรแกรมทั้งหมดคือ 2075
และโดยวิธีการที่ผมใช้ล่าม k / q จาก tmartin ฉันหมวกค่อนข้างมีปัญหากับคนอื่น (Python, Perl, CJam) ไม่แน่ใจว่ามันเป็นความผิดของฉันหรือไม่