introduction
Il arrive un moment dans l'enfance où vous pensez avoir maîtrisé l'ajout et la multiplication, puis quelqu'un arrive et vous informe que:
a * b + c = (a * b) + c! = a * (b + c),
et que ce n'était pas un processus aussi simple ou linéaire que vous l'avez appris plus tôt. Vous apprenez qu'il existe quelque chose appelé l' ordre des opérations . C'est un moyen très important de conserver un certain niveau de cohérence et d'expressions, sans que les parenthèses ne gênent tout.
Storyline générique
Un jour, vous vous réveillez au son de la panique dans les rues. Un groupe extrémiste sous le nom de " The 2560 " (abréviation de "Organisation Against the Order of Operations", avec une tournure hexagonale stupide) a utilisé ses méthodes diaboliques pour prendre le contrôle de toutes les armes nucléaires dans le monde. Ils tiennent la planète entière en otage, et ils ont une simple demande: inverser l'ordre des opérations accepté ou faire face à l'éradication (les parenthèses doivent maintenir leur priorité). Le nouveau système est appelé PSADME (parenthèses, soustraction / addition, division / multiplication, exposants), et les expressions évaluent de droite à gauche:
a - b - c = a - (b - c) = a + c - b
Les jours passent et la transition est en cours. Alors que les mathématiciens et les physiciens sont tous occupés à réécrire leurs équations, les informaticiens sont confrontés à la tâche de changer la façon dont les expressions mathématiques sont interprétées par les ordinateurs. Vous appartenez à un groupe de programmation rebelle secret qui vise à causer autant de tourments aux nouveaux suzerains mondiaux - et, par hasard, vous êtes sélectionné au hasard par le 2560 et chargé de produire le programme de calcul de référence.
Votre mission
Écrivez un programme (ou une fonction) qui prend une expression mathématique (numérique) en entrée, calcule l'expression en utilisant PSADME comme ordre d'opérations et sort le résultat. Les expressions doivent évaluer de droite à gauche, donc
Par souci de simplicité, tous les nombres fournis seront des nombres entiers et les calculs produiront des résultats entiers.
Règles et notation
- Le programme doit accepter la saisie d'une longueur maximale de 128 caractères - si votre langue / plate-forme a une longueur d'entrée maximale inférieure, c'est une excuse acceptable.
- Les failles standard sont interdites.
- Le code gagnant sera choisi le 18 novembre (4 semaines à compter de cette date de publication).
- N'hésitez pas à publier un code qui ne serait pas considéré comme digne du golf. C'est amusant. Si vous avez une façon intéressante de le faire mais que vous ne pouvez pas la jouer vous-même (ou par la nature de votre méthode), vous pouvez quand même la publier.
Comme d'habitude, le code gagnant est celui avec le moins d'octets, avec quelques bonus de valeur de divertissement:
- -5 pour éviter toute utilisation des caractères dans l'expression fournie: + , - , ( , ) , ^ , * , /
- -5 pour que les calculs prennent plus de 5 minutes (mais pas plus de 10 minutes) pour calculer sur un ordinateur standard, sans que la méthode soit évidente (en utilisant l'horloge ou des boucles inutiles); L'objectif est de convaincre les nouveaux suzerains que vous n'êtes pas essayer de perturber leurs calculs de malheur.
- - (5 + N) pour un message offensif direct (de longueur N, sans inclure les espaces blancs de début / fin) sur les membres du 2560 à écrire à la vue de votre code, avec une explication ridicule pour expliquer pourquoi il doit être Là. S'il est supprimé, le code ne doit pas fonctionner correctement. Oui, des points gratuits pour la valeur de divertissement.
Exemples et explications
[program] 2 - 2 - 2
2
2 - (2 - 2) = 2
[program] (2 + 2 * 3 + 3) / 3 + 3
4
(4 * 6) / (3 + 3) = 4
[program] 3 + 2 + 1 ^ 3
216
(3 + 2 + 1) ^ 3 = 216
[program] -5^2
25
(-5) ^ 2 = 25
[program] 32 / 8 * 3 - 1
2
32 / (8 * (3 - 1)) = 32/16 = 2
1 - 3 + 4 = 1 - 7
? De droite à gauche le suggérerait, mais cela fait passer l'addition avant la soustraction, contrairement au PSADME, non?P(SA)(DM)E
.Réponses:
Haskell, 134 octets
Redéfinir les opérateurs mathématiques avec de nouvelles fixités et priorités. Maintenant:
la source
perl -e'$_="import qualified Prelude as Pl 6^r 8+r 8-r 7*r 7/";s/(. \d(.))/\ninfix\1\n(\2)=(P.\2)/g;s~\./~.div~;print'>a.hs;ghci a.hs
Malheureusement, une faute de frappe a fait que le code généré manque d'espace entre le chiffre et le symbole, mais fonctionne toujours bien. Cela signifie que votre code peut perdre 5 octets et bat mon «amélioration».sed
pour générer et évaluer le code shell. Probablement une bonne méta-question.GNU sed -r avec extension exec, 398
Pas particulièrement court, mais fait le travail.
sed est OK pour analyser la priorité mais ne fait pas d'arithmétique. Nous utilisons donc l'extension GNU sed exec pour le
s
commande pour sous-traiter l'arithmétique nécessaire au shell.Pour l'instant suppose tous les opérateurs, à l'exception d'
^
avoir exactement un espace devant et derrière.Sortie de test:
la source
JavaScript (ES6) 287
300Modifier le bug corrigé (juste une faute de frappe, 6 aurait dû être 4) - Ajout d'une explication complète à la fin de l'extrait
Edit 2 Trouvé une amélioration en travaillant sur un autre défi
Encore un autre portage du même analyseur avec juste une différence minime. (comparer avec cela )
la source