To wyzwanie zostało opublikowane w ramach wyzwania LotM z kwietnia 2018 r
Brain-Flak to język Turinga-Tarpona, który zyskał całkiem sporo sławy tutaj na PPCG. Pamięć języka składa się z dwóch stosów, ale „ukryty” trzeci stos został odkryty przez Wh e at Wizard , co prowadzi do kilku nowych interesujących sposobów myślenia o programach Brain-Flak.
A co powiesz na zwiększenie widoczności tego słabego ukrytego trzeciego stosu? Stwórzmy język, w którym trzeci stos ma takie uznanie, na jakie zasługuje! Tutaj przedstawiam wam Trzeci Flak .
Język
W Third-Flak jest tylko jeden stos, zwany trzecim stosem. Operatorzy pracują na trzecim stosu w ten sam sposób, co robią w Brain-Flak, ale tutaj nie ma []
, {}
, <>
nilads i nie {...}
monada (więc tylko dopuszczalne znaki w programie innej Flak są ()[]<>
). Oto, co robi każdy operator (podane zostaną przykłady reprezentujące trzeci stos z listą, w której ostatni element jest na górze stosu):
()
jest jedynym dwuznakowym operatorem w Third-Flak. Zwiększa górę trzeciego stosu o 1. Przykład:[1,2,3]
→[1,2,4]
(
,[
,<
: Wszystkie nawiasy otwierające, które nie zostały objęte poprzednim przypadku naciskasz0
do trzeciego stosie. Przykład:[1,2,3]
→[1,2,3,0]
)
wyskakuje dwa elementy z trzeciego stosu i odsuwa ich sumę. Przykład:[1,2,3]
→[1,5]
]
wyskakuje dwa elementy z trzeciego stosu i odsuwa wynik odejmowania pierwszego od drugiego. Przykład:[1,2,3]
→[1,-1]
>
wyskakuje element z trzeciego stosu. Przykład[1,2,3]
→[1,2]
A oto inne zasady języka:
Na początku wykonywania trzeci stos zawiera tylko jedno 0.
Zabronione jest posiadanie pustego
[]
lub<>
wewnątrz programu (i tak byłyby noops, jeśli podążałyby za semantyką Third-Flak, ale w rzeczywistości mają inne znaczenie w Brain-Flak, którego nie można tutaj odtworzyć).Nawiasy zawsze muszą być zrównoważone, z wyjątkiem faktu, że na końcu programu mogą brakować końcowych nawiasów zamykających. Na przykład
[()<(()
jest to poprawny program Third-Flak (a trzeci stos na końcu programu byłby[1,0,1]
).Program może zawierać tylko sześć dozwolonych znaków
()[]<>
. Programy z pewnością nie będą puste.
Uwaga: poprzednie zasady sugerują, że nie będziesz musiał radzić sobie z sytuacjami, w których musisz wyskoczyć z pustego stosu.
Wyzwanie
Proste, napisz interpretera dla Third-Flak. Twój program musi przyjąć jako dane wejściowe program Third-Flak i zwrócić jako wynik stan trzeciego stosu na końcu programu.
Twój format wyjściowy jest elastyczny, o ile możliwe jest jednoznaczne odczytanie z niego stanu trzeciego stosu, a ten sam numer jest zawsze kodowany w ten sam sposób (Jest to tylko sposób na stwierdzenie, że każdy format wyjściowy, który nie jest rażący próbować oszukiwać jest w porządku).
Twój wybór danych wyjściowych może ograniczyć zakres liczb, którymi możesz zarządzać, pod warunkiem, że nie będzie to trywialne wyzwanie (ponieważ byłaby to domyślna luka ).
Przypadki testowe
Dla każdego przypadku testowego pierwszym wierszem jest wejście, a drugim wierszem stos wyjściowy reprezentowany jako lista liczb oddzielona spacjami, gdzie góra stosu jest ostatnim elementem.
[()<(()
0 1 0 1
[((((()()()()()))
0 0 0 5
((([()][()][()])))
-3
[<<(((()()()())(((((
0 0 0 0 0 4 0 0 0 0 0
[()]<(([()])><[()]
-1 0 -1
(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(())(())(()())(())(())(())(()())(()()()())(())(()()()()())(()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(())(())(()())(())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(())(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(()()())(())(()()())(())(())(())(()())(()()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(())(())(())(()()())(())(())(())(()())(())(()())(()()()())(())(())(()()()()())(()())(()())(())(()()())(())(())(())(())(()()())(()())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(()()()()())(())(()()())(())(())(()())(())(()()()()())(())(()()()()())(())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()()()())(())(()()()()())(())(())(())(()())(())(()()()()())(())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()()()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(())(()())(()()()())(())(())(()())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(()()())(())(())(()())(())(())(()()()()())(()()()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(()()()())(()()()())(()()
718 2
[()]
łamie zasadę, że nie musimy się martwić wyskakiwaniem z pustego stosue
jest tutaj .Odpowiedzi:
Brain-Flak , 276 bajtów
Wypróbuj online!
Musiałeś wiedzieć, że to nadchodzi.
źródło
Retina 0.8.2 ,
644846 bajtówWypróbuj online! Wysyła stos od dołu do góry. Działa tylko z nieujemnymi liczbami całkowitymi, a ostatni przypadek testowy jest zbyt wolny, więc link zawiera tylko trzy przypadki testowe. Objaśnienie: Stos domyślnie poprzedza program, więc zaczyna się jako pusty ciąg znaków, który reprezentuje pojedyncze zero.
()
Nilad zostaje przekształcony w_
których stosuje się liczyć w jednoskładnikowa, natomiast pozostałe wsporniki otwarte są włączone do nowej linii, które popychają zero na stosie, ponieważ są one spotkaliśmy. Nawiasy zamykające są następnie przetwarzane pojedynczo, aby stos był poprawny;)
usuwa poprzedniego przełamane, dodając dwie górne elementy łącznie,]
usuwa element górny i dopasowuje się od poprzedniego elementu w stosie tak odejmując i>
po prostu usuwa górny element. Na koniec stos jest konwertowany na dziesiętny. Edycja: Zapisano 2 bajty dzięki @Leo.źródło
$3
za? (w każdym razie świetna odpowiedź!)Python 3 ,
145 144 132 122 116 109104 bajtów-7 bajtów dzięki Leo!
I - 5 dzięki Lynn!
Wypróbuj online!
Całkiem standardowe wdrożenie.Teraz jednak nie tak czytelny. Jestem rozczarowany, że nie mogłem znaleźć krótszego sposobu na sprawdzenie między nawiasami początkowymi i końcowymi.Niektóre próby wprowadzenia jednej linii:
124 bajty (funkcja anonimowa):
115 bajtów (pełny program):
Append jest irytująco dłuższy niż zwykłe przypisanie
źródło
~-']>)'.index(i)
można(2-ord(i)%5)
zapisać 4 bajty.Ruby ,
9891 bajtówWypróbuj online!
Mój początkowy kod działał podobnie w duchu do odpowiedzi Pytona Jo Kinga, więc przed zapętleniem znaków źródłowych zastąpiliśmy wszystkie
()
podciągi innym znakiem, jako odrębnym operatorem.Jednak przynajmniej w Ruby okazało się, że golfista tego nie robi, ale raczej wybrał nieco bardziej kłopotliwe podejście. W tym przypadku utrzymujemy dodatkowy indeksator, który
i
śledzi naszą pozycję w łańcuchu źródłowym, i za każdym razem, gdy napotkamy nawias otwierający, sprawdzamy, czy nasze bieżące + następne znakis[i,2]
tworzą()
operator. W takim przypadku wciskamy 1 zamiast 0 na stosie i pozwalamy zamknięciu)
wykonać swoją pracę w następnym kroku.źródło
05AB1E , 25 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
SOGL V0.12 , 34 bajty
Wypróbuj tutaj!
źródło
R ,
182177 bajtówWypróbuj online!
Zwraca stos, w którym górna część stosu jest pierwsza, a spód stosu ostatnia.
Zamienia
()
z,7
a następnie oblicza punkty kodowe mod 8, aby uzyskać wyraźne wartości liczbowe, które są łatwiejsze i bardziej golfowe w obsłudze niż łańcuchy.Golfier pracuje z początkiem wektora w R, więc konstruujemy stos w ten sposób.
Następnie widzi znak „
)
lub”k==1
i dodaje dodatkowe zero na górze stosu, ponieważ golfista może go dodać i usunąć.źródło
CJam , 29 bajtów
Wypróbuj online!
źródło
Cejlon,
285266 bajtówWypróbuj online!
(Zapisano 19 bajtów dzięki sugestii Leo.)
Sformatowane i skomentowane:
Wypróbuj online!
źródło