Brain-Flak (skrzyżowanie Brainf ** k i Flak-Overstow) to ezoteryczny język oparty na stosach. Od czasu opublikowania tego wyzwania język ewoluował i był aktualizowany, ale ta pierwsza wersja języka znana jest jako „klasyczny flak mózgowy”.
Musisz napisać program lub funkcję, która pobiera ciąg klasycznego kodu Brain-Flak i ocenia go. Spowoduje to także przyjęcie (możliwej pustej) listy liczb całkowitych. Są dane wejściowe do klasycznego programu Brain-Flak.
Język
Brain-Flak ma dwa stosy, znane jako „lewy” i „prawy”. Aktywny stos zaczyna się od lewej. Jeśli pusty stos zostanie wysunięty lub zerknięty, zwróci 0. Nie ma żadnych zmiennych. Kiedy program się uruchamia, każde wejście jest wypychane do aktywnego stosu w kolejności (tak, aby ostatnie wejście było na szczycie stosu).
Jedynymi poprawnymi znakami w programie Brain-Flak są ()[]{}<>
i zawsze muszą być zrównoważone . Jeśli występują niepoprawne znaki lub niedopasowane są nawiasy, zachowanie jest niezdefiniowane. Wszystko jest ważne.
Istnieją dwa rodzaje funkcji: Nilady i Monady . Nilad to funkcja, która zajmuje 0 argumenty. Oto wszystkie nilady:
()
+1.[]
-1.{}
Pop aktywny stos.<>
Przełącz aktywny stos.
Są one łączone razem podczas oceny. Gdybyśmy mieli „3” nad aktywnym stosem, ten fragment kodu:
()(){}
oceniałby na, 1 + 1 + active.pop()
co ocenia na 5. <>
ocenia na 0.
Monady biorą jeden argument, kawałek kodu Brain-Flak. Oto wszystkie monady:
(n)
Naciśnij 'n' na aktywnym stosie.[n]
Drukuj 'n' jako int i nowy wiersz.{foo}
Podczas gdy active.peek ()! = 0, wykonaj foo. Ocenia się na 0¹.<foo>
Wykonaj foo, ale oceń go jako 0.
Funkcje te zwrócą również wartość w nich, więc
(()()())
Naciska 3 i
[()()()]
Wydrukuje 3, ale
[(()()())]
Wydrukuje i pchnie 3.
Po zakończeniu wykonywania programu każda wartość pozostawiona na aktywnym stosie jest drukowana jako liczba całkowita, z nową linią między. Wartości na drugim stosie są ignorowane.
Zasady:
Twój program musi obsługiwać liczby z zakresu (-128, 127) i wielkość stosu co najmniej 255. Jeśli obsługujesz większe, świetnie.
Niedopełnienie / przepełnienie jest niezdefiniowane.
Próbka IO:
Pusty program:
Dane wejściowe: brak
Wyjście: brak
Dodanie. Źródło:
({}{})
Wejście:
2, 3
Wynik:
5
Odejmowanie. Źródło:
({}<>){({}[])<>({}[])<>}<>
Wejście:
2, 3
Wynik:
-1
Mnożenie. Źródło:
({}<>)<>({}[]){({}[])<>(({}))<>}<>{({}<>{})<>}<>
Wejście:
7, 8
Wynik:
56
Fibonacciego. Źródło:
<>((()))<>{({}[])<>({}<>)<>(({})<>({}<>))<>}<>
Wejście:
5
Wynik:
13
8
5
3
2
1
1
{[({})]}
Obowiązują standardowe luki, a najkrótsza odpowiedź w bajtach wygrywa.
- ¹: To był właściwie błąd z mojej strony.
{...}
powinien ocenić sumę wszystkich swoich uruchomień, co jest IMO jedną z najfajniejszych cech uderzenia mózgu. Jednak na potrzeby tego wyzwania załóżmy, że wartość wynosi{...}
0.
źródło
{...}
ocenia monada ?{...}
wartość 0. Ponadto argumenty są wypychane w kolejności, więc2
są wypychane, a następnie3
wypychane, więc gdy program się uruchamia, drugie wejście (3
) znajduje się na górze stosu. Wyjaśnię oba w poście.Odpowiedzi:
Pip
-n
,15114810198 bajtówPobiera listę danych wejściowych jako argumenty wiersza polecenia i kod Brain-Flak z (linii) standardowego wejścia. Wypróbuj online!
Edycja: Oszczędź mnóstwo bajtów w porównaniu z moim oryginalnym podejściem, przechodząc na strategię tłumaczenia i ewaluacji.
Nie golfił i skomentował
Ta wersja zawiera również niektóre dane wyjściowe debugowania pokazujące kod Pip wynikający z tłumaczenia, a także zawartość stosu po wykonaniu.
źródło
Brain-Flak Classic ,
127112471239 bajtówWypróbuj online!
+4 bajty od naprawienia błędu z warunkiem w
{...}
monadzie i -36 bajtów z różnych pól golfowych.1238 bajtów kodu, +1 bajt dla
-a
flagi (którą można połączyć z flagą języka).To teraz ocenia się
{...}
jako zero według specyfikacji wyzwania. Zwróć uwagę, że sam Brain-Flak został oceniony{...}
jako suma wszystkich przebiegów od poprawki 7 maja 2016 dwa dni przed opublikowaniem tego wyzwania.Poniższy kod poprawnie interpretuje Brain-Flak Classic
{...}
jako sumę wszystkich przebiegów. Jedyną różnicą między dwoma tłumaczami jest umieszczenie jednego{}
nilada.Wypróbuj online!
Dane wejściowe (do dowolnego interpretera) to program Brain-Flak Classic do interpretacji, następnie nowa linia, a następnie rozdzielona spacjami lista liczb całkowitych. Na wejściu nie jest przeprowadzana walidacja. Nowa linia jest wymagana, nawet jeśli program lub dane wejściowe są puste.
Pierwszym krokiem jest parsowanie wszystkich danych wejściowych, zaczynając od nawiasów:
Następnie liczby całkowite są analizowane. Zwykle nie jest to wymagane, ale dane wejściowe zostały pobrane jako ASCII. Ma to jednak srebrną podszewkę: wprowadzanie tekstu pozwala nam określić wysokość stosu, co upraszcza rzeczy, gdy nie mamy dostępu do wysokości stosu nilad.
Liczby całkowite są parsowane na dwie liczby na drugim stosie: jeden dla wartości bezwzględnej i jeden dla znaku. Są one następnie przenoszone z powrotem na pierwszy stos.
Zinterpretowane stosy są przechowywane poniżej kodu na pierwszym stosie w następującej kolejności: bieżąca wysokość stosu, bieżąca wysokość stosu, inna wysokość stosu, inny stos. Wartość 0 dla drugiej wysokości stosu nie musi być w tym momencie wypychana, ponieważ będzie to domyślna wartość zero przy pierwszym czytaniu.
Reprezentacja kodu jest teraz przenoszona z powrotem na lewy stos. Aby ułatwić później, odejmujemy 4 od nawiasów otwierających niladów, aby każda operacja miała unikalną liczbę całkowitą od -1 do -8.
Główną częścią programu jest interpretacja instrukcji. Na początku każdej iteracji głównej pętli bieżąca instrukcja znajduje się na górze lewego stosu, wszystko po nim na tym samym stosie i wszystko przed nim na właściwym stosie. Zazwyczaj wyobrażam to sobie jako książkę otwartą na określoną stronę.
Po wyjściu z głównej pętli cały kod znajduje się na odpowiednim stosie. Jedyne rzeczy na lewym stosie to zero i dwa interpretowane stosy. Uzyskanie prawidłowego wyniku jest prostą sprawą.
źródło
{...}
, co jest poprawnym zachowaniem dla współczesnego flakera mózgu i (myślę) klasycznego flakera mózgu, jednak napisałem w wyzwaniu, które{...}
ocenia się na 0. Prawdopodobnie mógłbyś zagrać w znaczną liczbę bajtów usuwając tę funkcjonalność, chociaż dobrze byłoby zachować oryginał, ponieważ jest on technicznie ogólnie bardziej poprawny (po prostu niewłaściwy do tego wyzwania)APL,
255257 bajtówPobiera to program jako jego prawy argument, a dane wejściowe programu jako jego lewy argument, tj .:
Wersja bez golfa: tutaj .
źródło
APL (Dyalog Classic) , 146 bajtów
Wypróbuj online!
jeden klasyczny tłumaczący inny :)
źródło
Python 3, 429 bajtów
Używany jak
g('[{}{}]', 2, 3)
Służy
re.sub
do „kompilacji” źródła wyładowań mózgowych do Pythona, a następnie uruchamia go. (dla debuging wymienićexec
zprint
aby uzyskać listę kodu Pythona)Właściwe wcięcie zagnieżdżone podczas gdy pętle zjadają wiele bajtów w kodzie.
źródło
Python, 616 bajtów
Instrukcje:
[1,2,...]
formacie, a następnie naciśnij klawisz EnterZasadniczo program ten rekurencyjnie „kompiluje” kod Flake Brain w zagnieżdżone listy i rekursywnie interpretuje tę listę. Prawdopodobnie istnieje sposób na połączenie tych dwóch ...
Spróbuję przerobić logikę później.
źródło
Perl 5.6,
419414 bajtówGrałem trochę w golfa, ale prawdopodobnie istnieje możliwość poprawy. Nowe linie i zakładki dodane tutaj ze względu na odrobinę czytelności:
źródło
Python 2 ,
361, 348 bajtówWypróbuj online!
-13 bajtów zapisanych dzięki @Mr. Xcoder!
źródło