Sie müssen eine in umgekehrter polnischer Schreibweise geschriebene Zeichenfolge auswerten und das Ergebnis ausgeben.
Das Programm muss eine Eingabe akzeptieren und die Ausgabe zurückgeben. Für Programmiersprachen, die keine Ein- / Ausgabefunktionen haben, können Sie Funktionen wie readLine / print übernehmen.
Sie dürfen keine Art von "eval" im Programm verwenden.
Zahlen und Operatoren werden durch ein oder mehrere Leerzeichen getrennt.
Sie müssen mindestens die Operatoren +, -, * und / unterstützen.
Sie müssen negative Zahlen und Gleitkommazahlen unterstützen (dies ist beispielsweise -4
nicht dasselbe wie 0 4 -
).
Sie können davon ausgehen, dass die Eingabe gültig ist und die obigen Regeln befolgt
Testfälle
Eingang:
-4 5 +
Ausgabe:
1
Eingang:
5 2 /
Ausgabe:
2.5
Eingang:
5 2.5 /
Ausgabe:
2
Eingang:
5 1 2 + 4 * 3 - +
Ausgabe:
14
Eingang:
4 2 5 * + 1 3 2 * + /
Ausgabe:
2
~
. :-Peval
Zahlen analysieren? Es klingt ziemlich kaputt. (GolfScript ist eine solche Sprache, soweit ich weiß. Ich denke, es ist auch kaputt.)eval(s)
ist besser alsfloat(s)
Antworten:
Ruby -
9577 ZeichenÜbernimmt die Eingabe für stdin.
Code testen
gibt
Im Gegensatz zur C-Version gibt dies das letzte gültige Ergebnis zurück, wenn zusätzliche Zahlen an die Eingabe angehängt werden.
quelle
Python - 124 Zeichen
Python - 133 Zeichen
quelle
0
als zweiter Operand haben ...[a/b]
sollte durch ersetzt werden,b and[a/b]
damit Sie 0 als zweiten Operanden haben können.Schema, 162 Zeichen
(Aus Gründen der Übersichtlichkeit wurden Zeilenumbrüche hinzugefügt. Alle Angaben sind optional.)
Vollformatierte (ungolfed) Version:
Ausgewählter Kommentar
`(,foo ,@bar)
ist dasselbe wie(cons foo bar)
(dh es gibt (effektiv † ) eine neue Liste mitfoo
vorangestelltem an zurückbar
), außer dass es ein Zeichen kürzer ist, wenn Sie alle Leerzeichen heraus komprimieren.So können Sie die Iteration Klauseln gelesen
(loop (cons token stack))
und(loop (cons ((cadr ass) (cadr stack) (car stack)) (cddr stack)))
wenn es das ist einfacher auf Ihren Augen.`((+ ,+) (- ,-) (* ,*) (/ ,/))
Erstellt eine Zuordnungsliste mit dem Symbol, das+
mit der Prozedur+
und ebenfalls mit den anderen Operatoren gepaart ist . Somit handelt es sich um eine einfache Symbol-Nachschlagetabelle (bloße Wörter sind(read)
als Symbole enthalten, weshalb keine weitere Verarbeitungtoken
erforderlich ist). Assoziationslisten haben O (n) Lookup und sind daher nur für kurze Listen geeignet, wie dies hier der Fall ist. :-P† Dies ist technisch nicht korrekt, aber für Nicht-Lisp-Programmierer wird eine hinreichende Vorstellung vermittelt.
quelle
lambda (ass)
+1 für die Wahl des Variablennamens: Pc - 424 notwendiges Zeichen
Angenommen, Sie haben eine neue Libc, die
getdelim
in stdio.h aufgenommen werden kann. Der Ansatz ist direkt, die gesamte Eingabe wird in einen Puffer eingelesen, dann wird mit derstrsep
Länge und dem Anfangszeichen getoken und die Klasse der einzelnen Zeichen bestimmt. Es gibt keinen Schutz vor schlechten Eingaben. Füttere es mit "+ - * / + - ...", und es wird fröhlich "unter" dem Stapel Zeug aus dem Speicher entfernen, bis es einen Fehler aufweist. Alle Nicht-Operatoren werden als Gleitkommazahlen interpretiert,atof
was bedeutet, dass der Wert Null ist, wenn sie nicht wie Zahlen aussehen.Lesbar und kommentiert:
Validierung:
Heh! Muss irgendetwas damit zitieren
*
...und mein eigener Testfall
quelle
case
sichern, indem Sie sie durch ein Makro ersetzen.Haskell (155)
quelle
s!(n:v)=case n of{"+"->(+)#s;"-"->(-)#s;"*"->(*)#s;"/"->(/)#s;_->(read n:s)}!v
würde 14 Zeichen speichern.MATLAB -
158, 147(Eingabe wird von Benutzereingabe gelesen, Ausgabe ausgedruckt).
Ist der Code unten hübsch und kommentiert, implementiert er den beschriebenen Postfix-Algorithmus (mit der Annahme, dass Ausdrücke gültig sind):
Bonus:
In dem obigen Code gehen wir davon aus Operatoren immer binär sind (
+
,-
,*
,/
). Wir können es verallgemeinern, indem wirnargin(f)
die Anzahl der Argumente bestimmen, die der Operand / die Funktion benötigt, und dementsprechend die richtige Anzahl von Werten aus dem Stapel ziehen, wie in:Auf diese Weise können wir Ausdrücke wie die folgenden auswerten:
wo
mean_of_three
ist eine benutzerdefinierte Funktion mit drei Eingaben:quelle
Perl (134)
Nächstes Mal werde ich das rekursive Regexp-Ding verwenden.
Ungolfed:
Ich denke, F # ist meine einzige Traum-Programmiersprache ...
quelle
Windows PowerShell, 152
181192In lesbarer Form, da es sich derzeit nur um zwei Zeilen handelt, die nicht getrennt werden können:
2010-01-30 11:07 (192) - Erster Versuch.
2010-01-30 11:09 (170) - Durch die Umwandlung der Funktion in einen Scriptblock werden die Probleme mit dem Gültigkeitsbereich behoben. Nur macht jeder Aufruf zwei Bytes länger.
2010-01-30 11:19 (188) - Das Problem mit dem Gültigkeitsbereich wurde nicht behoben, der Testfall hat es nur maskiert. Der Index wurde aus der endgültigen Ausgabe entfernt und ein überflüssiger Zeilenumbruch wurde entfernt. Und wechselte doppelt zu
float
.2010-01-30 11:19 (181) - Ich kann mich nicht einmal an meinen eigenen Rat erinnern. Die Umwandlung in einen numerischen Typ kann in einem Zeichen erfolgen.
2010-01-30 11:39 (152) - Stark reduziert durch Verwendung von Regex-Matching in der
switch
. Behebt vollständig die vorherigen Probleme mit dem Zugriff auf den Stack, um ihn zu öffnen.quelle
Schläger 131:
Zeilenumbrüche optional.
Basierend auf der Lösung von Chris Jester-Young für Scheme.
quelle
Python, 166 Zeichen
quelle
raw_input()
ist nicht auf mehrere Zeilen aufgeteilt.from operator import*
und ersetzeno.div
durchdiv
.Python 3, 119 Bytes
Eingang:
5 1 1 - -7 0 * + - 2 /
Ausgabe:
2.5
(Eine Python 2-Version mit 128 Zeichen finden Sie im Bearbeitungsverlauf.)
quelle
/
in der Zeichenfolge brauchst .ZeroDivisionError
wenn der zweite Operand 0 ist (z5 0 +
. B. ).ord(x) - 42
Methode verwenden.JavaScript (157)
In diesem Code wird davon ausgegangen, dass diese beiden Funktionen vorhanden sind: readLine und print
quelle
prompt()
statt verwendenreadLine()
(und vielleichtalert()
stattprint()
zu entsprechenprompt()
).Perl, 128
Dies ist nicht wirklich konkurrenzfähig neben der anderen Perl-Antwort, sondern untersucht einen anderen (suboptimalen) Pfad.
Zeichen, die bei einem einfachen
perl -e ''
Aufruf als unterschiedlich gezählt werden .quelle
Python, 161 Zeichen:
quelle
PHP,
439265263262244240 ZeichenDieser Code sollte mit stdin funktionieren, obwohl er nicht mit stdin getestet wurde.
Es wurde in allen Fällen getestet. Die Ausgabe (und der Code) für den letzten Fall finden Sie hier:
http://codepad.viper-7.com/fGbnv6
Ungolfed,
314330326 Zeichenquelle
flex - 157
Wenn Sie nicht vertraut sind, kompilieren Sie mit
flex rpn.l && gcc -lfl lex.yy.c
quelle
Python, 130 Zeichen
Wäre 124 Zeichen, wenn wir fallen gelassen würden
b and
(wobei einige der Python-Antworten fehlen). Und es enthält 42!quelle
Python 3,
126132 ZeichenEs gab bereits bessere Lösungen, aber jetzt, wo ich sie geschrieben hatte (natürlich ohne die vorherigen Beiträge gelesen zu haben - obwohl ich zugeben muss, dass mein Code so aussieht, als hätte ich sie gemeinsam kopiert), wollte ich sie teilen. zu.
quelle
b/a
sollte durch ersetzt werdena and b/a
, sonst funktioniert diese Lösung nicht, wenn der zweite Operand 0 ist (zB4 0 -
).c99 gcc 235
Das funktioniert bei mir (mit Warnungen):
Wenn Sie es jedoch mit mingw32 kompilieren, müssen Sie das Globbing deaktivieren (siehe https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html ), indem Sie wie folgt kompilieren:
Wenn Sie dies nicht tun, wird * automatisch durch die mingw32-CRT erweitert.
Weiß jemand, wie man sich
break;case'*':s[--d]*=s[d+1];
in ein Makro verwandelt , das das Zeichen + als Parameter akzeptiert, denn dann wären alle vier Fälle einfachO(+)O(-)O(*)O(/)
quelle
C
232229 BytesSpaß mit Rekursion.
Ungolfed:
Testfälle:
quelle
JavaScript ES7, 119 Byte
Ich bekomme einen Fehler mit dem Array-Verständnis, den ich verwendet habe
.map
Probieren Sie es online bei ESFiddle
quelle
PHP - 259 Zeichen
Annahme der Eingabe in der POST-Variablen i .
quelle
C # - 392 Zeichen
Wenn jedoch Argumente anstelle von Standardeingaben verwendet werden können, können wir dies auf reduzieren
C # - 366 Zeichen
quelle
Scala
412 376 349 335312:quelle
Python - 206
Ungolfed-Version:
Eingabe vom Befehlszeilenargument; Ausgabe auf Standardausgabe.
quelle
ECMAScript 6 (131)
Einfach in ein paar Sekunden zusammen tippen, damit es wahrscheinlich weiter golfen oder vielleicht sogar besser angefahren werden kann. Ich könnte es morgen noch einmal besuchen:
quelle
C # -
323284241Bearbeiten: Das Ersetzen des Stapels durch ein Array ist viel kürzer
Edit2: Ersetzte das ifs durch einen ternären Ausdruck
quelle
string[] i
=>string[]i
.Python 2
Ich habe verschiedene Ansätze zu den bisher veröffentlichten ausprobiert. Keines davon ist so kurz wie die besten Python-Lösungen, aber für einige von Ihnen könnten sie dennoch interessant sein.
Rekursion verwenden, 146
Verwenden der Listenbearbeitung, 149
Verwenden
reduce()
, 145quelle
Matlab, 228
Ungolfed:
quelle
;
. Ich denke, die Anzahl der Bytes ist die gleichecr+lf
eine neue Zeile mit 2 Zeichen. Mein Notizblock ++ zählte 230 Zeichen in Ihrer 3-Zeilen-Version, aber nur 128, wenn ich alles in eine Zeile klebe (2 * 2 = 4 Zeichen aus den 2 Zeilen entfernt und zwei hinzugefügt;
). Probieren Sie es selbst;)K5, 70 Bytes
Ich bin nicht sicher , wenn K5 veröffentlicht wurde, so dass diese Macht nicht zählen. Immer noch toll!
quelle