W notacji przedrostkowej operator znajduje się przed argumentami, więc możesz sobie wyobrazić, że operator wywołuje next()
rekursywnie. W notacji infiksowej operator przechodzi między argumentami, więc możesz sobie wyobrazić to po prostu jako drzewo analizy. W notacji postfiksowej operator podąża za argumentami, więc możesz to sobie wyobrazić jako oparte na stosie.
W notacji dowolnej poprawki operator może iść w dowolne miejsce * . Jeśli pojawi się operator i nie ma wystarczającej liczby argumentów, operator czeka, aż będzie wystarczającej liczby argumentów. Aby sprostać temu wyzwaniu, musisz wdrożyć bardzo prosty ewaluator poprawek. (Pamiętaj, że anyfix to język rekreacyjny, który porzuciłem, z którym możesz się pobawić tutaj lub sprawdzić tutaj )
Będziesz musiał obsługiwać następujące polecenia:
(Arity 1)
- duplikować
- negatywny
(Arity 2)
- dodanie
- mnożenie
- równość: zwraca
0
lub1
.
Możesz użyć dowolnych pięciu symboli niebiałych dla tych poleceń. W celach demonstracyjnych użyję "
jako duplikatu, ×
jako zwielokrotnienia i +
jako dodatku.
W przypadku literałów wystarczy obsługiwać nieujemne liczby całkowite, ale Twój tłumacz musi być w stanie zawierać wszystkie liczby całkowite (w granicach (rozsądnych) liczb całkowitych twojego języka).
Rzućmy okiem na przykład: 10+5
. Pamięć powinna zachowywać się jak stos, a nie kolejka. Najpierw stos zaczyna się od []
, a lista operatorów w kolejce zaczyna się od []
. Następnie 10
ocenia się literał, który tworzy stos [10]
. Następnie operator +
jest oceniany, co wymaga dwóch argumentów. Jednak na stosie jest tylko jeden argument, więc staje się lista operatorów w kolejce ['+']
. Następnie 5
ocenia się literał, który tworzy stos [10, 5]
. W tym momencie operator '+'
może zostać oceniony, tak jak robi, tworząc stos [15]
i kolejkę []
.
Wynik końcowy powinien być [15]
za + 10 5
, 10 + 5
i 10 5 +
.
Rzućmy okiem na twardszej np 10+"
. Stos i kolejka zaczynają się jako []
i []
. 10
jest oceniany jako pierwszy, co tworzy stos [10]
. Następnie +
jest obliczany, co nie zmienia stosu (ponieważ nie ma wystarczającej liczby argumentów) i tworzy kolejkę ['+']
. Następnie "
jest oceniany. Może to zostać uruchomione natychmiast, dzięki czemu stos [10, 10]
. +
można teraz ocenić, aby stos stał się [20]
i kolejka []
. Ostateczny wynik to [20]
.
Co z kolejnością operacji?
Rzućmy okiem ×+"10 10
. Stos i kolejka zaczynają się jako []
:
×
: Stos pozostaje niezmieniony, a kolejka staje się['×']
.+
: Stos pozostaje niezmieniony, a kolejka staje się['×', '+']
."
: Stos pozostaje niezmieniony, a kolejka staje się['×', '+', '"']
.10
: Stos staje się[10]
. Mimo że×
powinien być pierwszym operatorem, który jest oceniany, ponieważ pojawia się jako pierwszy,"
może działać natychmiast i żaden z operatorów przed nim nie może, więc jest oceniany. Stos staje się[10, 10]
i kolejka['×', '+']
.×
można teraz ocenić, co powoduje, że stos[100]
i kolejka['+']
.10
: Stos staje się[100, 10]
, co pozwala+
na ocenę. Stos staje się[110]
i kolejka[]
.
Ostateczny wynik to [110]
.
Polecenia użyte w tych demonstracjach są zgodne z poleceniami języka anyfix; jednak ostatni przykład nie zadziała z powodu błędu w moim tłumaczu. (Oświadczenie: Twoje zgłoszenia nie będą wykorzystywane w tłumaczu Anyfix)
Wyzwanie
Wybierz zestaw 5 znaków innych niż cyfry i spreparuj dowolne znaki zgodnie z powyższymi specyfikacjami. Twój program może wyprowadzić pojedynczą tablicę lub zawartą w niej wartość; gwarantuje się, że stos wartości będzie zawierał tylko jedną wartość na końcu wykonania, a kolejka operatorów będzie pusta na końcu wykonania.
To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach.
Przypadki testowe
W tych przypadkach testowych duplikat jest "
, ujemny jest -
, dodawanie jest +
, mnożenie jest ×
, a równość jest =
.
Input -> Output
1+2×3 -> 9
1"+"+ -> 4
2"××" -> 16
3"×+" -> 18
3"+×" -> 36
123"= -> 1 ("= always gives 1)
1+2=3 -> 1
1"=2+ -> 3
1-2-+ -> -3
-1-2+ -> 3 (hehe, the `-1` becomes `+1` at the `-` rather than making the `2` a `-1`)
+×"10 10 -> 200 (after the 10 is duplicated (duplication is delayed), 10 + 10 is performed and then 20 * 10, giving 200)
Zasady
- Obowiązują standardowe luki
- Możesz wziąć oficjalnego tłumacza anyfix i zagrać w golfa, jeśli chcesz. Spodziewaj się, że okropnie przegrasz.
Dane wejściowe będą podawane jako ciąg, a dane wyjściowe jako tablica, jedna liczba całkowita, poza reprezentacją ciągu dowolnego z nich. Możesz założyć, że dane wejściowe będą zawierać tylko spacje, cyfry i 5 wybranych znaków.
* Nie aktualne
0
i 1
?
×+"10 10
do przypadków testowych lub innych przykładów, które 1) używają białych znaków i 2) opóźniają użycie zduplikowanego operatora (dwie rzeczy, których całkowicie pominąłem).