Aperçu
Étant donné une liste de chiffres, trouvez le moins d'opérations pour faire 100
Contribution
Une chaîne de chiffres, qui peut ou non être dans l'ordre numérique. L'ordre des chiffres ne peut pas être modifié, mais des opérateurs plus (+) ou moins (-) peuvent être ajoutés entre chacun afin que la somme totale soit égale à 100.
Production
Le nombre d'opérateurs ajoutés, suivi de la séquence complète des chiffres et des opérateurs. Les deux peuvent être séparés par un espace, une tabulation ou une nouvelle séquence de lignes.
Exemples
valide
Entrée: 123456789
Sortie:3 123–45–67+89
Entrée non valide : 123456789
Sortie:
6
1+2+34-5+67-8+9
(Il existe des moyens de résoudre ce problème avec moins d'opérations)
+
et-
? Pouvons-nous supposer que nous serons toujours en mesure de faire à100
partir de l'entrée?299399
, serait-299+399
valide?Réponses:
JavaScript (ES6),
153176 octetsEDIT: En mode non strict, JS interprète les expressions numériques à préfixe 0 comme octales (par exemple,
017
est analysé comme 15 en décimal). Il s'agit d'une version fixe qui prend en charge les zéros non significatifs.la source
2-017-2+117
. Mais017
c'est une notation octale en JS, qui donne 15 en décimal. Donc, mon code actuel ne trouve que2-0-17-2+117
. Je vais essayer de résoudre ce problème plus tard dans la journée.3**(l=s.length,l-1)
=>3**~-(l=s.length)
MATL ,
3736 octetsLe cas de test prend environ 6 secondes dans TIO.
Essayez-le en ligne!
Comment ça fonctionne
la source
299399
n'a pas de solution et n'est donc pas une entrée valide (les opérateurs ont été spécifiés pour aller "entre" les chiffres, cette entrée nécessiterait-299+399
où le-
n'est pas entre les chiffres).-299+399
, et dans ce cas, j'ai besoin d' un petit changement dans mon code . J'ai demandé des éclaircissements au PO123456789
devrait avoir un nombre d'opérateurs4
non3
.299399
est une entrée non valide car, comme l'OP l'a également précisé, chaque entrée doit avoir au moins une solution[Python 2],
164158 octetsEssayez-le en ligne!
Prenez N comme une chaîne de chiffres; renvoie un tuple (numOps, expressionString).
Fondamentalement, la même approche que les autres; utilise itertools.product pour construire les "cas" individuels, par exemple pour N == '1322', un "cas" serait
('-','','+')
, et évaluerait '1-32 + 2'.Lance une ValueError si l'entrée n'est pas valide (mais je pense que OP n'a garanti aucune entrée invalide).
la source
PHP,
166171 octetsExécuter en tant que pipe avec
-nR
ou tester en ligne .utilise des nombres formatés pour trier les résultats ->
peut imprimer des blancs en tête (et peut échouer pour la saisie avec plus de 99 chiffres; augmenter le nombre à
%2d
pour corriger).pas plus de 10 chiffres, 161 octets
panne
la source
Gelée , 32 octets
Un programme complet qui s'affiche à l'aide des opérateurs Jelly (
_
au lieu de-
).Remarque: pour afficher
-
dans la sortie au lieu de_
(pas obligatoire), ajoutez⁾_-y
entreF
etṄ
(⁾_-
est un littéral de paire de caractères['_','-']
ety
est l'atome dyadique "translate").Comment?
Essayez-le en ligne!
la source
Mathematica, 136
146149156165166octetsRenvoie
{3, 123-45-67+89}
par exemple.Le test élémentaire prend environ 0,09 seconde.
la source
Python 2 ,
256230208205172171170165 octets, méthode itérativelen(a)
parw
z-=1;d=z
pard=z=z-1
Essayez-le en ligne!
Petite explication En utilisant la représentation en base 3, le code entrelace les chiffres avec les opérateurs {'+', '-', concaténation} selon toutes les combinaisons possibles.
Python 2 , 167 octets, méthode récursive
Essayez-le en ligne!
Quelques sorties
la source
list(input())
par justeinput()
, car une chaîne est déjà itérable pour économiser 6 octets; remplacerb.count('+')+b.count('-')
parlen(b)-len(a)
pour économiser 12 octets; et remplacezchr(r+43)
parchr(r+43)*(d>0!=r-1)
puis vous pouvez supprimer la ligneb=b[:-1].replace(',','')
pour économiser net 15 octets ((d>0!=r-1)
équivaut à(d>0 and 0!=r-1)
).Brachylog , 36 octets
Essayez-le en ligne!
Cependant, plus de la moitié de cela consiste à obtenir le bon format de sortie. La logique de base réelle est seulement:
15 octets
Essayez-le en ligne!
Cela renvoie une liste comme [123, –45, –67,89]. L'expression est la somme des éléments et le nombre d'opérateurs est inférieur de 1 à la longueur de la liste.
~cLhℕ∧100~+L
fonctionne presque pendant 12 octets ( essayez-le en ligne! ) - mais il est trop lent pour gérer la pleine entrée à 9 chiffres sur TIO, et plus important encore, il échoue pour des entrées comme10808
- Brachylog est trop intelligent pour diviser les nombres pour avoir des zéros en tête, donc ne fait pas '' t voir la partition [108, -08].la source
Haskell ,
180178 octetsEssayez-le en ligne! Utilisation:
g "123456789"
rendements(3,"123-45-67+89")
.#
construit une liste de tous les termes possibles,?
évalue un terme etg
filtre les termes qui évaluent à 100 et renvoie celui avec le nombre minimal d'opérandes.la source
Gelée , 27 octets
Essayez-le en ligne!
Je ne peux pas dire que je n'ai pas pris quelques indices de l'ancienne réponse de Jonathan Allan. ;-)
Comparé à sa réponse, celui-ci n'est que de deux octets plus court (30), pas cinq, si nous rendons la comparaison équitable en raison des mises à jour linguistiques:
Si nous comparons dans l'autre sens (une version plus récente au lieu d'une ancienne), la différence est la même (la sienne devient 29 octets, vue ci-dessous):
la source