Poniżej opisano dwa sugerowane rozwiązania: jedno pełne rozwiązanie pytania wymagające dużej liczby bajtów i drugie częściowe rozwiązanie (rozwiązanie tylko części N + N i N * N , wymagające tylko 484 bajtów), każde przyjmujące inne podejście i własne zestaw fajnych sztuczek! :)
1. Pełne rozwiązanie (810147050 bajtów)
Korzystanie TovTovTov(TOV='hi',SEP=',')
, te TOV
elementy są odporne na powielania znaków w miejscu (zarówno "hihihi"
i "hhiihhiihhii"
trzy "hi"
s w nich, a wszystko TovTovTov
troszczy się o to, jak wiele TOV
s pojawiają się między SEP
s).
Gdybyśmy użyli SEP=', '
, cały program byłby odporny na powielanie postaci (co jest fajne, ale nie rozwiąże pytania). Więc korzystamy SEP=','
.
"hihihi,hi"
Na przykład program kompiluje się do tablicy ints [3,1]
, podczas gdy "hhiihhiihhii,,hhii"
kompiluje się do [3,0,1]
i "hhiihhiihhii,,hhii"
do [3,0,0,1]
. Oznacza to, że same polecenia nie zmieniają swojego znaczenia po powieleniu, ale ogólna długość zmienia się wraz z powielaniem znaków. Poniższa rozwiązanie odpytuje długość programu i używa tego do zdecydować, czy drukować N+N
, N*N
lub N^N
.
Sugerowane pełne rozwiązanie, jako tablica ints, to: [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]
Jako ciąg jest to dość długi program, składający się z 810147050 znaków, zaczynający się od:
hihihihihihi,hihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihi,hihihihihihihihihi,hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihih...
2. Rozwiązywanie tylko części N + N i N * N pytania (484 bajty)
Używając TovTovTov(TOV='1',SEP=', ')
, tym razem SEP
s są odporne na duplikację ( ",, "
wciąż ma tylko jedną ", "
), więc następujące sugerowane rozwiązanie będzie zawsze zawierało 33 polecenia, nawet po duplikacji znaków:
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
Odpowiednia tablica ints (liczba TOV
s ( 1
s) w każdym z 33 powyższych poleceń) jest następująca:[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]
Powielenie znaków w miejscu daje listę 33 zupełnie różnych poleceń :
[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]
Oryginalny ints array (który oblicza N + N ) został zaprojektowany dokładnie tak, że po polecenia zmienić swoje znaczenie, program nadal ma sens, ale oblicza N * N . Na przykład pierwsza 4
(która TovTovTov
rozumie jako „traktuj następną operację jako kod ascii do konwersji na znak”) zmienia się po powieleniu znaku na 8
, co jest zupełnie inną komendą („zmień licznik programu na pierwszą wyskakującą wartość z stos, jeśli wartość pojawiła się bezpośrednio po wartości „prawda”).