Votre tâche consiste à prendre une liste d'arguments qui sont soit des entiers soit des opérateurs, et à les analyser comme ceci:
Il existe un opérateur actuel, qui commence par +.
Chaque fois qu'un opérateur est trouvé, l'opérateur actuel y changera.
Les opérateurs possibles sont: "+", "-", "*", "/" et "%", qui correspondent à leur signification en C et dans la plupart des langues.
Il existe une solution en cours d'exécution, qui commence à 0.
Chaque fois qu'un entier est trouvé, la solution est modifiée par le nombre selon l'opérateur; Par exemple, si l'opérateur est "/", la solution est divisée par le nombre.
Si une opération aboutit à un nombre mixte (c'est-à-dire avec une décimale), elle doit être renvoyée à un entier (c'est-à-dire que la décimale doit être coupée).
Sortez la solution finale.
Par exemple:
Les arguments 5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14
entraîneraient:
5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14
0 5 13 38 342 2052 4104 4000 1000 142 148 8 -> 8
Les entrées seront des arguments de ligne de commande ou de fonction, ou un équivalent pour votre langue.
Le code le plus court gagne!
%
arrondis vers -inf au lieu de 0?Réponses:
Pyth -
24232220 octets2 octets enregistrés grâce à @issacg et 1 grâce à @orlp!
Utilise réduire avec le cas de base de
0
et vérifie'
être en repr pour détecter la chaîne vs int.Ne fonctionne pas en ligne car j'utilise une évaluation complète qui est désactivée en ligne pour des raisons de sécurité. Prend entrée de stdin dans une liste en tant que telle:
5, 8, 25, "*", 9, 6, 2, "-", 104, "/", 4, 7, "+", 6
.la source
?
à.x
, car seul le bloc else peut lever une exception, et il le fera à chaque fois. Vous ne pouvez plus utiliserK
, cependant.u.xsv++GbH&=bHG+\+QZ
, Plus précisément.JavaScript (ES6) 53
Une fonction prenant un tableau en entrée.
Exécutez l'extrait dans Firefox pour tester.
la source
Julia,
8583 octetsCela crée une fonction sans nom qui accepte une chaîne en entrée et renvoie un entier.
Non golfé:
Correction d'un problème et économisé 2 octets grâce à Glen O.
la source
o is not defined
lorsque vous essayez d'exécuter la fonction à nouveau. Il essaie d'exécuter la fonction "o = ifloor ..." dans Main, plutôt qu'à l'intérieur de la fonction (voir ici github.com/JuliaLang/julia/issues/2386 ). Puis-je suggérers->(o=0;p="+";for i=split(s) isdigit(i)?o=eval(parse("ifloor($o$p$i)")):p=i;end;o)
?elisp, 101 octets
Avec les arguments passés sous forme de liste entre guillemets: par exemple
(c '(5 5 * 10))
Version avec de nouvelles lignes:
la source
CJam, 24 octets
Il s'agit d'un programme complet qui lit l'entrée en tant qu'arguments de ligne de commande.
Pour essayer le code en ligne dans l' interpréteur CJam (qui ne prend pas en charge les arguments de ligne de commande), remplacez
ea
parlS/
pour lire à partir de STDIN simulé.Comment ça fonctionne
la source
JavaScript, 85 octets
la source
o+ +t
? vous créez une chaîne de toute façon, pas besoin de convertir en nombre. De plus,.forEach
n'a pas sa place dans Code Golf: utilisation.map
prompt(o="+",r=0).split(" ").forEach(t=>+t+1?r=+eval(r+o+ +t):o=t);alert(r)
-> 75 octets.Lua, 142 octets
Non golfé:
la source
Powershell, 57 octets
non golfé;
Si la variable implicite dans le for-each est un opérateur plutôt qu'un nombre, Invoke-Expression (POSH
eval()
) échouera et le statut d'exécution$?
sera faux.Le sol de POSH est difficile à manier -
$foo=[math]::floor($foo)
et$foo-=$foo%1
c'était l'alternative la plus golfique à laquelle je pouvais penser.la source
if
sur des chiffres, mais essentiellement les mêmes. 89 octets$o="+";$r=0;$args-split'\s+'|%{if($_-match'^\d+$'){$r=iex $r$o$_;$r-=$r%1}Else{$o=$_}};$r
GNU Sed (avec l'extension eval, + dc), 102
(Le score inclut +1 pour l'option -r à sed.)
Transforme l'expression d'entrée pour inverser la notation polonaise, puis l'utilise
dc
pour l'évaluer.Sortie de test:
la source
CJam, 34 octets
Essayez-le en ligne
Je pensais que cela allait être assez raisonnable. Mais je n'ai pas été assez rapide pour la poster pour être la réponse CJam la plus courte au moins pendant un moment. :(
la source
Python 3 -
131 octets129 octets121 octets116octetsMerci à Maltysen pour avoir rasé deux octets, Beta Decay pour avoir rasé 8 et Steven Rumbalski pour avoir rasé 5.
J'essaie de trouver un moyen de réduire la longueur de la déclaration if, mais pour l'instant cela semble aussi golfique que possible. Prend la saisie sous forme de liste.
la source
int
par//1
in
et la citation..split()
.Bash, 69
Cela ne fonctionne qu'avec des entiers non négatifs - ce n'est pas clair dans la question si c'est correct ou non.
la source
Groovy, 79 octets
Démo:
Non golfé:
la source
gcc (avec avertissements) 165 (si la fin de ligne compte comme 1)
Mais si vous le compilez avec mingw32, vous devez désactiver la globalisation (voir https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html ) en compilant comme ceci:
la source
Perl 5.10+, 52 octets
Démo:
(Notez que cela
*
doit être échappé dans mon shell afin qu'il ne soit pas interprété comme un motif global.)Non golfé:
la source
C #, 132
165 168octetsCette fonction suppose que l'entrée est valide. C'est difficile pour C # étant donné qu'il n'y a pas d'
eval
équivalent.Merci edc65 pour avoir économisé 33 octets!
En retrait pour plus de clarté.
la source
?:
->int C(string[]a){int o=1,r=0,n;foreach(var b in a)n=int.TryParse(b,out n)?r=o<0?r%n:o<1?r*n:o<3?r+n:o<5?r-n:r/n:o=b[0]-42;return r;}
Rubis, 59 octets
Essai:
la source