Créez un programme qui résout une expression mathématique en utilisant les éléments des côtés alternés de l'expression. Au lieu de lire de gauche à droite, vous lisez le premier caractère, puis le dernier, puis le deuxième, puis l'avant-dernier, etc. Cela vous donnera une nouvelle expression que vous devez évaluer et produire.
a*b/c+d-e
135798642 <-- Order you read the expression in
ae*-bd/+c <-- Order of operation.
Exemple:
1*3/2+4-5
15*-34/+2 = -255
Si l'expression ne «marche» pas, un 1
doit être inséré dans les positions nécessaires pour le faire fonctionner.
Quelques exemples l'illustreront probablement mieux:
Input: 1+1+1+1+1
Result: 23 // Because 1+1+1+1+1 -> 11++11++1 -> 23
Input: 1+2-3+12-5
Result: -19 // Because 1+2-3+12-5 -> 15+-22-13+ -> 15+-22-13+1 -> -19
// |
// Not valid expression
Input: 2*2*2*2*2
Result: 968 // Because 2*2*2*2*2 -> 22**22**2 -> 22*1*22*1*2 -> 968
// || ||
// Not valid, 1 must be inserted
Input: 17/2
Output: 127 // Because 17/2 = 127/ -> 127/1 -> 127
Les opérateurs qui doivent être pris en charge sont + - * /
. Il n'y aura pas de parenthèses. Les règles mathématiques normales et la "syntaxe" sont utilisées, donc par exemple **
ne signifie pas l'exponentiation. a++++1
est équivalent à a+1
(ie style MATLAB, pas C ++).
En cas de doute, certaines opérations valides sont:
-a
+a
a++b
a+-b
a*-b
a*+b
a*++b
a/b
a/-b
a/+b
-a/--b
Bien que tous les éléments suivants ne soient pas valides. Il est montré avec quoi ils devraient être remplacés:
a+ | a+1
a- | a-1
a++++ | a++++1 (This is equivalent to a+1)
a*+++ | a*+++1 (This is equivalent to a*1)
a**b | a*1*b
a*/b | a*1/b
a/*b | a/1*b
a* | a*1
*a | 1*a
***a | 1*1*1*a
Règles:
- Le code peut être une fonction ou un programme complet
- L'entrée peut être STDIN ou un argument de fonction
- L'entrée doit être une expression mathématique valide, sans guillemets,
''
ou""
. - La sortie doit être la réponse à la nouvelle expression, sous forme d'entier, décimal ou fraction simplifiée.
- Au moins trois chiffres après la virgule décimale doivent être pris en charge. Alors
1/3 = 0.333
non0.33
.0.333333333
est accepté. ans = ...
est accepté.- Les nouvelles lignes et les espaces de début et de fin sont acceptés.
- L'entrée ne sera que des entiers
- La division par zéro peut entraîner une erreur, NaN, Inf etc. La sortie d'un nombre n'est pas acceptée.
Comme toujours, le code le plus court en octets gagne. Un gagnant sera sélectionné une semaine après le jour où le défi a été affiché. Les réponses publiées plus tard peuvent toujours gagner si elles sont plus courtes que le leader actuel.
la source
2^64
, et faut-il une erreur ou un bouclage si vous passez?0/0
si l'expression est égale à une division entière ou modulo par zéro?x/0
c'est une sortie valide. Tant qu'il ne génère pas de réponse incorrecte, c'est OK. L'erreur et "Pas un nombre" est par définition correcte, et l'infini est "assez correct",Réponses:
Perl,
108100octetsLe code est de 96 octets, plus 4 pour l'argument de ligne de commande
-pF//
, où-p
insertswhile (<>) { .. } continue { print }
et-F//
divise l'entrée et la met@F
.Notez que l'entrée ne doit pas avoir de retour à la ligne, utilisez donc
/bin/echo -n 'formula' | perl ...
Moins golfé:
Essai
Mettez ce qui précède dans un fichier appelé
114.pl
et le script de test ci-dessous dans un fichier à côté:Le lancer génère:
Notez que cela
1/0
provoque une division par zéro d'erreur: leseval
sortiesundef
, qui sont représentées par la chaîne vide.la source
JavaScript ES6, 105
106Modifier un octet enregistré thx @Kenney
Extrait de test
la source
p < '0' ? ( c=='/' | c<'+' || ' ' )+c : c ;
.