Votre tâche dans ce défi est d'analyser une "équation de matchstick" comme celle-ci ...
... et pour savoir si elle peut être transformée en une équation valide en réorganisant les correspondances. Si c'est le cas, vous devez générer le moins de mouvements pour le faire et l'équation résultante.
Contribution
L'entrée est une chaîne qui peut être lue depuis STDIN, prise comme argument de fonction ou même stockée dans un fichier. C'est une équation qui représente un arrangement d'allumettes et peut être décrite à l'aide de l'EBNF suivant:
input = term, "=", term ;
term = number | (term, ("+" | "-"), term) ;
number = "0" | (numeralExceptZero , {numeral}) ;
numeralExceptZero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
numeral = "0" | numeralExceptZero ;
Un exemple pour une entrée valide serait 3+6-201=0+0+8
.
Tâche
Considérez l'illustration suivante où chaque allumette a un numéro attribué:
Nous mappons maintenant chaque symbole d'entrée aux positions d'allumettes correspondantes comme suit:
0 ↦ 1,2,3,4,5,6
1 ↦ 4,5
2 ↦ 2,3,5,6,8
3 ↦ 3,4,5,6,8
4 ↦ 1,4,5,8
5 ↦ 1,3,4,6,8
6 ↦ 1,2,3,4,6,8
7 ↦ 4,5,6
8 ↦ 1,2,3,4,5,6,8
9 ↦ 1,3,4,5,6,8
- ↦ 8
+ ↦ 8,10
= ↦ 7,9
Chaque formule d'entrée peut être transformée en un arrangement d'allumettes. Par exemple, l'équation "45 + 6 = 92" devient
où les allumettes inutilisées sont grisées. Votre tâche consiste à trouver le moins de allumettes qui doivent être réorganisées afin de rendre l'équation valide.
Production
On distingue trois cas possibles:
- Si l'entrée n'est pas valide (c'est-à-dire qu'elle ne satisfait pas à l'EBNF ci-dessus), sortez ce que vous voulez.
- Sinon, s'il existe des moyens de transformer l'équation en une équation valide en réorganisant les allumettes, vous devez générer à la fois le nombre minimum de réarrangements et l'équation correspondante. Tout comme l'entrée, l'équation sortie doit également satisfaire l'EBNF donné. Dans l'exemple ci-dessus, la sortie correcte serait
1
et46+6=52
. S'il existe plusieurs possibilités pour l'équation résultante, sortez l'une d'entre elles. - Sinon (donc si l'entrée est valide mais qu'il n'y a aucun moyen de rendre l'équation vraie), vous devez sortir
-1
.
Détails
- Vous n'êtes pas autorisé à supprimer ou à ajouter des correspondances. Cela signifie que si l'entrée est constituée d'
n
allumettes, la sortie doit également être constituée exactement d'n
allumettes. - Les blocs d'allumettes "vides" ne sont autorisés qu'à la fin et au début d'une équation, pas au milieu. Ainsi, par exemple, le transformer
7-1=6
en7 =6-1
le supprimant simplement-1
du côté gauche et en l'ajoutant du côté droit avec seulement 3 réarrangements d'allumettes n'est pas autorisé. Comme je ne vois pas vraiment le mappage des nombres aux positions des allumettes comme une partie intéressante de ce défi, pour un plus de 20 octets , vous pouvez soit
- accéder à un fichier dans lequel le mappage
(number/operation ↦ matchstick positions)
est stocké de manière raisonnable, ou - si votre langage de programmation prend en charge un
Map
type de données, supposez que vous avez accès à une carte préinitialisée avec le(number/operation ↦ matchstick positions)
mappage. Cette carte peut par exemple ressembler à ça:{(0,{1,2,3,4,5,6}),(1,{4,5}),(2,{2,3,5,6,8}),(3,{3,4,5,6,8}), ..., (-,{8}),(+,{8,10}),(=,{7,9})}
- accéder à un fichier dans lequel le mappage
Exemples
Entrée: 1+1=3
↦ Sortie: 1
et1+1=2
Entrée: 15+6=21
↦ Sortie: 0
et15+6=21
Entrée: 1=7
↦ Sortie: -1
Entrée: 950-250=750
↦ Sortie: 2
et990-240=750
Entrée: 1-2=9
↦ Sortie: 1
et1+2=3
Entrée: 20 + 3=04
↦ Sortie: n'importe quoi
Gagnant
Il s'agit de code-golf , donc la réponse correcte la plus courte (en octets) l'emporte. Le gagnant sera choisi une semaine après la publication de la première bonne réponse.
0: 1, 2, 3, 4, 5, 6
pour plus de cohérence=
(2 allumettes) et-
(1 allumette) et laisser tous les nombres où ils sont. Si, cependant, le 2 devait être déplacé vers la gauche, vous devrez également compter les mouvements requis.1+1+2=3-6+10
? Et même question sur la sortie.Réponses:
Javascript, 1069 octets
Je l'ai testé avec pas mal d'équations de test et cela semble fonctionner tout le temps maintenant ...
Eh bien, c'est la première fois que je soumets une réponse, donc je ne me vois pas gagner. Il s'agit essentiellement d'une méthode de force brute pour trouver toutes les réponses, puis elle saisit et renvoie les plus petites d'un tableau. avec le premier argument étant la longueur et le second étant un tableau avec les sorties.
si l'entrée est "1-2 = 9", la sortie est [1, ["1 + 2 = 3", "7-2 = 5"]]
et voici le code non compressé:
Avertissement: ne faites pas d'équations comme 950-250 = 750, il utilise ~ 45 allumettes et, car ce code utilise la force brute, il entraînera le blocage de javascript.
la source
var k
dans les boucles en tant que paramètres inutilisés de la fonction, en économisant 3 octets pour chaque déclaration.08=8
pour80=8
est incorrect.Perl, 334
Assez rapide tant que la solution est accessible en 1 ou 2 mouvements. Quand il n'y a pas de solution, vous attendez longtemps, même dans le plus petit des cas
1=7
.Exemple:
Cela ne trouvera pas de solutions qui modifient la durée de l'équasion comme
11=4
->2 11=11
, mais je ne suis pas sûr que ce soit autorisé.la source