Dis que j'ai une expression:
9 * 8 + 1 - 4
Cette expression peut être interprétée de six manières différentes, en fonction de la priorité de l'opérateur:
(((9 * 8) + 1) - 4) = 69 (* + -)
((9 * 8) + (1 - 4)) = 69 (* - +)
((9 * (8 + 1)) - 4) = 77 (+ * -)
(9 * ((8 + 1) - 4)) = 45 (+ - *)
((9 * 8) + (1 - 4)) = 69 (- * +)
(9 * (8 + (1 - 4))) = 45 (- + *)
Supposons que je suis un développeur et que je n'aime pas mémoriser les tableaux de priorité, etc., alors je vais deviner.
Dans ce cas, la marge d'erreur la plus grande serait 45-77, soit une différence de 32. Cela signifie que mon estimation ne sera que de 32.
Le défi
Compte tenu d' une expression consistant en les nombres et +
, -
, *
, /
(division entière) et %
, la sortie de différence absolue de la plus grande et la plus petite valeur possible pour cette expression, en fonction de la priorité des opérateurs.
Caractéristiques
- L'expression en entrée ne contiendra pas de parenthèses et chaque opérateur est associatif à gauche.
- L'expression d'entrée ne contiendra que des entiers non négatifs. Cependant, les sous-expressions peuvent donner des résultats négatifs (par exemple
1 - 4
). - Vous pouvez prendre l'expression dans n'importe quel format raisonnable. Par exemple:
"9 * 8 + 1 - 4"
"9*8+1-4"
[9, "*", 8, "+", 1, "-", 4]
[9, 8, 1, 4], ["*", "+", "-"]
- L'entrée contiendra au moins 1 et au plus 10 opérateurs.
- Toute expression contenant une division ou un modulo par 0 doit être ignorée.
- Vous pouvez supposer que modulo ne recevra pas d'opérandes négatifs.
Cas de test
9 * 8 + 1 - 4 32
1 + 3 * 4 3
1 + 1 0
8 - 6 + 1 * 0 8
60 / 8 % 8 * 6 % 4 * 5 63
code-golf
number
arithmetic
expression-building
Fruit d'esolanging
la source
la source
%
avoir deux précédents différents dans votre deuxième exemple.%
fonctionne l'opérateur sur les nombres négatifs? La voie comme C ou Python ou autre chose?Réponses:
Python 2 ,
171156 octetsEssayez-le en ligne!
Comment ça fonctionne
Nous entourons chaque opérateur avec un nombre différent de paires de parenthèses orientées vers l'extérieur pour simuler différentes priorités (de toutes les manières possibles) et encapsulons suffisamment de paires de parenthèses orientées vers l'intérieur autour de la chaîne entière pour obtenir une expression possible
eval
. Par exemple, avec+
↦)+(
*
↦))*((
-
↦)))-(((
on a
9 * 8 + 1 - 4
↦(((9 ))*(( 8 )+( 1 )))-((( 4)))
=77
.la source
or
extérieursum
pour supprimer une couche de crochets:sum([...],[])or[eval(a)]
au lieu desum([...]or[[eval(a)]],[])
sum
peut être vide sans son argument, mais c'est très bien parce que leeval
doit échouer dans ce cas. Merci.Gelée , 126 octets
"Préséance d'opérateur? Parenthèses? Pah, qui a besoin de ça?" - les défis de l'utilisation de Jelly pour un défi de priorité d'opérateur.
Essayez-le en ligne!
L'entrée est considérée comme une chaîne, par exemple "1 + 2_3 × 4: 5% 6". La multiplication de note utilise "×" au lieu de "*", la division utilise ":" au lieu de "/" et la soustraction utilise "_" au lieu de "-".
Fonctionnement Le programme est divisé en trois parties: générer toutes les expressions de préséance d'opérateur différente, les évaluer et renvoyer la différence entre le maximum et le minimum.
Toutes les expressions sont générées avec le code:
Les liens sont évalués avec ceci (je pourrais probablement m'améliorer avec une structure différente):
La différence entre le maximum et le minimum est calculée avec le code dans le lien (5):
la source
Python 2 ,
235234233226 octets-1 octet (et un correctif) grâce à Anders Kaseorg !
-7 octets grâce à Step Hen !
Essayez-le en ligne!
la source
a
un tuple à la place d'une liste, et même économiser 1 octet en procédant de la sorte (a=()
,a+=eval(*l),
).Haskell 582 octets
Cela ne s'est pas passé aussi bien que je l'espérais ...
Essayez-le en ligne!
Essayer de jouer au golf avec un programme long me fait simplement écrire un mauvais code :(
J'ai essayé d'utiliser l'algorithme d'Anders dans Haskell, mais il est sorti de mon contrôle
La fonction e est comme un cas spécifique d’éval. (#) prend une liste de chaînes représentant des nombres entiers et une chaîne d'opérateurs et renvoie la différence entre les valeurs maximales et minimales possibles. par exemple
la source
#
à##
, vous pouvez renommere
à(#)
, comme suit:(n#s)(x:a)=...
r=read;j=zipWith;o=map
puis remplacez ces fonctions par les alias de lettres.Pyth, 45 octets
Je suis sûr que beaucoup d'optimisation peut être faite, mais j'aime bien jusqu'à présent.
Prend entrée comme ceci:
[9, 8, 1, 4], ["*", "+", "-"]
.Essayez-le en ligne!
la source
Mathematica,
186164159 octets\[Function]
prend 3 octets.Quelques alternatives (conserve le même nombre de fois)
#2-#&@MinMax[...]
remplacerMax@#-Min@#&[...]
Head@#2
remplacer#2[[0]]
Essayez-le en ligne sur http://sandbox.open.wolframcloud.com : entrez
( .... )[{60, "/", 8, "%", 8, "*", 6, "%", 4, "*", 5}]
avec le....
code remplacé par le code ci-dessus pour le scénario de test60 / 8 % 8 * 6 % 4 * 5
. Appuyez surShift + enter
pour évaluer.la source
Javascript, 280 octets
Remarque : La division entière arrondit à l'aide de la fonction floor, ce qui signifie que les nombres négatifs s'éloignent de zéro.
Cette solution est basée sur cette réponse .
Exemple d'extrait de code:
la source
a/b|0
arrête la vérification d'erreur divide / modulo 0, mais aMath.floor(a/b)
travailléHaskell , 254 octets
Essayez-le en ligne!
L'entrée est une chaîne complète, telle que 4 + 5 * 2. Elle génère toutes les permutations d'opérations et, pour chaque permutation, scinde la chaîne de manière récursive. Il filtre les divisions par 0 avec la liste monad.
la source
(%)
est opérateur de module. C'est le reste d'une opération de division entre l'argument gauche et l'argument droit.Python 2 ,
262256254 octetsEssayez-le en ligne!
la source
in [
surin[
(l'espace n'est pas nécessaire)PHP , 316 octets
Essayez-le en ligne!
la source
Python 3 , 284 octets
Edit: il semble que quelque chose ne va pas dans l'évaluation du dernier exemple. Je vais y regarder demain.
Une autre réponse en Python. Je ne pouvais pas sur-golfer tous les autres, mais j'ai passé trop de temps sur ça pour ne pas le mettre en place.
Essayez-le en ligne!
la source
while(p)
peut devenirwhile p
pour un octet enregistré.Clojure (+ combinatoire),
342377 + 41 = 418 octets+35 octets à cause d'un bogue.
Essayez-le en ligne!
Pour que cette fonction fonctionne, vous devez utiliser
use
laclojure.math.combinatorics
bibliothèque (41 octets):Nuances:
Cette fonction est une fonction anonyme, ce qui signifie que vous devez le faire pour l'utiliser:
De plus, j'utilise le mot à la
quot
place de/
(puisque Clojure effectue la division de fraction par défaut) et à lamod
place de%
.Programme non-golfé:
la source
use
.The characters used to import the library will likely be counted
codegolf.meta.stackexchange.com/questions/10225/…require
besoins doivent être inclus dans le code et que sa longueur doit être ajoutée au nombre d'octets.JavaScript (ES6), 210 octets
Entrée sous forme de tableau de nombres et d'opérateurs
Moins golfé
Tester
la source