Нижче описано два запропонованих рішення: Одне повне рішення питання, що вимагає багато байтів, і друге часткове рішення (вирішення лише частин N + N і N * N , вимагає лише 484 байти), кожен з яких має інший підхід і свій власний набір крутих хитрощів! :)
1. Повний розчин (810147050 байт)
Використовуючи TovTovTov(TOV='hi',SEP=','), TOVелементи не захищені від дублювання символів на місці (обидва "hihihi"і "hhiihhiihhii"мають три "hi"s в них, і все TovTovTovхвилює лише те, скільки TOVs з'явиться між SEPs).
Якби ми використовували 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=', '), на цей раз SEPs не застраховані від дублювання (у ньому ",, "все ще є лише одна ", "), тому наступне запропоноване рішення завжди буде мати 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 (кількість TOVs ( 1s) у кожній з 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, що є абсолютно іншою командою ("змінити лічильник програм на перше висказане значення з стек, якщо значення, яке випливає відразу після, є істинним ").