Vous devez évaluer une chaîne écrite en notation polonaise inversée et générer le résultat.
Le programme doit accepter une entrée et renvoyer la sortie. Pour les langages de programmation qui ne disposent pas de fonctions pour recevoir des entrées / sorties, vous pouvez assumer des fonctions telles que readLine / print.
Vous n'êtes pas autorisé à utiliser n'importe quel type de "eval" dans le programme.
Les nombres et les opérateurs sont séparés par un ou plusieurs espaces.
Vous devez prendre en charge au moins les opérateurs +, -, * et /.
Vous devez ajouter un support aux nombres négatifs (par exemple, ce -4
n'est pas la même chose 0 4 -
) et aux nombres à virgule flottante.
Vous pouvez supposer que la saisie est valide et respecte les règles ci-dessus
Cas de test
Contribution:
-4 5 +
Sortie:
1
Contribution:
5 2 /
Sortie:
2.5
Contribution:
5 2.5 /
Sortie:
2
Contribution:
5 1 2 + 4 * 3 - +
Sortie:
14
Contribution:
4 2 5 * + 1 3 2 * + /
Sortie:
2
~
. :-Peval
pour analyser les numéros? Cela semble assez cassé. (GolfScript est l'un de ces langages, à ma connaissance. Je pense qu'il est cassé aussi.)eval(s)
est meilleur quefloat(s)
Réponses:
Ruby -
9577 caractèresPrend une entrée sur stdin.
Code de test
donne
Contrairement à la version C, cela renvoie le dernier résultat valide s'il semble y avoir des numéros supplémentaires ajoutés à l'entrée.
la source
Python - 124 caractères
Python - 133 caractères
la source
0
comme second opérande ...[a/b]
doit être remplacé parb and[a/b]
afin que vous puissiez avoir 0 comme second opérande.Schéma, 162 caractères
(Les sauts de ligne ajoutés pour plus de clarté - tous sont facultatifs.)
Version entièrement formatée (non-golfée):
Commentaire sélectionné
`(,foo ,@bar)
est identique à(cons foo bar)
(c'est-à-dire qu'il (effectivement † ) retourne une nouvelle liste avecfoo
préfixe àbar
), sauf que le caractère est plus court si vous compressez tous les espaces.Ainsi, vous pouvez lire les clauses d’itération au fur
(loop (cons token stack))
et à mesure(loop (cons ((cadr ass) (cadr stack) (car stack)) (cddr stack)))
que cela vous paraît plus facile.`((+ ,+) (- ,-) (* ,*) (/ ,/))
crée une liste d'association avec le symbole+
associé à la procédure+
, et de la même manière avec les autres opérateurs. Il s’agit donc d’une simple table de consultation de symboles (les mots nus sont(read)
sous forme de symboles, raison pour laquelle aucun traitement supplémentaire n’a lieu).token
n’est nécessaire). Les listes d'associations ont une recherche O (n) et ne conviennent donc que pour les listes courtes, comme c'est le cas ici. :-P† Ce n'est pas techniquement exact, mais, pour les programmeurs non Lisp, il en a une idée assez juste.
la source
lambda (ass)
+1 pour le choix du nom de la variable: Pc - 424 caractère nécessaire
Supposons que vous ayez une nouvelle bibliothèque suffisante à inclure
getdelim
dans stdio.h. L'approche est tout droit, l'entrée entière est lue dans une mémoire tampon, puis nous tokenisons avecstrsep
et utilisons longueur et caractère initial pour déterminer la classe de chacun. Il n'y a pas de protection contre les mauvaises entrées. Chargez-le "+ - * / + - ...", et il sautera volontiers dans la mémoire "en dessous" de la pile jusqu'à ce qu'il se sépare des erreurs. Tous les non-opérateurs sont interprétés comme des flottants,atof
ce qui signifie une valeur nulle s'ils ne ressemblent pas à des nombres.Lisible et commenté:
Validation:
Il h! Je dois citer n'importe quoi avec
*
dedans ...et mon propre cas de test
la source
case
par un makro.Haskell (155)
la source
s!(n:v)=case n of{"+"->(+)#s;"-"->(-)#s;"*"->(*)#s;"/"->(/)#s;_->(read n:s)}!v
permettrait d'économiser 14 caractères.MATLAB -
158, 147(l’entrée est lue à partir de l’utilisateur, la sortie est imprimée).
Ci-dessous, le code prettifié et commenté, il implémente assez bien l' algorithme postfixif décrit (en supposant que les expressions sont valides):
Prime:
Dans le code ci - dessus, nous supposons que les opérateurs sont toujours binaires (
+
,-
,*
,/
). Nous pouvons le généraliser en utilisantnargin(f)
pour déterminer le nombre d'arguments requis par l'opérande / la fonction, et extraire en conséquence la bonne quantité de valeurs de la pile, comme dans:De cette façon, nous pouvons évaluer des expressions telles que:
où
mean_of_three
est une fonction définie par l'utilisateur avec trois entrées:la source
Perl (134)
La prochaine fois, je vais utiliser la chose récursive regexp.
Ungolfed:
Je pensais que F # était le seul langage de programmation de mes rêves ...
la source
Windows PowerShell, 152
181192Sous une forme lisible, parce qu’il n’ya plus que deux lignes pour le moment:
2010-01-30 11:07 (192) - Première tentative.
2010-01-30 11:09 (170) - Le fait de transformer la fonction en scriptblock résout les problèmes de portée. Allonge simplement chaque appel de deux octets.
2010-01-30 11:19 (188) - Le problème de la portée n'a pas été résolu, le scénario de test l'a masqué. Suppression de l'index de la sortie finale et suppression d'un saut de ligne superflu. Et changé double en
float
.2010-01-30 11:19 (181) - Je ne me souviens même pas de mes propres conseils. La conversion en un type numérique peut être réalisée en un seul caractère.
2010-01-30 11:39 (152) - Réduit considérablement en utilisant la correspondance de regex dans le fichier
switch
. Résout complètement les problèmes de portée précédents avec l'accès à la pile pour la faire apparaître.la source
Raquette 131:
Les sauts de ligne sont facultatifs.
Basé sur la solution de Chris Jester-Young pour Scheme.
la source
Python, 166 caractères
la source
raw_input()
code d' utilisation n'est pas divisé sur plusieurs lignes.from operator import*
et remplacero.div
pardiv
.Python 3, 119 octets
Contribution:
5 1 1 - -7 0 * + - 2 /
Sortie:
2.5
(Vous pouvez trouver une version Python 2 à 128 caractères dans l'historique des modifications.)
la source
/
de la chaîne.ZeroDivisionError
lorsque le deuxième opérande est 0 (par exemple5 0 +
).ord(x) - 42
méthode.JavaScript (157)
Ce code suppose qu'il existe deux fonctions: readLine et print
la source
prompt()
au lieu dereadLine()
(et peut-êtrealert()
au lieu deprint()
faire correspondreprompt()
).Perl, 128
Ce n'est pas vraiment compétitif à côté de l'autre réponse Perl, mais explore un chemin différent (sous-optimal).
Les caractères comptés comme diff à une simple
perl -e ''
invocation.la source
Python, 161 caractères:
la source
PHP,
439265263262244240 caractèresCe code devrait fonctionner avec stdin, bien qu'il ne soit pas testé avec stdin.
Il a été testé sur tous les cas, la sortie (et le code) pour le dernier est ici:
http://codepad.viper-7.com/fGbnv6
Ungolfed,
314330326 caractèresla source
flex - 157
Si vous n'êtes pas familier, compilez avec
flex rpn.l && gcc -lfl lex.yy.c
la source
Python, 130 caractères
Serait 124 caractères si nous avons laissé
b and
(certaines réponses Python sont manquantes). Et il en incorpore 42!la source
Python 3,
126132 caractèresIl y avait déjà de meilleures solutions, mais maintenant que je l'avais écrit (sans avoir lu les soumissions précédentes, bien sûr - même si je dois admettre que mon code a l'air de les avoir copypés ensemble), je voulais le partager, aussi.
la source
b/a
doit être remplacé para and b/a
, sinon cette solution ne fonctionnera pas si le deuxième opérande est 0 (par exemple4 0 -
).c99 gcc 235
Cela fonctionne pour moi (avec des avertissements):
Mais si vous le compilez avec mingw32, vous devez désactiver la fonction de globbing (voir https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html ) en compilant comme suit :
Si vous ne le faites pas *, le CRT mingw32 l'étend automatiquement.
Est-ce que quelqu'un sait comment transformer
break;case'*':s[--d]*=s[d+1];
en une macro qui accepte le caractère + en tant que paramètre, car alors les quatre cas seraient simplementO(+)O(-)O(*)O(/)
la source
C,
232229 octetsAmusez-vous avec la récursion.
Ungolfed:
Cas de test:
la source
JavaScript ES7, 119 octets
Je reçois un bogue avec les compréhensions de tableaux, donc j'ai utilisé
.map
Essayez-le en ligne sur ESFiddle
la source
PHP - 259 caractères
En supposant une entrée dans la variable POST i .
la source
C # - 392 caractères
Cependant, si les arguments peuvent être utilisés à la place de l'entrée standard, nous pouvons le réduire à
C # - 366 caractères
la source
Scala
412 376 349 335312:la source
Python - 206
Version non-golfée:
Entrée à partir d'un argument de ligne de commande; sortie sur sortie standard.
la source
ECMAScript 6 (131)
Il suffit de taper ensemble en quelques secondes pour pouvoir jouer au golf encore plus loin ou même mieux s’en approcher. Je pourrais le revoir demain:
la source
C # -
323284241Edit: Remplacement de la pile par un tableau est beaucoup plus court
Edit2: Remplacé les if par une expression ternaire
la source
string[] i
=>string[]i
.Python 2
J'ai essayé différentes approches de celles publiées jusqu'à présent. Aucune de celles-ci n'est aussi courte que les meilleures solutions Python, mais elles pourraient néanmoins intéresser certains d'entre vous.
Utilisation de la récursivité, 146
Utilisation de la manipulation de liste, 149
Utilisation
reduce()
, 145la source
Matlab, 228
Ungolfed:
la source
;
. So I think the byte count is the samecr+lf
une nouvelle ligne, composée de 2 caractères. Mon bloc-notes ++ comptait 230 caractères dans votre version à 3 lignes, mais seulement 128 si je colle tout dans une ligne (2 * 2 supprimés = 4 caractères des 2 nouvelles lignes et deux ajoutés;
). Essayez vous-même;)K5, 70 octets
I'm not sure when K5 was released, so this might not count. Still awesome!
la source