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:
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
źródło
+-<>
jakbyś poprosił:a
.
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.Odpowiedzi:
CJam,
6259 bajtówDzięki nhahtdh za oszczędność 3 bajtów.
Ponieważ nie ma wymogu dla żadnego konkretnego rozkładu, o ile każdy brak pojawi się z skończonym prawdopodobieństwem, możemy to bardzo uprościć, po prostu generując ciąg zawierający zrównoważoną liczbę
-+
i<>
, odpowiednio, testując, czy jest to NOP i sortując go, jeśli nie jest.Oczywiście w przypadku dłuższych danych wejściowych prawie zawsze spowoduje to posortowane dane wyjściowe, ale można przetestować kod za pomocą niektórych danych wejściowych,
8
aby przekonać się, że może on generować dowolny NOP o podanej długości.Wypróbuj online.
źródło
CJam,
118116 bajtówTo nieco wymknęło się spod kontroli ... zwłaszcza druga połowa wydaje się, że powinna być bardzo golfowa.
Sprawdź to tutaj.
To działa
N = 100
prawie natychmiast. Nie mam teraz czasu na napisanie pełnego podziału kodu, więc oto algorytm:<
i>
losowych (nawet) długości między0
iN
włącznie."<>><"
Staje się[0 '< -1 '> 0 '> 1 '< 0]
.N
.+-
ciąg do losowej pozycji.Gotowy. Jest to oparte na spostrzeżeniu, że:
<
i>
aby przywrócić głowicę taśmy do pierwotnej pozycji.Poprzez dystrybucję losowe ale zbilansowane ilości
+
s i-
s pomiędzy wszystkich miejscach, gdzie szef taśma jest na danej komórce, mamy pewność, że możemy znaleźć każdą możliwą NOP.źródło
Mathematica, 350 bajtów
Zbyt długo? Tak. Czy w ogóle mnie to obchodzi? Nie, dopóki ktoś inny nie opublikuje prawidłowej odpowiedzi.
źródło
+
.+
--
i<
->
parami, dopóki jeden dzieje się NOP. Połowę zajmuje prosty tłumacz BF.Python 3 , 177 bajtów
Wypróbuj online!
Użyłem kodu z odpowiedzi Bubblera do symulacji BF.
źródło
Python 3 , 163 bajty
Wypróbuj online!
Pełny program, który drukuje wyniki do STDOUT. Linia z kodem BF może być golfowa.
Przyjęła podejście Tyilo; jeśli wygenerowany kod BF nie jest NOP, odrzuć go całkowicie i wróć do
'+-'
powtarzania.źródło
JavaScript (Node.js) , 160 bajtów
Wypróbuj online!
źródło
Wolfram Language (Mathematica) , 224 bajty
Wypróbuj online!
Oto wersja bez gry w golfa (a raczej gry w golfa):
Najpierw wybrać losową liczbę
<
„s i>
” s do użytku, i wygenerować losowy listy z równą liczbą każda.Aby wypełnić pozostałe znaki, wybieramy pozycję, w której chcesz dodać
+
, a następnie znajdujemy pozycję, w której wskaźnik wskazuje na to samo miejsce i-
tam dodajemy .Powtarzaj, aż lista będzie miała długość
n
, i uszereguj wynik.źródło