1つの割り当て、2075(最適)
これは最適な値である必要があります(推論に大きな誤りがない場合、またはテストで問題がある場合を除きます)。
まず第一に。99で表現できる7つの異なる数値(mod 128)のみがあります。7以上の9の値はすべて同じ数値71に評価されます(10 ^ 8 mod 128 == 0、10 ^ 9 mod 128 == 0、 ...)
4つの値のいずれかを9の偶数で表現できる場合、この数を出力することが明らかに最適なソリューションです。
それ以外の場合は、1つの割り当てステートメント(99に割り当て)で数値に到達して99を印刷しようとします。判明したように、このアプローチでの最大プログラムサイズは22文字です。明らかにGotoの使用にはそれ以上のものが必要です。1つの割り当てソリューションが破られる可能性がある唯一の可能性は、2つの割り当てを持つソリューションです。私はこれをテストし(うまくいけばエラーがなく、これのコードはかなり乱雑です)、ASCII文字の解決策は見つかりませんでした。
したがって、最適なソリューションを見つけるには、4つの直接番号と1割り当てアプローチをチェックするだけで十分です。次の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文字)のcharはvertical tab - 11
プログラムの長さが2で、最長のプログラム(22文字)のcharはbell - 7
and A - 65
です。
すべてのプログラムの合計は2075です。
ところで、私はtmartinのk / qインタープリターを使用しました。私は他の問題(Python、Perl、CJam)とのかなりのトラブルを嫌っています。それが私のせいだったかどうかはわかりません。