Czasami pisząc kod pieprzony mózg, czujesz potrzebę wydłużenia go, aby zachęcić do debugowania. Mógłbyś to zrobić po prostu wsadzając ><
tam, ale co to za zabawa? Będziesz potrzebował czegoś dłuższego i mniej NOPey, aby zmylić każdego czytającego Twój kod.
Szybkie wprowadzenie do Brainfuck
Brainfuck jest ezoterycznym językiem programowania stworzonym w 1993 roku przez Urban Müllera i wyróżniającym się ekstremalnym minimalizmem. (Wikipedia)
Brainfuck to język oparty na ośmiu poleceń: +-><,.[]
. Kod jest uruchamiany na czymś takim jak maszyna Turinga: nieskończona taśma, na której można zmieniać wartości. W tym wyzwaniu skupimy się na pierwszych czterech:
+ increment the value at the pointer
- decrement the value at the pointer
> move the pointer right
< move the pointer left
NOP Brainfuck
NOP typu „brainfuck” to sekwencja postaci typu „brainfuck”, które po wykonaniu z dowolnego stanu nie prowadzą do zmiany stanu. Składają się z czterech wyżej wymienionych postaci.
Wyzwanie
Wyzwanie polega na napisaniu programu lub funkcji, która po uruchomieniu generuje losowy NOP o określonej długości.
Wkład
Otrzymasz jako dane wejściowe nieujemną liczbę całkowitą n
. (NOP są niemożliwe dla nieparzystych n
.)
Wydajność
Wyślesz losowy NOP pieprzony mózg o długości n
.
Zasady
- Definicja NOP: kiedy wyjście programu jest wstawiane w dowolnym punkcie programu do pieprzenia mózgu, zachowanie tego programu nie może się w żaden sposób zmieniać. Innymi słowy, nie może zmieniać stanu tłumacza.
- Zauważ, że na przykład
+>-<
jest niepoprawny, ponieważ zmienia wartości dwóch komórek bez zmiany ich z powrotem. Przed opublikowaniem sprawdź swoje rozwiązanie. - Zauważ też, że
+>-<->+<
jest to NOP, którego nie można zredukować do zera przez samo usunięcie><
<>
+-
-+
. Dlatego nie można użyć algorytmu, który po prostu wstawia je do siebie.
- Zauważ, że na przykład
- Każdy prawidłowy NOP długości
n
musi mieć niezerową szansę pojawienia się na wyjściu. Jednak rozkład nie musi być jednolity. - Interpretator, o którym mowa, ma podwójnie nieskończoną taśmę komórek o dowolnej precyzji. Oznacza to, że możesz iść w nieskończoność w obu kierunkach i zwiększać / zmniejszać każdą komórkę w nieskończoność.
- Program musi zakończyć się w ciągu 1 minuty dla
n
= 100 na moim komputerze, więc nie będzie generować wszystkich możliwych NOP i wybierać jednego. - Jeśli podano nieprawidłowe dane wejściowe (niecałkowite, ujemne, nieparzyste itp.), Możesz zrobić wszystko, co chcesz, w tym awarię.
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Przykłady
Oto wszystkie prawidłowe dane wyjściowe dla n
= 4:
++-- +-+- +--+ --++ -+-+ -++-
>><< ><>< ><<> <<>> <><> <>><
><+- ><-+ <>+- <>-+
>+-< >-+< <+-> <-+>
+><- -><+ +<>- -<>+
+->< -+>< +-<> -+<>
Oto kilka możliwych wyników dla n
= 20:
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
.
ma efekt uboczny, ,
zastępuje wartość, której nie można odzyskać bez użycia []
. Ale w []
końcu ustawi wartość na zero. To również nadpisuje wartość (więc potrzebowalibyśmy innej, []
aby ją odzyskać), chyba że możemy być pewni, że komórka, której dotyczy problem, na początku miała zero. Musielibyśmy jednak szukać takiej komórki z czymś podobnym [>]
i niemożliwe jest niezawodne powrót do pozycji, z której przyszliśmy.
+-<>
jakbyś poprosił:a