On vous donne une liste de numéros L = [17, 5, 9, 17, 59, 14]
, un sac d'opérateurs O = {+:7, -:3, *:5, /:1}
et un numéro N = 569
.
Tâche
Générez une équation qui utilise tous les nombres L
du côté gauche et uniquement le nombre N
du côté droit. Si ce n'est pas possible, sortez False. Exemple de solution:
59*(17-5)-9*17+14 = 569
Limitations et clarification
- Vous ne pouvez pas concaténer des numéros (
[13,37]
ne peut pas être utilisé comme1337
) - Seuls les nombres naturels et zéro apparaîtront dans
L
. - L'ordre
L
n'a pas d'importance. - Vous devez utiliser tous les chiffres dans
L
. - Seuls les opérateurs
+
,-
,*
,/
apparaîtrontO
. O
peut avoir plus d'opérateurs que vous n'en avez besoin, mais au moins les|L|-1
opérateurs- Vous pouvez utiliser chaque opérateur autant de fois que vous le souhaitez
O
. - Les quatre opérations dans
O
sont les opérations mathématiques standard; en particulier,/
est une division normale avec des fractions exactes.
Points
- Moins il y a de points, mieux c'est
- Chaque caractère de votre code vous donne un point
Vous devez fournir une version sans golf facile à lire.
Contexte
Une question similaire a été posée sur Stack Overflow. Je pensais que cela pourrait être un défi de golf de code intéressant.
Complexité informatique
Comme l'a dit Peter Taylor dans les commentaires, vous pouvez résoudre la somme des sous-ensembles avec ceci:
- Vous avez une instance de somme de sous-ensemble (d'où un ensemble S d'entiers et un nombre x)
- L: = S + [0, ..., 0] (| S | fois un zéro), N: = x, O: = {+: | S | -1, *: | S | - 1, /: 0, -: 0}
- Maintenant, résolvez cette instance de mon problème
- La solution pour la somme des sous-ensembles est le nombre de S qui ne sont pas multipliés par zéro.
Si vous trouvez un algorithme meilleur que O (2 ^ n), vous prouvez que P = NP. Comme P vs NP est un problème de prix du millénaire et vaut donc 1 000 000 de dollars américains, il est très peu probable que quelqu'un trouve une solution à cela. J'ai donc supprimé cette partie du classement.
Cas de test
Les réponses suivantes ne sont pas les seules valides, d'autres solutions existent et sont autorisées:
- (
[17,5,9,17,59,14]
,{+:7, -:3, *:5, /:1}
,569
)
=>59 * (17-5)- 9 * 17 + 14 = 569
- (
[2,2]
,{'+':3, '-':3, '*':3, '/':3}
,1
)
=>2/2 = 1
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,16
)
=>5+10-2*3+7+0+0+0+0+0+0+0 = 16
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,15
)
=>5+10+0*(2+3+7)+0+0+0+0+0+0 = 15
la source
m = |L|
? Si oui, comment pouvez-vous vous attendre à ce que le runtime ne dépende pas de la taille de cette liste? Par exemple[2,2],[+,+,...,+,/],1
,. En fait, puisque n est O (m), vous pourriez simplement tout écrire en termes de m./
≡div
), juste des erreurs à virgule flottante et sans espoir d'arrondi, ...?5+10+2*3+7*0+0...
Réponses:
Caractères Python 2.7 / 478
L'idée principale est d'utiliser la forme postfixe d'une expression pour rechercher. Par exemple,
2*(3+4)
sous forme de suffixe sera234+*
. Le problème devient donc de trouver une permutation partielle deL
+O
qui s'évalueN
.La version suivante est la version non golfée. La pile
stk
ressemble[(5, '5'), (2, '5-3', (10, ((4+2)+(2*(4/2))))]
.la source
P[opr](v1, v2)
. Je n'ai jamais pensé à combiner des lambdas et des dictionnaires comme celui-ci, bien que cela semble évident maintenant.