Contexte
Vous avez récemment été embauché par un petit cabinet comptable. Le monde de la comptabilité vous est quelque peu étranger, vous ne savez donc pas si vous suivez toutes les directives professionnelles. En particulier, vous ne savez pas quand vous devez arrondir tous ces chiffres et dans quelle direction, donc la plupart du temps, vous vous contentez de l'ailer et d'espérer le meilleur.
Contribution
Votre entrée est une chaîne unique qui représente un calcul simple. Il contient un certain nombre d'entiers non négatifs délimités par les caractères +-*/
. La chaîne se lit de gauche à droite et les règles de priorité normales sont ignorées, ce qui "23+1*3/4"
signifie "commencez par 23, ajoutez 1, multipliez par 3 et divisez par 4", le résultat étant 18. L'entrée ne contiendra pas de nombres commençant par 0
(sauf 0
lui-même), ni une division par zéro.
Production
À chaque étape du calcul, vous pouvez soit arrondir le résultat vers le haut ou vers le bas à l'entier le plus proche, soit le conserver tel quel. Enfin, vous arrondissez vers le haut ou vers le bas pour obtenir un résultat entier. Votre sortie est la liste des entiers pouvant résulter d'un tel calcul, triés et sans doublons.
Règles
Vous pouvez écrire soit un programme complet soit une fonction. Le nombre d'octets le plus bas gagne et les failles standard sont interdites.
Cas de test
"42" -> [42]
"2+0+4-0" -> [6]
"23+1*3/4" -> [18]
"5/2" -> [2,3]
"5/2+7/3*6-1" -> [17,18,19,23]
"23/2/2*30-170/3" -> [-7,-6,-2,-1,0,1,3,4]
"1/3*2*2*2*2*2*2" -> [0,16,20,21,22,24,32,64]
"1/3*9" -> [0,3,9]
1/3*9
, qui peut échouer si vous utilisez des nombres à virgule flottante.Réponses:
J, 84 octets
À partir d'une liste à 1 élément, la fonction conserve tous les nombres intermédiaires possibles dans la liste en évaluant l'expression suivante et en ajoutant ses copies arrondies de haut en bas.
Va jouer au golf plus loin et ajouter des explications demain.Impossible de trouver des façons évidentes de jouer au golf plus.Réussit tous les tests.
Usage:
Essayez-le ici.
la source
x
à la fin de la liste.Python 2, 220 caractères
Il conserve une liste de tous les numéros possibles et, à chaque étape, génère trois numéros pour chaque numéro de la liste, même s'il y a des doublons. La complexité d'exécution est donc exponentielle. Cependant, cela fonctionne instantanément pour ces petits exemples. Les doublons sont retirés à la fin.
Il utilise
fractions.Fraction
pour faire une division exacte, en évitant les inexactitudes en virgule flottante.Ajoutez 5 caractères (
r=map(X,g)
->r=set(map(X,g))
) pour augmenter considérablement les performances.la source
\D
est une classe de caractères prédéfinie pour faire correspondre les non-chiffresr"(\D)"
ou"(\\D)"
. De plus, si vous utilisez Python 3, vous pouvez remplacer l'indexation dansF
avec une affectation étoilée, par exemple:,A,B,*F=F
utilisezA
etB
au lieu deF[0]
etF[1]
, et supprimez-lesF=F[2:]
."\D"
finit quand même par fonctionner et c'est plus court. Ce n'est pas une séquence d'échappement valide, donc Python inclut juste le\
etD
textuellement. Bon conseil Python3 en fait, je vais le vérifier, bien que je doive remplacer les backticks parrepr()
et transformer lemap
résultat en liste. Je souhaite que Python 2 ait une affectation préférée.Python,
421370354 octetsDésolé, veuillez me supporter. Je suis vraiment nouveau sur python (je cherchais juste un langage qui supporte la fractiosn) et j'ai utilisé toutes les quelques astuces que je connaissais pour raccourcir le code mais c'est toujours un monstre étant donné qu'il existe une solution python de presque la moitié de la taille. J'ai beaucoup appris et j'ai pensé le soumettre quand même =)
Nouvelle version grâce à @ kirbyfan64sos et @Zgarb
Ancienne version
la source
if
s (d={'+': operator.add, '-': operator.sub, ...}; d[op](a, b)
). En outre,[floor(k) for k in n]
peut être raccourcimap(floor, n)
et lesn.add
appels peuvent devenirn.extend([floor(f), ceil(f), f])
.F
qu'une seule fois, vous pouvez donc le fairefrom fractions import*
et enregistrer quelques octets. Même chose avecmath
. Supprimez les espaces autour=
, ils sont inutiles. En outre, vous devez affecter l'entrée às
au lieu du codage en dur.s=input()
plutôt ques = "1/3*9"
, supprimez vos commentaires, etc.Mathematica, 134
la source
MATLAB, 283 caractères
Non golfé:
En écrivant ceci, j'ai réalisé qu'il y avait une manière encore plus courte de le faire, que j'ajouterai une fois que j'aurai fini de l'écrire.
la source
VBA, 347 octets
la source