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
źródło
0
i1
?×+"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).Odpowiedzi:
JavaScript (ES6),
204203200 bajtówZwraca liczbę całkowitą.
Użyte znaki:
+
: dodatek*
: mnożenie#
: równośćd
: duplikować-
: negatywnyPrzypadki testowe
Pokaż fragment kodu
Sformatowane i skomentowane
źródło
-1+-2
. Zwraca 3 zamiast -3.-
należy-1
natychmiast zastosować .-
byłby zgodny z tym,2
ponieważ przychodzi po innym operatorze. Być może @HyperNeutrino może to wyjaśnić. Operator ujemny może być niejednoznaczny w niektórych sytuacjach.JavaScript (ES6),
162152143150 bajtówNieznacznie nie golfista:
Wyjaśnienie
Używam
*
do mnożenia iR
duplikowania. Pozostałe operatory są takie same jak w pytaniu.N
staje się tablicą liczb (w tym duplikatów).replace
Obsługuje przypadek, w którym znak ujemny przychodzi po liczbie. Na przykład zmieni się1-
na- 1
i-1-
na- -1
.W ramach
eval
,s.match
tworzy tablicę operatorów binarnych. Pamiętaj, że zawsze będzie to miało o jeden element mniej niżN
.Wynikiem tej funkcji jest
eval
odwzorowanie liczb i operatorów.Oto, co jest
eval
edowane dla każdego z przypadków testowych:Operator przecinka w wyrażeniu JavaScript zwraca wynik ostatniego wyrażenia, więc
map
automatycznie zwraca użyteczne wyrażenie.+
Konieczna jest znak przedeval
zmieniaćtrue
się1
ifalse
do0
.Używanie
R
zarówno jako zmiennej, jak i duplikatu operatora znacznie upraszczamap
wyrażenia podrzędne.Przypadki testowe:
Pokaż fragment kodu
źródło
replace
działa zgodnie z przeznaczeniem. Spowoduje to powrót3
do-1+--2
i myślę, że1
byłoby poprawne (gdy1
zmienia się podpisać trzy razy zanim to drugi argument dla+
dostępny, w wyniku-1 + 2
).JavaScript,
321311 bajtówWypróbuj online!
Pięć znaków jest takich samych jak w pytaniu, z wyjątkiem
*
mnożenia.Skrypt jest kompresowany przy użyciu RegPack . Oryginalny skrypt jest przechowywany w zmiennej
_
po ocenie.źródło
-1+-2
. Zwraca 3 zamiast -3.-3
zamiast3
?-1 + -2
jest-3
, ale czy powinno się go parsować jak--1 + 2
zamiast tego?3
. Zanim2
jeszcze wejdzie na stos, drugi-
jest oceniany i dlatego mamy to,1 2 +
co rzeczywiście jest3
. Ach, i prawdopodobnie musisz również edytować swoją odpowiedź.Haskell , 251 bajtów
Wypróbuj online! Używa następujących znaków:
a
do dodawania,m
do mnożenia,q
do równości,D
do duplikowania iN
do negacji. (Chciałem użyće
dla równości, ale natknąłem się na problem, którylex
analizuje2e3
jako liczbę.) Przykład użycia:(#([],[])) "2a3 4m"
daje20
.źródło
Kod maszynowy 6502 (C64), 697 bajtów
Demo online
Użycie
sys49152
, a następnie wprowadź dowolne wyrażenie i naciśnij klawisz Return.*
, wszystkie inne, jak sugerowano.Oto czytelny kod źródłowy asemblera w stylu ca65 .
źródło
VB.NET (.NET 4.5)
615576 bajtów-39 bajtów dzięki Felixowi Palmenowi po zmianie
\r\n
na\n
Wymaga
Imports System.Collections.Generic
(uwzględniony w liczbie bajtów)Punktem wejściowym jest Funkcja
A
, która pobiera ciąg znaków jako dane wejściowe i zwraca aStack(Of Long)
.Symbolika:
+
*
=
-
d
Przegląd:
Funkcja
A
pobiera dane wejściowe i tokenizuje je. Używa aLong?
do wykonania sumy bieżącej dla liczb całkowitych wielocyfrowych, coNothing
oznacza, że obecnie nie czytamy liczb całkowitych.Podprogram
E
pobiera stos liczb całkowitych i kolejkę operatorów i ocenia notację poprawek. Wywołuje się rekurencyjnie, dopóki nie pozostaną żadne działania.Deklaruję globalne parametry naraz, aby zaoszczędzić bajty zarówno podczas przekazywania deklaracji, jak i parametrów.
Zwracana wartość z
A
jest ustawiana poprzez przypisanie wartości do dopasowanej zmiennejA
.VB
True
jest równoważne z-1
, więc operacja musi zanegować wynik, aby uzyskać poprawną wartość.Wypróbuj online!
źródło
Imports
, mam tylko bajt576
- czy mógłbyś przeliczyć?\r\n
zamiast\n
, więc tam jest rozbieżność.