Одне завдання, 2075 р. (Оптимально)
Це повинно бути оптимальним значенням (якщо я не маю великих помилок в міркуванні або моє тестування відстійне).
Поперше. Є лише 7 різних чисел (мод 128), які можна виразити в 99. Усі значення 7 або більше 9 оцінюють на одне число 71. (Тому що 10 ^ 8 мод 128 == 0, 10 ^ 9 мод 128 == 0, ...)
Якщо одне з 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 char) має vertical tab - 11
програму довжиною 2, знаки з найдовшими програмами (22 char) є bell - 7
і A - 65
.
Сума за всіма програмами - 2075.
І до речі, я використовував інтерпретатор k / q від tmartin . Я маю досить багато неприємностей з іншими (Python, Perl, CJam). Не впевнений, чи то я винен.