Inspiré par /puzzling/24334/to-catch-a-thief
Vous obtenez une grille n
par n
( n
elle-même est une entrée facultative) remplie de 0
s et 1
s (ou tout autre caractère de votre choix). Votre objectif est de rendre chaque cellule identique (soit 0
ou 1
). Vous pouvez effectuer une série de mouvements comme défini ci-dessous (notez la différence avec le lien Puzzling SE):
- Sélectionnez une cellule.
- Chaque cellule de la même ligne et colonne (à l'exception de la cellule elle-même) est transformée en son contraire.
0
vers1
et1
vers0
.
Générez le nombre minimum de mouvements requis pour terminer la tâche. Si insoluble, sortez tout sauf un entier non négatif. Le code le plus court gagne.
Exemples de données
1 0 0
0 0 0
0 0 0
-1
1 1 1
1 1 1
1 1 1
0
1 0 1
0 1 0
1 0 1
1
1 1 1 1
0 0 0 0
0 0 0 0
1 1 1 1
2
0 1 0 1
1 0 1 0
1 0 1 0
0 1 0 1
2
code-golf
grid
puzzle-solver
path-finding
ghosts_in_the_code
la source
la source
1000
(réarrangé en carré, peu importe comment).Réponses:
Matlab 171 octets
L'entrée doit être une matrice 2d, vous pouvez donc l'appeler comme
c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(les points-virgules commencent une nouvelle ligne). Cette fonction renforce simplement tous les mouvements possibles, nous obtenons donc un runtime deO(2^(n^2))
.Comment c'est fait
Cela se fait en choisissant toutes les façons possibles de remplir une autre matrice de la même taille avec des uns et zéro, c'est essentiellement compter en binaire où chaque entrée de la matrice représente une certaine puissance de 2.
Ensuite, nous effectuons les déplacements sur les cellules qui sont 1, cela se fait par la somme (mod 2) de deux convolutions bidimensionnelles avec un vecteur de celles de taille 1xn et nx1.
Enfin, nous décidons si ces mouvements ont réellement produit le résultat souhaité, en calculant l'écart type sur toutes les entrées. L'écart type n'est de zéro que si toutes les entrées sont identiques. Et chaque fois que nous avons réellement trouvé le résultat souhaité, nous le comparons avec le nombre de mouvements des solutions précédentes. La fonction reviendra
inf
si le problème donné n'est pas résolu.Math?
Il est en fait intéressant de noter que tous ces mouvements génèrent ensemble un groupe abélien! Si quelqu'un parvient à calsifier ces groupes, faites-le moi savoir.
Version golfée:
Version complète (avec la sortie des mouvements réels.)
la source
Perl 5, 498 octets
Cela accepte «n» et le résultat souhaité, et génère le nombre, ou «X» si aucun.
Par exemple:
donne
2
. Cela ne fonctionnera que lorsque n ^ 2 <= 64, doncn <= 8
. Bien qu'il soit assez lent même avec n aussi faible que 5. Il construit un tableau ^ 3 bits et trie un tableau 2 ^ (n ^ 2) au préalable, car pourquoi pas ?J'ai gaspillé quelques sauts de ligne ici pour plus de lisibilité :
la source