Нижче описано два запропонованих рішення: Одне повне рішення питання, що вимагає багато байтів, і друге часткове рішення (вирішення лише частин N + N і N * N , вимагає лише 484 байти), кожен з яких має інший підхід і свій власний набір крутих хитрощів! :)
1. Повний розчин (810147050 байт)
Використовуючи TovTovTov(TOV='hi',SEP=',')
, TOV
елементи не захищені від дублювання символів на місці (обидва "hihihi"
і "hhiihhiihhii"
мають три "hi"
s в них, і все TovTovTov
хвилює лише те, скільки TOV
s з'явиться між SEP
s).
Якби ми використовували SEP=', '
, вся програма буде захищена від дублювання символів (що круто, але не вирішить питання). Таким чином ми використовуємо SEP=','
.
Таким чином, програма "hihihi,hi"
, наприклад, компілюється в масив ints [3,1]
, тоді як "hhiihhiihhii,,hhii"
компілюється в [3,0,1]
і "hhiihhiihhii,,hhii"
до [3,0,0,1]
. Це означає, що самі команди не змінюють свого значення після дублювання, але загальна довжина змінюється при дублюванні символів. Рішення нижче запитує довжину програми і використовує це , щоб вирішити , потрібно чи друкувати N+N
, N*N
чи N^N
.
Пропоноване повне рішення як масив ints: [6, 12, 9, 18, 9, 142, 11, 38, 8, 9, 260, 11, 73, 8, 22, 75, 7, 10, 14, 3, 1, 22, 24, 18, 15, 8, 10, 16, 3, 1, 22, 24, 18, 15, 8, 10, 45, 16, 7, 22, 3, 1, 22, 24, 18, 15, 8, 22, 3, 1, 22, 24, 18, 15, 8, 25, 3, 1, 22, 24, 18, 15, 8, 48, 3, 1, 22, 24, 18, 15, 8, 277, 3, 1, 22, 24, 18, 15, 8, 3146, 3, 1, 22, 24, 18, 15, 8, 46677, 3, 1, 22, 24, 18, 15, 8, 823564, 3, 1, 22, 24, 18, 15, 8, 16777237, 3, 1, 22, 24, 18, 15, 8, 387420510, 3, 1, 22, 24, 18, 15, 8]
Як рядок, це досить довга програма, що складається з 810147050 символів, починаючи з:
hihihihihihi,hihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihih...
2. Розв’язування лише N + N і N * N частини запитання (484 байти)
Використовуючи TovTovTov(TOV='1',SEP=', ')
, на цей раз SEP
s не застраховані від дублювання (у ньому ",, "
все ще є лише одна ", "
), тому наступне запропоноване рішення завжди буде мати 33 команди, навіть після дублювання символів:
1111, 111111111111111111111111111111111111111111111111, 1111111111, 1111111111, 1111111111, 111111, 111111111111, 111111111, 11111111111111, 111, 1, 1111111111111111111111, 111111111111111111111111, 111111111111111111, 111111111111111, 11111111, 111111111111, 1111111111111111, 111111111111111, 1111111111111111111111, 111111111111111111111111111111111111, 11, 1111111111111111111111111111, 111111, 111, 111111, 11111111111, 111111111111111111111111111, 1111, 1, 11111111, 1, 11111111
Відповідний масив ints (кількість TOV
s ( 1
s) у кожній з 33 команд, наведених вище) такий:[4,48,10,10,10,6,12,9,14,3,1,22,24,18,15,8,12,16,15,22,36,2,28,6,3,6,11,27,4,1,8,1,8]
Копіювання символів на місці приводить до списку з 33 абсолютно різних команд :
[8,96,20,20,20,12,24,18,28,6,2,44,48,36,30,16,24,32,30,44,72,4,56,12,6,12,22,54,8,2,16,2,16]
Оригінальний Інтс масив (який обчислює N + N ) був розроблений ретельно , так що після того , як команди змінюють своє значення, програма по- , як і раніше має сенс, але обчислює N * N . Наприклад, перша 4
(що TovTovTov
розуміє як "трактувати наступну оп як код ascii для перетворення в символ") змінюється після дублювання символів на 8
, що є абсолютно іншою командою ("змінити лічильник програм на перше висказане значення з стек, якщо значення, яке випливає відразу після, є істинним ").