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
0lub1.
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 10ocenia 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 5ocenia 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 + 5i 10 5 +.
Rzućmy okiem na twardszej np 10+". Stos i kolejka zaczynają się jako []i []. 10jest 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
0i 1?
×+"10 10do 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).