一份作业,2075(最佳)
这应该是最佳值(除非我在推理上有很大的错误或我的测试很糟糕)。
首先。您只能在99中表示7个不同的数字(mod 128)。所有7个或更多9的值都等于相同的数字71。(因为10 ^ 8 mod 128 == 0、10 ^ 9 mod 128 == 0, ...)
如果您可以用偶数个9来表示这4个值之一,那么输出该数字显然是最佳的解决方案。
否则,我将尝试使用一个赋值语句(将其赋值为99)得出该数字并打印99。事实证明,采用这种方法的最大程序大小为22个字符。显然,使用Goto肯定会花更多的钱。一个分配方案可能被击败的唯一可能性是有两个分配方案。我对此进行了测试(希望没有错误,此代码相当混乱),但没有找到针对任何ASCII字符的解决方案。
因此,仅检查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。
顺便说一下,我使用了tmartin的k / q解释器。我讨厌其他(Python,Perl,CJam)的麻烦。不知道这是否是我的错。