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
/
≡ div
), juste des erreurs à virgule flottante et sans espoir d'arrondi, ...?
5+10+2*3+7*0+0...
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.