Czas na wdrożenie mojego nowego języka opartego na stosie! Nazywa się StackyMath. Będzie to język oparty na stosie z 8 operacjami na stosie i sposobami dodawania liczb do stosu.
Lista operacji:
/
: Podział. Wykonywany na 2 najwyższych numerach stosu. Odkłada wynik z powrotem na stos.*
: Mnożenie. Wykonywany na 2 najwyższych numerach stosu. Odkłada wynik z powrotem na stos-
: Odejmowanie. Wykonywany na 2 najwyższych numerach stosu. Odkłada wynik z powrotem na stos+
: Dodawanie Wykonywany na 2 najwyższych numerach stosu. Odkłada wynik z powrotem na stos^
: Potęgowanie. Wykonywany na 2 najwyższych numerach stosu. Odkłada wynik z powrotem na stos%
: Modulo. Wykonywany na 2 najwyższych numerach stosu. Odkłada wynik z powrotem na stos!
: Factorial. Wykonywany na najwyższym numerze na stosie. Odkłada wynik z powrotem na stosD
: Zduplikuj najwyższy numer na stosie
Operacje zdefiniowane w pseudokodzie:
/
:push(pop divided by pop)
*
:push(pop times pop)
-
:push(pop minus pop)
+
:push(pop plus pop)
^
:push(pop to the pop)
%
:push(pop mod pop)
!
:push(factorial pop)
D
:t = pop; push(t); push(t)
Jak wypychać liczby na stos:
Dodawanie liczb do stosu jest łatwe, wystarczy umieścić nieprzetworzoną liczbę w swoim programie tam, gdzie jest to potrzebne. Jeśli musisz umieścić wiele liczb na stosie, możesz oddzielić je przecinkiem ( ,
). Twój program nie będzie musiał przetwarzać -
liczb na wejściu. Jeśli użytkownik chce taki numer, powinien wypchnąć liczbę, którą chce zanegować, zero i -
. Liczby na wejściu programu są również ograniczone do dodatnich liczb całkowitych.
Wejście:
Twój program powinien pobierać dane z wiersza poleceń lub ze standardowego wejścia. Dane wejściowe będą się składały tylko z liczb (bez notacji naukowej lub miejsc po przecinku), rozdzielonych według ,
potrzeb i operacji zdefiniowanych powyżej.
Wynik:
Twój program powinien wydrukować liczbę na górze stosu.
Przypadki błędów:
- Jeśli program spróbuje przesłonić stos, powinieneś wydrukować
StackUnderflowException!!!
. - Jeśli masz dzielenie przez zero, wydrukuj
DivisionByZeroException!!!
- Jeśli liczba przekraczająca 64 bity, podczas wykonywania programu lub przetwarzania liczby na wejściu, drukuj
NumberOverflowException!!!
- Jeśli jakoś dostaniesz liczbę ujemną na górze stosu i musisz zrobić silnię, wydrukuj
NegativeFactorialException!!!
- Jeśli masz liczbę zmiennoprzecinkową na górze stosu, a następna operacja jest silna, wydrukuj
FloatingFactorialException!!!
- Jeśli na wyjściu programu nie ma żadnych liczb (tzn. Program był pusty), wydrukuj
EmptyProgram!!!
Uwagi:
- Wszystkie dane wyjściowe błędów powinny otrzymać yo std err lub najbliższy odpowiednik.
- Wszystkie liczby są ograniczone do 64-bitowej liczby zmiennoprzecinkowej.
Przykładowe programy:
50,47* -> 2350
50,47/ -> 0.94
100,8! -> 40320
100D* -> 10000
! -> StackUnderflowException!!!
5,2/! -> FloatingFactorialException!!!
4,3!2*/ -> 3
654,489,48,43/5*7D+-*% -> 77.68749999999909
-> EmptyProgram!!!
(W razie potrzeby mogę dodać więcej)
źródło
!
naF
).654,489,48,43/5*7D+-*%
powinien wrócić77.6875
. (43/48*5-(7+7)
powinno być(7+7)-43/48*5
)Odpowiedzi:
Rubinowy,
412410404392380377 znakówJest to zwykła precyzyjna wersja używająca
Float
. Dokładność wyniku jest taka jak w kodzie przykładowym, ale numeryczne wykrywanie przelewu nie jest dokładne.Przykładowy przebieg:
Ruby,
378377 znakówJest to wersja o wysokiej precyzji używająca
Rational
. Precyzja wyniku nie zawsze jest taka sama jak w kodzie przykładowym, ale dokładna jest detekcja przepełnienia numerycznego.Przykładowy przebieg:
źródło
JavaScript (ES6), 430 bajtów
422 bajty w ES7 po zmianie
Math.pow(2,2)
na2**2
Wyjaśnienie
Używa,
eval
aby zastąpić niektóre popularne frazy. Bez golfa i bezeval
tego wygląda to tak:źródło
Math.pow(p(),p())
zp()**p()
.Groovy, 718 bajtów. Dziobowy!
Również mogę opublikować mój impl golfa. Poznaj moją wielką ścianę kodu:
Nie golfowany:
Edycja 1: zapisz ~ 15 bajtów dzięki @Doorknob
Edytuj 2: upuść ~ 130 bajtów z kilkoma dodatkowymi sztuczkami
źródło
for
/if
itd.System.in.text
zamiastSystem.in.newReader().readLine()
..text
jest zachłanny i dopóki dane w czytniku nie zostaną zwrócone.Cukierki ,
298348392 bajtówChociaż Candy opiera się na stosach, nie jestem pewien, czy to naprawdę pomogło ...
Nieco sformatowane ujawnia trochę struktury:
Rzeczywista matematyka występuje na dwóch ostatnich liniach. Jest tam napędzany przez stół skokowy w trzeciej linii.
źródło