Twoim zadaniem jest pobranie listy argumentów, które są liczbami całkowitymi lub operatorami, i parsowanie ich w następujący sposób:
Obecny operator zaczyna się od +.
Za każdym razem, gdy zostanie znaleziony operator, aktualny operator zmieni się na niego.
Możliwe operatory to: „+”, „-”, „*”, „/” i „%”, które odpowiadają ich znaczeniom w języku C i większości języków.
Zachowywane jest działające rozwiązanie, które zaczyna się od 0.
Za każdym razem, gdy zostanie znaleziona liczba całkowita, rozwiązanie jest modyfikowane przez liczbę zależną od operatora; np. jeśli operatorem jest „/”, wówczas rozwiązanie jest dzielone przez liczbę.
Jeśli operacja spowodowałaby powstanie liczby mieszanej (tj. Dziesiętnej), należy ją przenieść z powrotem do liczby całkowitej (tzn. Przecinek dziesiętny należy odciąć).
Wyjście ostatecznego rozwiązania.
Na przykład:
Argumenty 5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14
skutkowałyby:
5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14
0 5 13 38 342 2052 4104 4000 1000 142 148 8 -> 8
Dane wejściowe będą w postaci argumentów wiersza polecenia lub funkcji lub równoważnych dla twojego języka.
Najkrótszy kod wygrywa!
%
wymawiasz znaczenia w C, masz na myśli dokładnie to samo, co w C, czy też jest w porządku, jeśli zaokrągla się w kierunku -inf zamiast 0?Odpowiedzi:
Pyth -
24232220 bajtów2 bajty zapisane dzięki @issacg i 1 dzięki @orlp!
Używa zmniejszania z podstawowym przypadkiem
0
i sprawdza, czy'
jest w repr, aby wykryć ciąg vs. int.Nie działa online, ponieważ używam pełnej wersji, która jest wyłączona online ze względów bezpieczeństwa. Zajmuje wejście od stdin na liście jako takie:
5, 8, 25, "*", 9, 6, 2, "-", 104, "/", 4, 7, "+", 6
.źródło
?
na.x
, ponieważ tylko blok else może zgłosić wyjątek, i zrobi to za każdym razem. Nie możeszK
już więcej korzystać .u.xsv++GbH&=bHG+\+QZ
, konkretnie.JavaScript (ES6) 53
Funkcja przyjmująca tablicę jako dane wejściowe.
Uruchom fragment w przeglądarce Firefox, aby go przetestować.
źródło
Julia,
8583 bajtówTworzy to nienazwaną funkcję, która akceptuje ciąg wejściowy i zwraca liczbę całkowitą.
Nie golfowany:
Naprawiono problem i zapisano 2 bajty dzięki Glen O.
źródło
o is not defined
kiedy próbujesz uruchomić tę funkcję na świeżo. Próbuje uruchomić funkcję „o = ifloor ...” w Main, a nie wewnątrz funkcji (patrz tutaj github.com/JuliaLang/julia/issues/2386 ). Czy mogę zasugerowaćs->(o=0;p="+";for i=split(s) isdigit(i)?o=eval(parse("ifloor($o$p$i)")):p=i;end;o)
?elisp, 101 bajtów
Po przekazaniu argumentów jako cytowanej listy: np
(c '(5 5 * 10))
Wersja z nowymi liniami:
źródło
CJam, 24 bajty
Jest to pełny program, który odczytuje dane wejściowe jako argumenty wiersza poleceń.
Aby wypróbować kod online na tłumacza CJam (która nie obsługuje argumenty wiersza poleceń), wymienić
ea
zlS/
odczytu z symulowanym stdin.Jak to działa
źródło
JavaScript, 85 bajtów
źródło
o+ +t
? i tak budujesz ciąg, nie musisz konwertować na liczbę. Co więcej,.forEach
nie ma miejsca w Code Golf: use.map
prompt(o="+",r=0).split(" ").forEach(t=>+t+1?r=+eval(r+o+ +t):o=t);alert(r)
-> 75 bajtów.Lua, 142 bajty
Nie golfowany:
źródło
PowerShell, 57 bajtów
bez golfa;
Jeśli zmienna niejawna w for-each jest operatorem, a nie liczbą, Wywołanie wyrażenia (POSH
eval()
) zakończy się niepowodzeniem, a status wykonania$?
będzie fałszywy.Podłoga w POSH jest nieporęczna -
$foo=[math]::floor($foo)
i$foo-=$foo%1
była najbardziej golfową alternatywą, jaką mogłem wymyślić.źródło
if
cyfry, ale zasadniczo tak samo. 89 bajtów$o="+";$r=0;$args-split'\s+'|%{if($_-match'^\d+$'){$r=iex $r$o$_;$r-=$r%1}Else{$o=$_}};$r
GNU Sed (z rozszerzeniem eval, + dc), 102
(Wynik obejmuje +1 za opcję -r sed.)
Przekształca wyrażenie wejściowe w odwrotną notację polską, a następnie używa go
dc
do oceny.Wyjście testowe:
źródło
CJam, 34 bajty
Wypróbuj online
Myślałem, że to będzie całkiem rozsądne. Ale nie byłem wystarczająco szybki, aby opublikować to, co najmniej na chwilę, jako najkrótszą odpowiedź CJam. :(
źródło
Python 3 -
131 bajtów129 bajtów121 bajtów116 bajtówDzięki Maltysen za wygolenie dwóch bajtów, Beta Decay za wygolenie 8 i Steven Rumbalski za zgolenie 5.
Próbuję wymyślić sposób na skrócenie długości instrukcji if, ale na razie wydaje się, że jestem tak golfistą, jak tylko mogę. Pobiera dane wejściowe jako listę.
źródło
int
z//1
in
i cytatu..split()
.Bash, 69
Działa to tylko z nieujemnymi liczbami całkowitymi - nie jest jasne w pytaniu, czy jest to w porządku, czy nie.
źródło
Groovy, 79 bajtów
Próbny:
Nie golfowany:
źródło
gcc (z ostrzeżeniami) 165 (jeśli koniec linii liczy się jako 1)
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:
źródło
Perl 5.10+, 52 bajty
Próbny:
(Pamiętaj, że
*
należy uciec z mojej powłoki, aby nie była interpretowana jako wzorzec globalny).Nie golfowany:
źródło
C #, 132
165 168bajtówTa funkcja zakłada, że dane wejściowe są prawidłowe. Jest to trudne dla C #, ponieważ nie ma
eval
odpowiednika.Dzięki edc65 za oszczędność 33 bajtów!
Wcięty dla przejrzystości.
źródło
?:
->int C(string[]a){int o=1,r=0,n;foreach(var b in a)n=int.TryParse(b,out n)?r=o<0?r%n:o<1?r*n:o<3?r+n:o<5?r-n:r/n:o=b[0]-42;return r;}
Ruby, 59 bajtów
Testowe uruchomienie:
źródło