Wszystkie te zajęte bobry zrobiły niezły bałagan. Pisali po całej taśmie. Przy takim tempie nasz sąsiad przestanie pożyczać nam nieograniczone taśmy.
Potrzebujemy nowego sposobu gry w zajęty bóbr, który nie rujnuje każdej używanej taśmy.
Zasady
Tylko Brainfuck. Taśma pamięci jest nieograniczona na dwa sposoby. Instrukcja wejściowa zawsze będzie miała wartość , więc można jej użyć do skasowania wartości.
Limit 50 bajtów źródła.
Pod koniec wykonywania pamięć musi wynosić s.
Wynik to odległość między początkową lokalizacją wskaźnika pamięci a końcową lokalizacją - jeśli potrzeba instrukcji ruchu, aby przejść między nimi, twój wynik to . Wyżej jest lepiej. Podaj dokładną wartość, jeśli możesz, w przeciwnym razie podaj oszacowanie.n
Przykład
32 bajty,
-[-[[>]+>+[<]>-[[>]<+<+[<]>-]]>]
Wyjaśnienie
- Initialize the list to [255].
[ ] Repeat as long as the list is not empty.
[- ] Decrement the left end. We need to shrink the numbers so it ends eventually.
[ [ ] ] Skip if 0 already.
[ [[>] ] ] Move to the cell past the right end.
[ [ + ] ] Make this cell 1.
[ [ > ] ] Go right again.
[ [ + ] ] Make this cell 1. We've now appended [1, 1].
[ [ [<]> ] ] Go back to the first nonzero cell on the left.
[ [ - ] ] And decrement it.
[ [ [ ]] ] We will need to transfer the rest of the number from the left to the right, so keep looping.
[ [ [[>]< ]] ] Go to the last nonzero cell on the right.
[ [ [ +<+ ]] ] Increment this and the one on the left. These are the cells we appended earlier. We transfer to them.
[ [ [ [<]> ]] ] Go back to the first nonzero cell on the left, which we are transferring from.
[ [ [ -]] ] Decrement here on the left to balance out the incrementing on the right.
[ >] We end the iteration on a now empty cell. Move right, the new left end is there.
Zaczynamy od listy . Przy każdej iteracji konsumujemy wartość po lewej stronie listy, a jeśli , dodajemy po prawej stronie. Dołączone liczby są niższe niż oryginalne , więc będą się zmniejszać, dopóki nie osiągną , w którym to momencie są konsumowane bez rozwijania. Tak więc proces ostatecznie się kończy, a wszystkie s są w pamięci. Jednak na każdym kroku liczba kopii tej liczby podwaja się. Wynik tego programu zainicjowanego listą wynosi .n n > 1 [ n - 1 , n - 1 ] ( n - 1 ) ( n ) 1 0 [ n ] 2 n - 1
Ten przykład ma na celu pokazanie niektórych technik używanych przy tworzeniu zgłoszenia. Nie jest konkurencyjny ze względu na swój rozmiar.
Odpowiedzi:
A ( m , n ) A ( m , n )A tutaj jest sformułowanie Pétera-Ackermanna funkcji Ackermanna , podczas gdy inne wyrażenie partytury używa notacji Knutha w górę. 35-bajtową główną pętlę A(m,n) A(m,n)
[-[<+>>[-<[->+<]+>>]+<-]>[>]+[<]+<]
można wykorzystać do obliczenia poprzez umieszczenie na taśmie wartości i wprowadzenie pętli ze wskaźnikiem na komórce. Po zakończeniu pętli niezerową zawartością taśmy są zaczynające się bezpośrednio po prawej stronie wskaźnika.1 - m, m, 1 <n times>
m
Użyłem następującego programu Python do modelowania zachowania programu:
źródło
>
.