Parfois, il est utile d'exécuter un problème mathématique avec plusieurs entrées. Le but de ce défi est de créer un programme qui facilite cette tâche.
Expressions génératrices de nombres
Vous devez prendre en charge 3 types d'expression:
- Générateur de nombre unique: très simple, juste un nombre littéral
- Générateur de nombres multiples: Un peu plus compliqué. Ils sont entourés de crochets (
[]
). Les nombres sont,
séparés par des virgules ( ) dans l'expression. Exemple[-1,2,3.26]
. - Générateur de portée: celui-ci est entouré d'accolades (
{}
). Il aura 3 chiffres séparés par une virgule. Le format de cette expression est{start,stop,step}
.start
etstop
sont inclusifs.
Règles d'évaluation
- Vous devez prendre en charge l'ordre des opérations. ( https://en.wikipedia.org/wiki/Order_of_operations#Definition )
- Vous n'avez pas besoin de prendre en charge les parenthèses.
- Un nombre quelconque d'espaces peut apparaître dans l'expression.
- Vous devez prendre en charge les nombres à virgule flottante (quelle que soit la précision par défaut de votre langue).
- Division par
0
résultats enNaN
(pas un nombre).
Votre programme doit prendre en charge la multiplication ( *
), la division ( /
), l'addition ( +
) et la soustraction ( -
).
Production
Chaque ligne de sortie est l'une des combinaisons des générateurs. Le format est l'expression (avec les nombres réels substitués) suivie d'un signe égal ( =
) et le résultat de l'évaluation. Toutes les combinaisons des générateurs doivent être représentées dans la sortie.
Exemples
( >>>
indique une entrée)
>>>3 * [3,2]
3 * 3 = 9
3 * 2 = 6
>>>{1,2,3}
1 = 1 <-- this is because 1 + 3 > the end
>>>{0,2,1} + {0,1,1}
0 + 0 = 0
1 + 0 = 1
2 + 0 = 2
0 + 1 = 1
1 + 1 = 2
2 + 1 = 3
>>>6/[2,3]
6/2 = 3
6/3 = 2
>>>{1.5,2.5,0.5}
1.5 = 1.5
2 = 2
2.5 = 2.5
>>>3-{6,5,-1}
3-6 = -3
3-5 = -2
>>>5/{-1,1,1}
5/-1 = -5
5/0 = NaN
5/1 = 5
>>>4.4 / [1,2.2] + {0,2,1}
4.4 / 1 + 0 = 4.4
4.4 / 1 + 1 = 5.4
4.4 / 1 + 2 = 6.4
4.4 / 2.2 + 0 = 2
4.4 / 2.2 + 1 = 3
4.4 / 2.2 + 2 = 4
>>> [1,2] / 0 + 5
1 / 0 + 5 = NaN
2 / 0 + 5 = NaN
Le programme doit être court pour que je puisse le mémoriser et l'utiliser n'importe où.
Merci à @PeterTaylor et @geokavel de m'avoir aidé avec ce post dans le bac à sable
x/0
entraîne-t-il une évaluation instantanée de NaN, ou dois-je traiter NaN comme une valeur?Réponses:
JavaScript (ES6),
213211 octetsExplication
Une fonction récursive qui exécute l'expression si elle ne contient pas de générateurs de nombres ou de plages, ou si elle contient l'un de ces générateurs, s'appelle avec le générateur remplacé par chaque nombre produit par elle.
La division par
0
en JavaScript produitInfinity
, doncInfinity
peut simplement être remplacée parNaN
.En utilisant cette méthode, les multi-générateurs sont analysés d'arrière en avant au lieu d'avant en arrière comme dans les cas de test. Cela signifie simplement que l'ordre des expressions de sortie est parfois différent.
Tester
Le test n'utilise pas d'affectations de déstructuration pour la compatibilité du navigateur.
la source
Haskell,
474362 octetsLa fonction f prend une chaîne en entrée et imprime les résultats
tests:
production:
la source
Python 3, 387 octets
Vous pouvez le tester avec le code suivant:
Voici le code non golfé:
Il fonctionne en recherchant le premier ensemble de crochets de tout type, puis en parcourant toutes les valeurs à l'intérieur, en remplaçant les crochets et son contenu par la valeur et en exécutant la méthode de manière récursive. Il utilise
eval
une fois qu'il n'y a pas de crochets dans la ligne. Il retourneNaN
s'il y a une exception en cours d'exécutioneval
.la source
e[:]=s[:]
? Ne ferait pase[:]=s
la même chose?Java, 874 octets
Essai détaillé ici
la source
Dyalog APL , 164 octetsCette réponse ne suit pas les exigences mises à jour et n'est donc pas concurrente:
Il utilise des expressions rationnelles pour changer l'expression donnée dans l'APL correspondant (et tous les opérateurs sont modifiés pour implémenter
NaN
) et pour extraire les opérateurs. Il substitue tous les opérateurs avec caténation et exécute l'expression pour obtenir les nombres d'entrée finaux. Il tisse ensuite le tout pour obtenir le résultat final.Préserve l'ordre d'évaluation de l'APL (strict de droite à gauche).
Gère correctement les parenthèses.
Cas de test (avec des parenthèses ajoutées pour forcer l'ordre d'exécution de type mathématique):
la source