Zeit für Sie, meine neue Stack-basierte Sprache zu implementieren! Es heißt StackyMath. Dies ist eine stapelbasierte Sprache mit 8 Operationen auf dem Stapel und Möglichkeiten, dem Stapel Zahlen hinzuzufügen.
Liste der Operationen:
/
: Einteilung. Wird auf den obersten 2 Nummern des Stapels ausgeführt. Schiebt das Ergebnis auf den Stapel zurück.*
: Multiplikation. Wird auf den obersten 2 Nummern des Stapels ausgeführt. Schiebt das Ergebnis auf den Stapel zurück-
: Subtraktion. Wird auf den obersten 2 Nummern des Stapels ausgeführt. Schiebt das Ergebnis auf den Stapel zurück+
: Ergänzung. Wird auf den obersten 2 Nummern des Stapels ausgeführt. Schiebt das Ergebnis auf den Stapel zurück^
: Potenzierung. Wird auf den obersten 2 Nummern des Stapels ausgeführt. Schiebt das Ergebnis auf den Stapel zurück%
: Modulo. Wird auf den obersten 2 Nummern des Stapels ausgeführt. Schiebt das Ergebnis auf den Stapel zurück!
: Fakultät. Wird auf der obersten Zahl des Stapels ausgeführt. Schiebt das Ergebnis auf den Stapel zurückD
: Dupliziere die oberste Zahl auf dem Stapel
Im Pseudocode definierte Operationen:
/
: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)
So legen Sie Zahlen auf den Stapel:
Das Hinzufügen von Zahlen zum Stapel ist ganz einfach. Geben Sie einfach die Rohzahl in Ihr Programm ein, wo Sie sie benötigen. Wenn Sie mehrere Zahlen auf den Stapel legen müssen, können Sie diese durch ein Komma ( ,
) trennen . Ihr Programm muss keine -
Zahlen in der Eingabe verarbeiten. Wenn der Benutzer eine will, muss er die zu negierende Zahl, Null und drücken -
. Zahlen in der Eingabe des Programms sind ebenfalls auf positive ganze Zahlen beschränkt.
Eingang:
Ihr Programm sollte die Eingabe in der Befehlszeile oder von std in übernehmen. Die Eingabe besteht nur aus Zahlen (keine wissenschaftliche Notation oder Dezimalstellen), die nach ,
Bedarf durch und die oben definierten Operationen begrenzt werden.
Ausgabe:
Ihr Programm sollte die Nummer oben auf dem Stapel drucken.
Fehlerfälle:
- Wenn das Programm versucht, den Stapel zu überladen, sollten Sie drucken
StackUnderflowException!!!
. - Wenn Sie eine Division durch Null haben, drucken Sie
DivisionByZeroException!!!
- Wenn eine Zahl größer als 64 Bit ist, drucken Sie sie, entweder während Sie das Programm ausführen oder wenn Sie eine Zahl in der Eingabe verarbeiten
NumberOverflowException!!!
- Wenn Sie auf irgendeine Weise eine negative Zahl oben auf dem Stapel haben und eine Fakultät erstellen müssen, drucken Sie
NegativeFactorialException!!!
- Wenn Sie eine Gleitkommazahl oben auf dem Stapel haben und die nächste Operation faktoriell ist, drucken Sie
FloatingFactorialException!!!
- Wenn sich beim Beenden des Programms keine Zahlen auf dem Stapel befinden (dh das Programm war leer), wird gedruckt
EmptyProgram!!!
Anmerkungen:
- Alle Fehler, die ausgegeben werden sollen, sollten "std err" oder ein gleichwertiges Ergebnis haben.
- Alle Zahlen sind auf 64-Bit-Gleitkommazahlen beschränkt.
Beispielprogramme:
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!!!
(Ich kann bei Bedarf weitere hinzufügen)
quelle
!
inF
).654,489,48,43/5*7D+-*%
sollte zurückkehren77.6875
. (43/48*5-(7+7)
sollte sein(7+7)-43/48*5
)Antworten:
Ruby,
412410404392380377 ZeichenDies ist eine reguläre Präzisionsversion
Float
. Die Ergebnisgenauigkeit ist wie im Beispielcode, die numerische Überlauferkennung ist jedoch nicht genau.Probelauf:
Ruby,
378377 ZeichenDies ist eine hochpräzise Version
Rational
. Die Ergebnisgenauigkeit ist nicht immer dieselbe wie im Beispielcode, aber die numerische Überlauferkennung ist genau.Probelauf:
quelle
JavaScript (ES6), 430 Byte
422 Bytes mit ES7 durch Ändern
Math.pow(2,2)
auf2**2
Erläuterung
Ersetzt
eval
bestimmte gebräuchliche Phrasen. Ungolfed und ohne daseval
sieht es so aus:quelle
Math.pow(p(),p())
durch zu ersetzenp()**p()
.Groovy, 718 Bytes. Vordergrund!
Kannst auch mein Gerät abschicken. Lernen Sie meine große Code-Mauer kennen:
Ungolfed:
Edit 1: speichere ~ 15 Bytes dank @Doorknob
Edit 2: lösche ~ 130 Bytes mit ein paar weiteren Tricks
quelle
for
/if
, usw.System.in.text
anstelle von verwendenSystem.in.newReader().readLine()
..text
ist gierig und solange Daten im Reader sind, werden sie nicht zurückgegeben.Candy ,
298348392 BytesObwohl Candy stapelbasiert ist, bin ich mir nicht sicher, ob das wirklich geholfen hat ...
Ein bisschen formatiert offenbart ein bisschen Struktur:
Die eigentliche Berechnung erfolgt in den letzten beiden Zeilen. Es wird dort von einem Sprungtisch in der dritten Zeile gefahren.
quelle