Sie müssen ein Programm schreiben, um eine Zeichenfolge auszuwerten, die in einen Taschenrechner eingegeben werden würde.
Das Programm muss Eingaben akzeptieren und die richtige Antwort ausgeben. Für Sprachen, die keine Standard-Eingabe- / Ausgabefunktionen haben, können Sie die Funktionen readLine
und übernehmen print
.
Bedarf
- Verwendet keine Art von "Auswertungs" -Funktionen
- Kann mit Fließkomma- und negativen Zahlen umgehen
- Unterstützt mindestens die Operatoren +, -, * und /
- Kann Eingaben verarbeiten, die ein oder mehrere Leerzeichen zwischen Operatoren und Zahlen enthalten
- Wertet den Ausdruck von links nach rechts aus
Das kürzeste Programm gewinnt. Bei einem Gleichstand gewinnt das zuerst eingereichte Programm.
Sie können davon ausgehen, dass die Eingabe gültig ist und dem richtigen Format folgt
Testfälle
Eingang
-4 + 5
Ausgabe
1
Eingang
-7.5 / 2.5
Ausgabe
-3
Eingang
-2 + 6 / 2 * 8 - 1 / 2.5 - 18
Ausgabe
-12
code-golf
math
arithmetic
Kevin Brown
quelle
quelle
Antworten:
Ruby -
74696765 Zeichenquelle
b[0],b[1].to_f
können Sie ersetzen|b|
mit|b,c|
und Verwendungb,c.to_f
a.send(b,c.to_f)
Verwenden Sie stattdessena.send b,c.to_f
. Es spart eine char$<
anstelle vonARGF
Befunge -
37 x 5 = 185,38 x 3 = 114 ZeichenDies ist auf Ganzzahlen beschränkt, da Befunge keine Gleitkomma-Unterstützung bietet.
Erläuterung
Das größte Unterscheidungsmerkmal von Befunge ist, dass es sich nicht wie bei den meisten Sprachen um einen linearen Befehlssatz handelt. Es ist ein 2D-Raster mit Einzelzeichenanweisungen, bei denen die Steuerung in jede Richtung fließen kann.
Der erste gibt
&
einfach die erste Zahl ein. Das Steuerelementv
und>
leiten dann auf den Hauptpfad in der zweiten Zeile um.Dies gibt ein Zeichen ein (
~
), dupliziert es (:
), legt eine Null auf den Stapel (0
), fügt die beiden obersten Elemente ein und bestimmt, ob die zweite größer ist als die erste (`
ich bin überrascht, dass Sie nicht `` `verwenden können, um zu erhalten Code Backticks. ), invertiert die Wahrheit des obersten Elements (!
), geht dann nach rechts, wenn es Null ist, andernfalls nach unten (#v_
).Grundsätzlich wird geprüft, ob der Eingang
-1
keinen Eingang mehr darstellt.Wenn die Eingabe
-1
dann war, wird der duplizierte Eingabewert verworfen ($
), die Oberseite des Stapels wird als Ganzzahl ausgegeben (.
) und das Programm wird angehalten (@
).Andernfalls wird ein ähnlicher Vorgang wiederholt, um festzustellen, ob die Eingabe kleiner oder gleich einem Leerzeichen ist. Wenn es sich um ein Leerzeichen handelt, geht die Kontrolle zurück, ansonsten geht die Kontrolle nach rechts.
Wenn es sich um ein Leerzeichen handelt, wird es umgeleitet left (
<
); Das Programm stop (@
), output (.
) und right redirection (>
) werden mit übersprungen#
. Das Verwerfen wird jedoch ausgeführt, um den Speicherplatz vom Stapel zu entfernen. Schließlich wird es weitergeleitet, um mit der nächsten Ausführung zu beginnen (^
).Wenn es sich nicht um ein Leerzeichen handelt, wird derselbe Prozess verwendet, um es zu teilen, wenn es richtig ist
[+, *]
oder wenn es[-, \]
richtig ist und aufwärts geht.Denn
[+, *]
es wird erneut aufgeteilt, um festzustellen, ob es sich um eine+
oder eine handelt*
. Wenn+
es nach unten gerichtet ist, wird die nächste Zahl eingegeben (&
) und sie werden hinzugefügt (+
), das Steuerelement wird dann umgebrochen und zum Hauptpfad für das nächste Zeichen weitergeleitet. Wenn es*
dann eingibt (&
) und multipliziert (*
), wird es direkt umbrochen.Denn
[-, \]
es beginnt auf der rechten Seite links. Die#
's überspringen das Zeichen nach ihnen, so dass der Anfangspfad"-"`_
einfach festlegt, ob es-
oder ist/
. Wenn dies der Fall ist/
, wird die Eingabe (&
) und Division (/
) fortgesetzt . Wenn dies der Fall ist-
, werden die Zeichen erneut übersprungen und ausgeführt,&"-"$-
was zur Eingabe der Zahl führt (&
). Das-
auf den Stapel geschobene Zeichen wird verworfen ("-"$
) und anschließend die Subtraktion berechnet (-
). Das Steuerelement wird dann zurück zum Hauptpfad umgeleitet.quelle
Python 3, 105 Bytes
Verwaltet die vier Grundoperationen, aber das Hinzufügen von
^
oder kostet jeweils nur 5 Zeichen%
.Die Rangfolge der Operationen ist von links nach rechts.
quelle
Python (156)
quelle
C -
168126 Zeichenquelle
Tcl 8,6,
5748 Zeichen.Eingabe von Argumenten:
Von Stdin (
6453 )Sie müssen die interaktive Shell für beide Lösungen verwenden.
Ich behandle die Eingabe als Liste (Tcl verwendet Leerzeichen als Trennzeichen), nehme das erste Element und ordne es zu
a
, dann gehe ich über den Rest und nehme jeweils 2 Elemente, den Operator und eine zweite Zahl, wende den Operator auf$a
und an$b
und ordne das zu Ergebnis zua
. Am Ende steht das Ergebnis ina
.quelle
lmap
soforeach
ist ein guter Ersatz.Haskell:
124114 ZeichenEine ziemlich direkte Antwort, die einen Mustervergleich und eine einfache Fallbeschreibung für das schwere Heben verwendet. Verwendung:
quelle
((case m of{..})(read u)(read b))
Ihnen können Sie auch((case m of{..}$read u)$read b)
2 Zeichen weniger schreiben .C:
111108 ZeichenEs erfüllt alle Anforderungen, Nutzung:
quelle
~scanf
ersetzen können+1
. Auchc^45
->c%5
undc^42
->c%2
sollten funktionieren.C ++ 0x
205203198194 ZeichenSchön formatiert:
quelle
Perl (97)
Lesen Sie aus Argumenten
von der Eingabe lesen
quelle
PostScript (145)
Ein weiterer PostScript-Eintrag (danke an luser droog für das Graben der für PostScript interessanten Golfplätze!):
Nicht golfen:
quelle
Python - 308
Lesbare Version:
Nimmt Ausdruck als Befehlszeilenargument und gibt ihn in der Standardausgabe aus.
quelle
Nachschrift (340)
Und ein bisschen lesbarer:
quelle
JavaScript (208 Zeichen komprimiert)
Aus Gründen der Übersichtlichkeit ist dies der Code, bevor ich ihn komprimiert habe ( JS-Fiddle davon ):
Hier ist es auf 208 Zeichen komprimiert ( JS-Fiddle davon ):
Da ich Zeilen mit Semikolons beende, wurden alle entfernbaren Leerzeichen beim Zählen der Zeichen ignoriert, aber der Übersichtlichkeit halber belassen.
quelle
Haskell - 124
Das Ergebnis wird in
Maybe
Monade verpacktEs erfordert auch den Import
<*>
vonControl.Applicative
, aber der Import kann außerhalb des Codes erfolgen, also hoffe ich, dass es erlaubt ist.quelle
C #
(234)(231)(229)(223)(214)quelle
JavaScript (87 Zeichen)
quelle
Java 11, 151 (als Lambda-Funktion)
Lambda-Funktion, bei der ein String eingegeben und ein Float ausgegeben wird.
Probieren Sie es online aus.
Java 11, 241 Bytes (als volles Programm mit abgefragten I / O)
Volles Programm, das eine String-Zeile durch STDIN zieht und an STDOUT ausgibt.
Probieren Sie es online aus.
Erläuterung:
quelle
05AB1E , 30 Bytes
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Wenn ein
eval
eingebauter Code zulässig wäre, könnte dies ein alternativer Ansatz sein ( 16 Byte ):Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Dies würde sich ändern ,
"-2 + 6 / 2 * 8 - 1 / 2.5 - 18"
um"((((((-2)+6)/2)*8)-1)/2.5)-18"
vor der Verwendungeval
builtin (unter Verwendung.E
würde direkt Operator Vorrang geben*/
über+-
, damit die Konvertierung mit Klammern zuerst).quelle