Vous devez écrire un programme pour évaluer une chaîne qui serait entrée dans une calculatrice.
Le programme doit accepter l'entrée et la sortie de la bonne réponse. Pour les langues qui n'ont pas de fonctions d'entrée / sortie standard, vous pouvez assumer les fonctions readLine
et print
.
Exigences
- N'utilise aucun type de fonctions "eval"
- Peut gérer les nombres à virgule flottante et négatifs
- Prend en charge au moins les opérateurs +, -, * et /
- Peut gérer une entrée contenant un ou plusieurs espaces entre les opérateurs et les nombres
- Évalue l'expression de gauche à droite
Le programme le plus court gagne. En cas d'égalité, le programme soumis en premier l'emporte.
Vous pouvez supposer que l'entrée est valide et suit le format correct
Cas de test
Contribution
-4 + 5
Production
1
Contribution
-7.5 / 2.5
Production
-3
Contribution
-2 + 6 / 2 * 8 - 1 / 2.5 - 18
Production
-12
code-golf
math
arithmetic
Kevin Brown
la source
la source
Réponses:
Ruby -
74696765 caractèresla source
b[0],b[1].to_f
vous pouvez remplacer|b|
avec|b,c|
et l' utilisationb,c.to_f
a.send(b,c.to_f)
, utiliseza.send b,c.to_f
. Il sauve un char$<
place deARGF
Befunge -
37 x 5 = 18538 x 3 = 114 caractèresCeci est limité aux nombres entiers car Befunge n'a pas de support en virgule flottante.
Explication
La plus grande caractéristique distinctive de Befunge est qu'au lieu d'être un ensemble linéaire d'instructions comme la plupart des langues; c'est une grille 2D d'instructions à caractère unique, où le contrôle peut circuler dans n'importe quelle direction.
Le premier
&
saisit simplement le premier nombre. Lev
,>
puis rediriger le contrôle vers le chemin principal sur la deuxième ligne.Cela entre un caractère (
~
), le duplique (:
), pousse zéro sur la pile (0
), fait apparaître les deux premiers éléments et détermine si le second est supérieur au premier (`
je suis surpris que vous ne puissiez pas utiliser `` `pour obtenir code backticks. ), inverse la véracité de l'élément supérieur (!
), puis va à droite s'il est nul, vers le bas sinon (#v_
).Fondamentalement, il vérifie si l'entrée ne
-1
représente plus d'entrée.Si l'entrée était
-1
alors la valeur d'entrée dupliquée est supprimée ($
), le haut de la pile est sorti sous forme d'entier (.
) et le programme est arrêté (@
).Sinon, un processus similaire est répété pour déterminer si l'entrée est inférieure ou égale à un espace. S'il s'agit d'un espace, le contrôle descend, sinon le contrôle se dirige vers la droite.
S'il s'agit d'un espace, il est redirigé vers la gauche (
<
); le programme halt (@
), output (.
) et redirection droite (>
) sont tous ignorés en utilisant#
; mais le rejet est exécuté pour supprimer l'espace de la pile. Enfin, il est redirigé vers le haut pour commencer la prochaine exécution (^
).Si ce n'était pas un espace, le même processus est utilisé pour se diviser s'il est dans
[+, *]
ou en[-, \]
allant à droite et en haut respectivement.Car
[+, *]
il est de nouveau divisé pour déterminer s'il s'agit d'un+
ou d'un*
. S'il+
est dirigé vers le bas, le nombre suivant est input (&
) et ils sont ajoutés (+
), le contrôle se retourne et est redirigé vers le chemin principal pour le caractère suivant. Si*
alors il entre (&
) et multiplie (*
), il s'enroule directement.Car
[-, \]
cela commence à droite en direction de gauche. Les#
sautent le caractère après eux pour que le chemin initial soit"-"`_
qui détermine simplement si c'est-
ou/
. Si c'est le cas, il/
continue à gauche pour entrer (&
) et diviser (/
). Si c'est le cas, il se-
dirige vers la droite, en ignorant à nouveau les caractères afin qu'il s'exécute,&"-"$-
ce qui entraîne l'entrée du nombre (&
), le-
caractère étant poussé sur la pile, puis rejeté ("-"$
) et la soustraction calculée (-
). Le contrôle est ensuite redirigé vers le chemin principal.la source
Python 3, 105 octets
Gère les quatre opérations de base, mais il ne coûte que 5 caractères chacun pour ajouter
^
ou%
.La priorité des opérations est de gauche à droite.
la source
Python (156)
la source
C -
168126 caractèresla source
Tcl 8.6,
5748 caractères.Entrée d'arguments:
Depuis Stdin (
6453 )Vous devez utiliser le shell interactif pour les deux solutions.
Je traite l'entrée sous forme de liste (Tcl utilise des espaces comme délimiteur) prennent le premier élément et l' affecter à
a
, puis je marche sur le reste, en 2 éléments à chaque fois, l'opérateur et un second nombre, appliquer l'opérateur$a
et$b
et attribuer la résultat àa
. À la fin, le résultat est làa
.la source
lmap
,foreach
c'est donc un bon remplacement.Haskell:
124114caractèresUne réponse assez simple, utilisant la correspondance de motifs et une simple déclaration de cas pour le levage de charges lourdes. Usage:
la source
((case m of{..})(read u)(read b))
vous pouvez écrire((case m of{..}$read u)$read b)
, 2 caractères de moins.C:
111108 caractèresIl remplit toutes les exigences, utilisation:
la source
~scanf
peut remplacer+1
. De plus,c^45
->c%5
etc^42
->c%2
devraient fonctionner.C ++ 0x
205203198194 caractèresJoliment formaté:
la source
Perl (97)
lire des arguments
lire depuis l'entrée
la source
PostScript (145)
Une autre entrée PostScript (merci à luser droog pour avoir creusé les golfs intéressants pour PostScript!):
Non-golfé:
la source
Python - 308
Version lisible:
Prend l'expression comme argument de ligne de commande, sortie sur la sortie standard.
la source
Post-scriptum (340)
Et un peu plus lisible:
la source
JavaScript (208 caractères compactés)
Pour plus de clarté, voici le code avant de le compacter ( JS-Fiddle ):
Ici, il est compacté à 208 caractères ( JS-Fiddle de celui-ci ):
Comme je termine les lignes par des points-virgules, tous les espaces amovibles ont été ignorés pour le comptage des caractères, mais laissés pour plus de clarté.
la source
Haskell - 124
Le résultat sera enveloppé dans la
Maybe
monadeIl faut également importer
<*>
depuisControl.Applicative
, mais les importations peuvent être effectuées en dehors du code, donc j'espère que c'est autorisé.la source
C #
(234)(231)(229)(223)(214)la source
JavaScript (87 caractères)
la source
Java 11, 151 (en tant que fonction lambda)
Fonction lambda prenant une entrée String et sortant un flottant.
Essayez-le en ligne.
Java 11, 241 octets (en tant que programme complet avec E / S demandées)
Programme complet prenant une ligne de chaîne via STDIN et sortie vers STDOUT.
Essayez-le en ligne.
Explication:
la source
05AB1E , 30 octets
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Si une fonction
eval
intégrée était autorisée, cela pourrait être une approche alternative ( 16 octets ):Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Cela changerait
"-2 + 6 / 2 * 8 - 1 / 2.5 - 18"
à"((((((-2)+6)/2)*8)-1)/2.5)-18"
avant d' utiliser laeval
commande intégrée ( en utilisant.E
directement l' opérateur donnerait priorité de*/
plus+-
, d' où la conversion avec parenthèses en premier).la source