Pyth jest językiem golfowym opartym na Pythonie. Używa notacji przedrostkowej, przy czym każde polecenie ma inną aranżację (liczbę argumentów, które akceptuje).
Twoim zadaniem jest napisanie kontrolera składni dla (nieistniejącego) języka Pyth-a, Pith.
Składnia Pitha
Pith ma tylko 8 poleceń jednoznakowych:
01234()"
01234
każdy ma arity o odpowiedniej liczbie, a zatem oczekują, że za nim pojawi się wiele argumentów. Na przykład,
400010
jest poprawnym programem Pith, ponieważ 4
po nim następują cztery argumenty, 0
0
0
a 10
po ostatnim 1
następuje pojedynczy argument 0
. Aby to zwizualizować, możemy spojrzeć na następujące drzewo:
R
|
4
|
-------------
| | | |
0 0 0 1
|
0
gdzie R
jest węzeł główny. Alternatywnym sposobem myślenia o tym jest to, że każda liczba odnosi się do liczby dzieci odpowiedniego węzła w powyższym drzewie.
Oto kolejny prawidłowy program Pith, zawierający więcej niż jedno polecenie podstawowe:
210010
odpowiadającej
R
|
-------------
| |
2 1
| |
--------- 0
| |
1 0
|
0
Z drugiej strony,
3120102100
jest nie poprawna Program Pith ponieważ początkowa 3
ma tylko dwa argumenty, które widzimy, patrząc na drzewa poniżej:
R
|
3
|
------------------------ ??
| |
1 2
| |
2 ------
| | |
------ 1 0
| | |
0 1 0
|
0
Następnie (
rozpoczyna nieograniczony i )
kończy nieograniczony. Nieograniczony przyjmuje dowolną liczbę argumentów (zachłannie) i liczy się jako pojedynczy argument do dowolnej komendy nadrzędnej. Wszelkie niezwiązane nadal otwarte do końca programu są automatycznie zamykane. )
Polecenie nie jest błąd jeśli nie unboundeds są otwarte - po prostu nic nie robi *.
Na przykład program Pith
)31(0)0(201000100
odpowiada drzewu
R
|
3
|
------------------------------
| | |
1 0 (
| |
( -----------------------------
| | | | | |
0 2 0 0 1 0
| |
------- 0
| |
0 1
|
0
Puste niezwiązane są w porządku, podobnie ()
jak prawidłowy program Pith.
Niepoprawny program Pith z nieograniczonym jest
12(010
ponieważ 2
tylko jeden otrzymuje argument (bez ograniczeń).
Wreszcie "
rozpoczyna i kończy ciąg znaków, który zawsze ma wartość 0, i liczy się jako pojedynczy argument, np
2"010""44)()4"
który jest po prostu 2
przesłaniem dwóch argumentów łańcuchowych "010"
i "44)()4"
. Podobnie jak nieograniczone, łańcuchy mogą być również puste, a wszelkie niezamknięte łańcuchy do końca programu są automatycznie zamykane.
* Ta część różni się od oryginalnego Pytha, który faktycznie robi coś w takim przypadku 1)
, kończąc 1-arę i zgłaszając błąd.
Wejście wyjście
Dane wejściowe będą pojedynczym niepustym łańcuchem składającym się tylko z znaków 01234()"
. Opcjonalnie możesz założyć, że zawsze jest obecny dodatkowy znak nowej linii. Możesz napisać funkcję lub pełny program dla tego wyzwania.
Powinieneś wypisać prawdziwą wartość, jeśli dane wejściowe są poprawne pod względem składniowym Pith, lub wartość fałszowania w przeciwnym razie. Wartości prawdy i fałszu muszą być ustalone, aby nie można było generować danych wyjściowych1
dla jednego ważnego programu i 2
dla innego.
Punktacja
To jest golf golfowy, więc kod w najmniejszej liczbie bajtów wygrywa.
Przypadki testowe
Prawda:
0
)
(
"
()
""
10
400010
210010
("")00
3"""""
(0)))0)1)0
2(2(2(0)0)0)0
2"010""44)()4"
)31(0)0(201000100
())2)1))0"3())"))
3("4321("301(0)21100"4")"123"00)40"121"31000""01010
Falsy:
1
1(310
(1)0)
12(010
4"00010"
3120102100
20(2((0)(0)))
2(2(2(0)0)0)01)
4(0102)00)00000
2"00"("00"2(""))
źródło
[( [2 [0] [1 [0] ] ] [0] [1 [0]] [0] ]
? Ten, który masz, ma oddziały 2, 0, 0, 1 i 0 - drugi nie powinien tam być.())2)1))0"3())"))
(co, jak sądzę, powinno być prawdziwe).()210""
z wielomaOdpowiedzi:
CJam, 65 bajtów
Rety, chciałbym, żeby CJam miał Regex, można by to zrobić w mniej niż 50 bajtów
Główną ideą jest dalsze redukowanie rzeczy do
0
np.10
Do0
,200
do0
i tak dalej. Po wykonaniu tej czynności zmniejszamy wszystkie dopasowane nawiasy kwadratowe do0
, tj.()
Do0
,(0)
do0
,(00)
do0
itd. PowtarzamyL
czasy cyklu , gdzieL
jest długość wejściowa.Łańcuch wejściowy początkowo przechodzi dodatkowe przetwarzanie, w którym dostosowujemy niedopasowane
"
i dodajemy wiele,)
aby zrekompensować niedopasowane(
Zapewnia to, że po wszystkich iteracjach w łańcuchu pozostanie tylko
0
(i brak)
operacji).Aktualizacja - naprawiono błąd, w którym
)
brak działania na najwyższym poziomie jest uważany za szkodliwyRozszerzenie kodu
Wypróbuj online tutaj lub uruchom cały pakiet
źródło
Regex, smak PCRE, 83 bajty
Wypróbuj tutaj.
Regex, smak PCRE, 85 bajtów
Wypróbuj tutaj.
Wykorzystałem kilka pomysłów w odpowiedzi tego dan1111 .
Kilka wyjaśnień na temat
(?2)*(()(?1))?
.źródło
(?2)*(()(?1))?
jest ostatnim elementem układanki, którego szukałem. Niezłe znalezisko! ;)(?2)*(()(?1))?
część,(()(?1))?
część nigdy niczego nie pasuje, ponieważ(?2)*
zjada już wszystko, co(()(?1))?
może się zgadzać, a ta konstrukcja służy do ustawiania grupy przechwytywania 3, gdy wchodzimy(
i rozbrajania grupy przechwytywania 3, gdy jesteśmy poza()
konstrukcją (aby umożliwić dopasowanie niesparowany)
).Lex, 182 bajty (157 w / stos o stałym rozmiarze)
Programy te wymagają, aby dane wejściowe stanowiły ciąg prawidłowych znaków zakończony znakiem nowej linii.
Powyższy program ulegnie awarii, jeśli zabraknie mu pamięci, co teoretycznie może się zdarzyć, jeśli dasz mu wystarczająco dużo
(
. Ale ponieważ segfault liczy się jako porażka, traktuję to jako „falsey”, chociaż opis problemu nie mówi, co zrobić, jeśli zasoby nie są wystarczające.Zmniejszyłem go o 157 bajtów, używając stosu o stałej wielkości, ale wydawało się, że to oszustwo.
Kompilować:
Test:
Wyjście testowe:
źródło
80386 Asembler, 97 bajtów
Zrzut szesnastkowy:
Przebiega to raz przez dane wejściowe, wypychając liczby większe niż zero na stos i zmniejszając je, gdy przetwarzane jest zero. Nieograniczone są przetwarzane jako -1.
Prototyp funkcji (w C) (funkcja zwraca 0, jeśli jest niepoprawna i 1, jeśli jest poprawna):
Równoważny zespół (NASM):
Do testowania GCC w systemie POSIX można użyć następującego kodu w C:
źródło
Python 2, 353 bajtów
Funkcja parsowania krok po kroku przechodzi przez tokeny i buduje drzewo struktury programu. Nieprawidłowe programy wywołują wyjątek, który powoduje wydrukowanie zera (Falsy), w przeciwnym razie pomyślne parsowanie spowoduje powstanie jednego.
Wynik testów pokazujących dane wyjściowe analizatora składni:
Kod przed minifikatorem:
źródło
==
w testach - umieszczenie ciągów na pierwszym miejscu oznacza, że możesz to zrobićif')'==q
. Wierzę, że jedno zbreak
oświadczeń można zastąpićf=0
, ponieważ to również wydostanie się zwhile f
pętli. Wreszcie, zamiastassert x==y
możesz użyć1/(x==y)
doZeroDivisionError
. ;)Pip ,
8872 bajtówPomysł zaczerpnięty z CJam Optimizera . Mój pierwotny problem z parserem rekurencyjnego zniżania był ... raczej dłuższy.
Sformatowane z wyjaśnieniem:
Ciekawe sztuczki:
0X,5
na przykład jest0 X [0 1 2 3 4] == ["" "0" "00" "000" "0000"]
.R
operator eplace mógł pobrać listę dla dowolnego z argumentów: na przykład"abracadabra" R ["br" "ca"] 'b
dajeababdaba
.z
Tutaj dobrze wykorzystuję tę funkcję .""
, pustą listę[]
i każdy skalar, który jest równy zero. Tak więc0
jest fałszywe, ale także0.0
i"0000000"
. Ta funkcja jest czasami niewygodna (aby sprawdzić, czy łańcuch jest pusty, należy przetestować jego długość, ponieważ"0"
jest również fałszywy), ale w przypadku tego problemu jest idealny.źródło
JavaScript (ES6),
289288285282278244241230 bajtówźródło