Musisz napisać program oceniający ciąg znaków, który zostałby wprowadzony do kalkulatora.
Program musi zaakceptować wejście i wyjście prawidłową odpowiedź. W przypadku języków, które nie mają standardowych funkcji wejścia / wyjścia, możesz przejąć funkcje readLine
i print
.
Wymagania
- Nie używa żadnych funkcji „eval”
- Obsługuje liczby zmiennoprzecinkowe i liczby ujemne
- Obsługuje co najmniej operatorów +, -, * i /
- Obsługuje dane wejściowe zawierające jedną lub więcej spacji między operatorami a liczbami
- Ocenia wyrażenie od lewej do prawej
Najkrótszy program wygrywa. W przypadku remisu program, który został zgłoszony jako pierwszy, wygrywa.
Możesz założyć, że dane wejściowe są prawidłowe i mają poprawny format
Przypadki testowe
Wejście
-4 + 5
Wynik
1
Wejście
-7.5 / 2.5
Wynik
-3
Wejście
-2 + 6 / 2 * 8 - 1 / 2.5 - 18
Wynik
-12
code-golf
math
arithmetic
Kevin Brown
źródło
źródło
Odpowiedzi:
Ruby -
74696765 znakówźródło
b[0],b[1].to_f
można zastąpić|b|
z|b,c|
i wykorzystanieb,c.to_f
a.send(b,c.to_f)
użyja.send b,c.to_f
. To oszczędza char$<
zamiastARGF
Befunge -
37 x 5 = 18538 x 3 = 114 znakówJest to ograniczone do liczb całkowitych, ponieważ Befunge nie obsługuje zmiennoprzecinkowych.
Wyjaśnienie
Największą cechą wyróżniającą Befunge jest to, że zamiast być liniowym zestawem instrukcji, jak większość języków; jest siatką 2d instrukcji jednoznakowych, w których kontrola może płynąć w dowolnym kierunku.
Pierwsza
&
po prostu wprowadza pierwszą liczbę.v
A>
następnie przekierowanie sterowania do głównej ścieżki w drugim rzędzie.To wprowadza znak (
~
), powiela go (:
), wypycha zero na stos (0
), wyskakuje z górnych dwóch elementów i określa, czy drugi jest większy od pierwszego (`
jestem zaskoczony, że nie można użyć `` '', aby uzyskać kod backticks. ), odwraca prawdziwość górnego elementu (!
), a następnie idzie w prawo, jeśli wynosi zero, w przeciwnym razie (#v_
).Zasadniczo sprawdza, czy dane wejściowe
-1
nie reprezentują już danych wejściowych.Jeśli dane wejściowe były
-1
następnie zduplikowane wartości wejściowe są odrzucane ($
), górna część stosu jest wyprowadzana jako liczba całkowita (.
), a program jest zatrzymywany (@
).W przeciwnym razie podobny proces powtarza się w celu ustalenia, czy dane wejściowe są mniejsze lub równe spacji. Jeśli jest to spacja, kontrola spada, w przeciwnym razie kieruj w prawo.
Jeśli jest to spacja, to przekierowuje left (
<
); program halt (@
), output (.
) i prawe przekierowanie (>
) są pomijane za pomocą#
; ale odrzucenie jest wykonywane w celu usunięcia przestrzeni ze stosu. Wreszcie jest przekierowywany w celu rozpoczęcia następnego wykonania (^
).Jeśli nie była to spacja, ten sam proces jest używany do podziału, jeśli jest odpowiednio w
[+, *]
lub w[-, \]
prawo i w górę.Na
[+, *]
to jest podzielona w celu określenia, czy jest to+
albo*
. Jeśli+
jest skierowany w dół, to wprowadzana jest następna liczba (&
) i są one dodawane (+
), a następnie formant zawija się i zostaje przekierowany do głównej ścieżki dla następnego znaku. Jeśli*
następnie wpisze (&
) i mnoży (*
), wówczas bezpośrednio się zawija.Ponieważ
[-, \]
zaczyna się po prawej stronie po lewej stronie.#
„S pominąć znak po nich tak początkowa jest ścieżka"-"`_
, która określa, czy po prostu jest-
albo/
. Jeśli tak,/
to kontynuuje wprowadzanie (&
) i dzielenie (/
). Jeśli tak,-
to kieruje się w prawo, ponownie pomijając znaki, aby wykonać,&"-"$-
powodując wprowadzenie liczby (&
),-
znak jest wypychany na stos, a następnie odrzucany ("-"$
), a następnie obliczane jest odejmowanie (-
). Sterowanie jest następnie przekierowywane z powrotem do głównej ścieżki.źródło
Python 3, 105 bajtów
Zarządza czterema podstawowymi operacjami, ale dodawanie
^
lub kosztuje tylko 5 znaków%
.Pierwszeństwo operacji jest od lewej do prawej.
źródło
Python (156)
źródło
C -
168126 znakówźródło
Tcl 8.6,
5748 znaków.Dane wejściowe z argumentów:
Od Stdin (
6453 )Musisz użyć interaktywnej powłoki dla obu rozwiązań.
Traktuję wejście w formie listy (Tcl używa spacji jako separatora) podejmuje pierwszy element i przypisać go
a
, a potem chodzić na resztę, biorąc 2 elementy każdym razem, operator i drugi numer, należy zastosować operator na$a
i$b
i przypisać wynik doa
. Na koniec wynik jest wa
.źródło
lmap
więcforeach
jest to dobry zamiennik.Haskell:
124114 znakówRaczej prosta odpowiedź, wykorzystująca dopasowanie wzoru i proste stwierdzenie przypadku ciężkiego podnoszenia. Stosowanie:
źródło
((case m of{..})(read u)(read b))
możesz pisać((case m of{..}$read u)$read b)
, 2 znaki mniej.C:
111108 znakówSpełnia wszystkie wymagania, zastosowanie:
źródło
~scanf
może zastąpić+1
. Ponadto,c^45
->c%5
ic^42
->c%2
powinny działać.C ++ 0x
205203198194 znakówŁadnie sformatowany:
źródło
Perl (97)
czytać z argumentów
odczytać z wejścia
źródło
PostScript (145)
Kolejny wpis PostScript (dzięki luser droog do kopania golfów interesujących PostScript!):
Bez golfa:
źródło
Python - 308
Wersja do odczytu:
Przyjmuje wyrażenie jako argument wiersza poleceń, wyprowadzane na standardowe wyjście.
źródło
Postscriptum (340)
I trochę bardziej czytelny:
źródło
JavaScript (skompresowane 208 znaków)
Dla jasności jest to kod przed jego kompaktowaniem ( JS-Fiddle of it ):
Tutaj jest spakowany do 208 znaków ( JS-Fiddle tego ):
Ponieważ kończę linie średnikami, wszystkie usuwalne białe znaki zostały zignorowane do zliczania znaków, ale pozostawiono je dla przejrzystości.
źródło
Haskell - 124
Wynik zostanie zawinięty w
Maybe
monadęWymaga również importowania
<*>
zControl.Applicative
, ale import można wykonać poza kodem, więc mam nadzieję, że jest to dozwolone.źródło
DO#
(234)(231)(229)(223)(214)źródło
JavaScript (87 znaków)
źródło
Java 11, 151 (jako funkcja lambda)
Funkcja lambda pobierająca dane wejściowe typu String i wysyłająca liczbę zmiennoprzecinkową.
Wypróbuj online.
Java 11, 241 bajtów (jako pełny program z pytaniem o operacje we / wy)
Pełny program przechodzący przez ciąg STDIN i wysyłający do STDOUT.
Wypróbuj online.
Wyjaśnienie:
źródło
05AB1E , 30 bajtów
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Jeśli
eval
wbudowane było dozwolone, może to być alternatywne podejście ( 16 bajtów ):Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
To zmieniłoby się
"-2 + 6 / 2 * 8 - 1 / 2.5 - 18"
na"((((((-2)+6)/2)*8)-1)/2.5)-18"
przed użyciemeval
wbudowanego (użycie.E
bezpośrednio dałoby operatorowi pierwszeństwo*/
przed+-
, stąd konwersja z nawiasami jako pierwsza).źródło