Étant donné une chaîne de caractères +=-
où il y en a au moins un =
, insérez des entiers positifs entre tous les symboles et au début et à la fin de sorte que les équations mathématiques soient satisfaites.
Par exemple, étant donné l'entrée
+-=-=
vous devez insérer des entiers positifs A à F comme celui-ci
A+B-C=D-E=F
de telle sorte que les équations sont toutes satisfaites, c'est A + B - C
-à- dire et D - E
et F
sont toutes le même nombre.
Il existe de nombreuses façons de le faire puisque, tant que les équations fonctionnent, tout ensemble d'entiers positifs peut être utilisé. Chaque ligne ici est une sortie valide possible à saisir +-=-=
:
2+3-4=6-5=1
1+1-1=2-1=1
4+2-4=4-2=2
100+1-10=182-91=91
89+231-77=1024-781=243
Notez que la valeur des expressions n'est pas obligatoirement un entier positif comme le sont les nombres insérés. Par exemple, pour une entrée donnée, -=-
les sorties 1-10=8-17
(Evals à -9) et 10-1=17-8
(Evals à 9) sont toutes deux également valables. Bien sûr, pour certaines entrées comme =
il est impossible d'avoir un négatif comme expression car seuls des nombres positifs comme 5=5
peuvent être insérés.
Notez également que zéro n'est pas un entier positif.
Le code le plus court en octets gagne.
Vous pouvez afficher les nombres sous forme de liste au lieu de les insérer directement dans la chaîne. Si vous sortez la chaîne, il peut y avoir des espaces séparant les symboles et les nombres. Donc, pour l'entrée +-=-=
, la sortie
2, 3, 4, 6, 5, 1
ou
2 + 3 - 4 = 6 - 5 = 1
équivaut à la sortie
2+3-4=6-5=1
Cas de test
Input | One Possible Output
= | 1=1
== | 2=2=2
+= | 1+3=4
=+ | 2=1+1
-= | 30-10=20
=- | 1=2-1
=-= | 3=7-4=3
=+= | 2=1+1=2
=== | 100=100=100=100
+=- | 3+2=7-2
-=+ | 7-2=3+2
+=+ | 3+3=3+3
-=- | 1-10=8-17
--= | 60-1-1=58
++= | 60+1+1=62
-+= | 60-9+1=52
+-= | 60+9-1=68
+-=-= | 2+3-4=6-5=1
--=-- | 2-1-1=2-1-1
==-== | 47=47=50-3=47=47
=++=+-=-+=--= | 3=1+1+1=3+1-1=1-1+3=5-1-1=3
+--++-=-+-+- | 35+10-16-29+20+107-1000=5-4+3-2+1-876
====== | 8=8=8=8=8=8=8
la source
Réponses:
Rétine , 58 octets
Essayez-le en ligne!
Solution alternative au même nombre d'octets:
Essayez-le en ligne!
Explication
L'idée de base est de transformer tous les
+
s et-
s en simples+1
et des-1
opérations, puis à préfixer un assez grand nombre qui fait tout le travail des équations. Pour faire correspondre les équations, nous pouvons simplement ajouter le même nombre à chacun d'eux, puis le réduire d'un pour chacun+1
et l'augmenter d'un pour chacun-1
après. Puisque nous travaillerons avec des nombres unaires, le seul problème est que le premier nombre doit être suffisamment grand pour que nous puissions le réduire de 1 fois suffisamment.Nous commençons par insérer un
1
après chaque-
ou+
.Le
\B
s'assure que ces correspondances sont soit au début de l'entrée, soit entre a=
et a+
ou-
, c'est-à-dire toutes les positions où l'on veut insérer le numéro de tête d'une expression. La((\+1)|(-1))*
partie compte alors simplement le nombre de+1
s et de-1
s dans les groupes2
et3
respectivement. Maintenant, décomposons la chaîne de substitution:Supprimez à plusieurs reprises
1_
de la chaîne, en appliquant l'annulation requise de l'+1
art.Enfin, remplacez toutes les chaînes de
1
s par leurs longueurs pour convertir de unaire en décimal.la source
Python 2 , 76 octets
Essayez-le en ligne!
la source
eqtn_len + plus_signs + minus_signs - 2 * plus_signs = eqtn_len + minus_signs - plus_signs
. Puis, comme tous les autres nombres du bloc sont des nombres, le total du bloc est égal àeqtn_len + minus_signs - plus_signs - minus_signs + plus_signs = eqtn_len
. La longueur de l'équation doit être positive, donc tout fonctionne.Python 2,
199179178172162158156152151 octetsBeaucoup trop long, mais la solution était facile à créer.
Essayez-le en ligne
Cela tentera toutes les possibilités jusqu'à ce qu'il trouve une solution. Le programme est extrêmement lent. Il effectue également le remplacement de chaîne à chaque itération. L'édition "172" l'a rendu considérablement plus lent, car plutôt que de commencer par une petite plage, il commence au maximum. Par exemple, les entrées
-=
ou=+
doivent essayer 2 ** 32 tentatives avant d'arriver à une solution.Pour accélérer le programme, utilisez la version avec 178 octets de l'historique des modifications.
la source
range
En python2, ne crée- t-il pas immédiatement toute la plage sous forme de liste? IIRC vous pouvez accélérer en utilisant à laxrange
place, car je pense que c'est la version à chargement paresseux (Python3 utilise paresseux par défautrange
)print range(1,65537)
et cela s'est terminé en 0,034 s.l=...
, mais en mettant cela dans leproduct(range(...),repeat=len(s)+1)
. Si vous avez besoin de parenthèses, illen(s)+1
, je pourrais utiliser à la-~len(s)
place, ce qui ne nécessiterait pas de parens.JavaScript (ES6),
9282 octetsGolfé 8 octets avec un tour de @xnor
L'astuce consiste à insérer un
1
après chaque+
ou-
, puis à ajouter à chaque expression le nombre qui rend l'expression égale à la longueur de l'entrée. De cette façon, nous pouvons garantir que le nombre est toujours positif; comme il y a toujours au moins 1=
dans la chaîne, le nombre de+
s ne peut jamais atteindre la longueur de la chaîne, donc le reste est toujours au moins1
. Vous pouvez le vérifier en tapant un nombre arbitraire de+
s dans l'extrait ci-dessus.la source
Python 2 ,
120119 octets-1 octet grâce à mbomb007
Essayez-le en ligne! ou vérifier tous les cas de test
D'abord, j'insère
1
dans chaque position, pour vérifier la valeur la plus élevée, puis je l'ajoute comme décalage sur chaque équation. Cela fonctionne parce que vous ne pouvez pas ajouter de nombres négatifs, donc le résultat minimum est donné par le montant de+
l'équation qui n'a que+
.la source
GNU Prolog, 156 octets
Explication
Nous avons un tas d'équations à résoudre, alors pourquoi ne pas utiliser un véritable solveur d'équations?
x
est essentiellement un évaluateur d'équations pour les équations de la forme+-+
; en plus de l'équation elle-même, elle a deux arguments supplémentaires (une liste de différencesL,R
qui contient les valeurs de l'équation et une valeur àV
laquelle l'équation évalue). Comme d'habitude dans Prolog, il peut être utilisé dans tous les sens (par exemple, vous pouvez spécifierV
et obtenir unL,R
, spécifierL,R
et obtenir unV
, spécifier les deux et vérifier que la valeur est correcte, ou spécifier ni l'un ni l'autre dans ce cas, les contraintes appropriées seront placées sur les deuxV
etL,R
). "L'élément actuel" deL,R
est nomméE
, et nous incluons également une affirmation selon laquelleE
est supérieur à 0 (car la question nécessite l'utilisation de nombres positifs). Cette fonction est légèrement plus détaillée que je ne le souhaiterais, par exemple j'ai dû écrire le[E|R]
motif match / unmatch deux fois, car les listes sont associatives à droite mais l'addition et la soustraction sont associatives à gauche. Malheureusement, nous devons utiliser une liste réelle, plutôt que d'inventer notre propre type de liste associative de gauche à partir de cellules par contre, pourfd_labeling
fonctionner.q
est similaire àx
, mais comprend également=
. Il appelle simplementx
et récursivement. Soit dit en passant, c'est une démonstration très claire du fonctionnement des listes de différences, montrant que vous pouvez concaténer deux listes de différencesL,T
etT,R
en une seule liste de différencesL,R
. L'idée de base est qu'une liste de différences est une fonction partielle qui prend un argumentR
et retourne une valeurL
qui lui est ajoutéeR
par la liste elle-même. Ainsi, en identifiant l'argument d'une liste de différences et la valeur de retour d'une autre, nous pouvons composer les fonctions, et donc concaténer les listes.Enfin,
s
qui est la fonction qui résout réellement la tâche dans la question, est une fonction wrapper qui appelleq
avec des arguments. Nous convertissons la liste des différences en une liste régulière en fournissant[]
comme argument et utilisonsfd_labeling
pour trouver une solution à l'équation que nous avons construite. (Par défaut, il semble aimer définir des valeurs à 1 s'il n'y a aucune raison de les définir sur autre chose. Cependant, il peut être configuré;value_method(random)
donne des solutions plus "intéressantes" que de mettre des 1 partout, par exemple, et est toujours très rapide. )Exemple de sortie
Avec le programme tel qu'écrit:
Si je rallonge le programme pour en ajouter un
value_method(random)
, le résultat varie, mais ressemble à ceci:Dans les deux cas, la
?
fin de la sortie signifie qu'il peut y avoir plus d'une solution. (Bien sûr, dans ce cas, nous savons qu'il existe bien plus d'une solution!)la source
Mathematica, 116 octets
Fonction pure prenant une chaîne en entrée et renvoyant une liste d'entiers positifs. Stratégie de base: nous ajoutons toujours 1 et soustrayons 1, et nous choisissons les nombres initiaux dans chaque expression pour que tout soit égal.
c=Characters@StringSplit[#,"="]/."+"->-1/."-"->1
diviserait la chaîne d'entrée à chaque signe égal, puis remplacerait chaque+
par-1
et chaque-
par1
. Cependant, s'il y a un signe égal au début ou à la fin, il serait ignoré. Par conséquent, nous ajoutons artificiellement un nouveau caractère à chaque extrémité ("0"<>#<>"0"
) et le faisons disparaître une fois le fractionnement de chaîne terminé (/."0"->Nothing
).Le total de chaque sous-liste est maintenant égal à un entier que nous pouvons mettre devant le
+
s et le-
s pour rendre chaque expression égale.1-Min[Tr/@c]
est le plus petit entier que nous pouvons ajouter à chaque total pour les rendre tous positifs.Prepend[#^2,1-Min[Tr/@c]+Tr@#]&
Prend donc chaque sous-liste (les^2
transforme toutes leurs entrées1
) et ajoute son total décalé par ce plus petit entier compensateur. Les listes résultantes sontJoin
éditées ensemble pour produire la sortie.la source
Rubis, 76
La valeur cible des expressions est fixée à
5**8
moins 1 pour des raisons de golf! À l'origine, j'utilisaiss.size+1
moins 1.Non testé dans le programme de test
Sortie
la source
PHP,
207204197114 octetsapproche directe: beaucoup plus courte et plus rapide
Exécutez-le
echo '<input>' | php -nR '<code>'
ou testez-le en ligne .panne
!$c
est vrai dans la première itération, transtypé en1
pour l'indexation des chaînes;"="[1]
est vide.Après cela,
$c
est défini et!$c
faux, transtypé en0
et"="[0]
est le premier caractère.donc nous sommes définitivement en sécurité avec la longueur de l'entrée. Tous les termes seront évalués à cela.
chunk_split($s,$n,$i)
insère$i
après chaque$n
caractère de$s
- et à la fin.Pour éviter que les termes vides ne se transforment en
1
, une erreur est forcée en définissant la longueur du bloc sur0
.la source
Roda ,
112110109 octetsEssayez-le en ligne!
La fonction de division n'a pas fonctionné comme je l'avais prévu avec ce programme. Par exemple,
split("", sep="")
renvoie une chaîne vide au lieu de rien. Comment est-ce logique? Pour cette raison, le programme est près de 20 octets plus grand que ce qu'il pourrait être si la sémantique divisée était idéale.L'idée de cette réponse est que nous savons que la longueur de la chaîne d'entrée doit être supérieure ou égale à la valeur de l'équation, nous définissons donc la valeur de l'équation comme étant la longueur de la chaîne. Pour chaque partie de l'équation, nous pensons que chaque opérateur étant
+1
ou-1
et soustrayons et les ajoutons à la valeur de l'équation.Non golfé:
la source