Musisz ocenić ciąg napisany w odwrotnej notacji polskiej i wygenerować wynik.
Program musi zaakceptować dane wejściowe i zwrócić dane wyjściowe. W przypadku języków programowania, które nie mają funkcji do odbierania danych wejściowych / wyjściowych, można przyjąć funkcje takie jak readLine / print.
W programie nie wolno używać żadnego rodzaju „eval”.
Liczby i operatory są oddzielone co najmniej jedną spacją.
Musisz obsługiwać co najmniej operatorów +, -, * i /.
Musisz dodać obsługę liczb ujemnych (na przykład -4
to nie to samo, co 0 4 -
) i liczb zmiennoprzecinkowych.
Możesz założyć, że dane wejściowe są prawidłowe i są zgodne z powyższymi zasadami
Przypadki testowe
Wejście:
-4 5 +
Wynik:
1
Wejście:
5 2 /
Wynik:
2.5
Wejście:
5 2.5 /
Wynik:
2
Wejście:
5 1 2 + 4 * 3 - +
Wynik:
14
Wejście:
4 2 5 * + 1 3 2 * + /
Wynik:
2
~
. :-Peval
do analizowania liczb? Brzmi dość zepsuty. (O ile mi wiadomo, GolfScript jest jednym z takich języków. Myślę, że też jest zepsuty.)eval(s)
jest lepszy niżfloat(s)
Odpowiedzi:
Rubin -
9577 znakówPobiera dane wejściowe na standardowe wejście.
Kod testowy
daje
W przeciwieństwie do wersji C zwraca ostatni poprawny wynik, jeśli na wejściu pojawiają się dodatkowe liczby.
źródło
Python - 124 znaki
Python - 133 znaki
źródło
0
drugiego argumentu ...[a/b]
należy zastąpićb and[a/b]
przez, aby można było mieć 0 jako drugi argument.Schemat, 162 znaki
(Dodano podział linii dla zachowania przejrzystości - wszystkie są opcjonalne).
Wersja w pełni sformatowana (nie golfa):
Wybrany komentarz
`(,foo ,@bar)
jest taki sam, jak(cons foo bar)
(tzn. (efektywnie † ) zwraca nową listę z wcześniejfoo
dodanym dobar
), z tym wyjątkiem, że jest krótszy o jeden znak, jeśli spakujesz wszystkie spacje.W ten sposób możesz przeczytać klauzule iteracyjne, jeśli
(loop (cons token stack))
i(loop (cons ((cadr ass) (cadr stack) (car stack)) (cddr stack)))
to jest łatwiejsze dla twoich oczu.`((+ ,+) (- ,-) (* ,*) (/ ,/))
tworzy listę skojarzeń z symbolem+
powiązanym z procedurą+
i podobnie z innymi operatorami. Zatem jest to prosta tablica wyszukiwania symboli (puste słowa są(read)
w postaci symboli, dlatego dalsze przetwarzanie nietoken
jest konieczne). Listy asocjacyjne mają wyszukiwanie O (n), a zatem są odpowiednie tylko dla krótkich list, jak ma to miejsce w tym przypadku. :-P† Nie jest to technicznie dokładne, ale dla programistów spoza Lisp ma wystarczająco dobry pomysł.
źródło
lambda (ass)
+1 za wybór nazwy zmiennej: Pc - 424 niezbędny znak
Zakłada, że masz wystarczająco nową bibliotekę libc, aby dołączyć ją do pliku
getdelim
stdio.h. Podejście jest na wprost, całe dane wejściowe są odczytywane do bufora, następnie tokenizujemystrsep
i używamy długości i znaku początkowego, aby określić klasę każdego z nich. Nie ma ochrony przed złym wejściem. Podaj go „+ - * / + - ...”, a on z radością wyskoczy z pamięci „poniżej” stosu, dopóki nie zepsuje się. Wszyscy nie-operatorzy są interpretowani jakoatof
liczby zmiennoprzecinkowe, co oznacza wartość zerową, jeśli nie wyglądają jak liczby.Czytelne i skomentowane:
Uprawomocnienie:
Heh! Musisz w tym cokolwiek zacytować
*
...i mój własny przypadek testowy
źródło
case
je makro.Haskell (155)
źródło
s!(n:v)=case n of{"+"->(+)#s;"-"->(-)#s;"*"->(*)#s;"/"->(/)#s;_->(read n:s)}!v
uratuje 14 znaków.MATLAB -
158, 147(dane wejściowe są odczytywane z danych wejściowych użytkownika, dane wyjściowe drukowane).
Poniżej znajduje się kod wstępny i skomentowany, w zasadzie implementuje opisany algorytm Postfiksa (przy założeniu, że wyrażenia są poprawne):
Premia:
W powyższym kodzie, zakładamy operatorzy są zawsze binarny (
+
,-
,*
,/
). Możemy go uogólnić, używającnargin(f)
do ustalenia liczby argumentów wymaganych przez operand / funkcję, i odpowiednio wstawiamy odpowiednią liczbę wartości ze stosu, jak w:W ten sposób możemy ocenić wyrażenia takie jak:
gdzie
mean_of_three
jest funkcja zdefiniowana przez użytkownika z trzema danymi wejściowymi:źródło
Perl (134)
Następnym razem użyję rekursywnego wyrażenia regularnego.
Nie golfowany:
Myślałem, że F # to mój jedyny wymarzony język programowania ...
źródło
Windows PowerShell, 152
181192W czytelnej formie, ponieważ do tej pory są tylko dwie linie bez szansy na ich rozbicie:
30.01.2010 11:07 (192) - Pierwsza próba.
2010-01-30 11:09 (170) - Przekształcenie funkcji w blok skryptowy rozwiązuje problemy z zakresem. Po prostu sprawia, że każde wywołanie jest dwa bajty dłuższe.
2010-01-30 11:19 (188) - Nie rozwiązałem problemu z zakresem, przypadek testowy po prostu go zamaskował. Usunięto indeks z końcowego wyniku i usunięto zbędne dzielenie linii. I zmieniłem podwójnie na
float
.2010-01-30 11:19 (181) - Nie pamiętam nawet własnych rad. Rzutowanie na typ numeryczny można wykonać za pomocą jednego znaku.
2010-01-30 11:39 (152) - Znacznie zredukowane dzięki użyciu dopasowania wyrażenia regularnego w
switch
. Całkowicie rozwiązuje poprzednie problemy z zasięgiem podczas uzyskiwania dostępu do stosu, aby go pop.źródło
Rakieta 131:
Podziały linii są opcjonalne.
Na podstawie rozwiązania Chrisa Jester-Younga dla programu.
źródło
Python, 166 znaków
źródło
raw_input()
kodu nie jest podzielony na wiele wierszy.from operator import*
i wymienićo.div
zdiv
.Python 3, 119 bajtów
Wejście:
5 1 1 - -7 0 * + - 2 /
Wynik:
2.5
(W historii edycji można znaleźć 128-znakową wersję języka Python 2).
źródło
/
sznurka.ZeroDivisionError
gdy drugim operandem jest 0 (np5 0 +
.).ord(x) - 42
metody.JavaScript (157)
Ten kod zakłada, że istnieją dwie funkcje: readLine i print
źródło
prompt()
zamiastreadLine()
(i być możealert()
zamiastprint()
dopasowywaćprompt()
).Perl, 128
To nie jest tak naprawdę konkurencyjne obok innej odpowiedzi Perla, ale bada inną (nieoptymalną) ścieżkę.
Znaki liczone jako diff do prostego
perl -e ''
wywołania.źródło
Python, 161 znaków:
źródło
PHP,
439265263262244240 znakówTen kod powinien działać ze standardem, ale nie jest testowany ze standardem.
Został przetestowany na wszystkich przypadkach, dane wyjściowe (i kod) dla ostatniego są tutaj:
http://codepad.viper-7.com/fGbnv6
Bez golfa,
314330326 znakówźródło
flex - 157
Jeśli nie znasz, skompiluj
flex rpn.l && gcc -lfl lex.yy.c
źródło
Python, 130 znaków
Wyrzucilibyśmy 124 znaki
b and
(których brakuje niektórych odpowiedzi w języku Python). I zawiera 42!źródło
Python 3,
126132 znakiByły już lepsze rozwiązania, ale teraz, kiedy to napisałem (oczywiście bez uprzedniego przeczytania wcześniejszych zgłoszeń, oczywiście - chociaż muszę przyznać, że mój kod wygląda, jakbym je razem skopiował), chciałem się nim podzielić, zbyt.
źródło
b/a
należy zastąpića and b/a
, w przeciwnym razie to rozwiązanie nie będzie działać, jeśli drugim operandem jest 0 (np4 0 -
.).c99 gcc 235
To działa dla mnie (z ostrzeżeniami):
Ale jeśli kompilujesz go za pomocą mingw32, musisz wyłączyć globbing (patrz https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html ), kompilując w ten sposób:
Jeśli tego nie zrobisz *, zostanie automatycznie rozwinięty przez mingw32 CRT.
Czy ktoś wie, jak zmienić
break;case'*':s[--d]*=s[d+1];
się w makro, które akceptuje znak + jako parametr, ponieważ wtedy wszystkie cztery przypadki byłyby po prostuO(+)O(-)O(*)O(/)
źródło
C,
232229 bajtówZabawa z rekurencją.
Nie golfowany:
Przypadki testowe:
źródło
JavaScript ES7, 119 bajtów
Mam błąd ze zrozumieniem tablic, więc użyłem
.map
Wypróbuj online w ESFiddle
źródło
PHP - 259 znaków
Zakładając wejście w zmiennej POST i .
źródło
C # - 392 znaków
Jeśli jednak można użyć argumentów zamiast standardowego wejścia, możemy sprowadzić je do
C # - 366 znaków
źródło
Scala
412 376 349 335312:źródło
Python - 206
Wersja bez golfa:
Dane wejściowe z argumentu wiersza poleceń; wyjście na standardowe wyjście.
źródło
ECMAScript 6 (131)
Wystarczy napisać razem w ciągu kilku sekund, aby prawdopodobnie można było grać w golfa dalej, a może nawet lepiej. Mogę wrócić do niego jutro:
źródło
C # -
323284241Edycja: Zastąpienie stosu tablicą jest znacznie krótsze
Edycja2: Zastąpiono ifs wyrażeniem potrójnym
źródło
string[] i
=>string[]i
.Python 2
Wypróbowałem różne podejścia do tych opublikowanych do tej pory. Żadne z nich nie jest tak krótkie jak najlepsze rozwiązania w języku Python, ale mogą być interesujące dla niektórych z was.
Korzystanie z rekurencji, 146
Korzystanie z manipulacji listą, 149
Korzystanie
reduce()
, 145źródło
Matlab, 228
Nie golfowany:
źródło
;
. Więc myślę, że liczba bajtów jest taka samacr+lf
nowej linii, która składa się z 2 znaków. Mój notatnik ++ liczył 230 znaków w twojej wersji 3-liniowej, ale tylko 128, jeśli przykleję wszystko w jednym wierszu (usunąłem 2 * 2 = 4 znaki z 2 nowych linii i dodałem dwa;
). Spróbuj sam;)K5, 70 bajtów
Nie jestem pewien, kiedy K5 został wydany, więc to może się nie liczyć. Nadal wspaniały!
źródło