Créez un programme ou une fonction pour supprimer un carré de chiffres en inversant (en inversant le point central) uniquement les lignes et les colonnes.
Contribution
L'entrée sera une grille de chiffres 9x9 sous la forme d'une chaîne de 9 lignes comme celle-ci:
986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378
Ce format d’entrée n’est pas négociable. Toute solution "créative" avec le format d’entrée sera considérée comme non valide.
Sortie
La sortie doit être une liste de mouvements d'inversion qui, lorsqu'ils sont appliqués à l'entrée dans l'ordre donné, doivent recréer la grille cible.
Un exemple de sortie (pas une solution à l'exemple d'entrée précédent):
28IF5D3EAB9G3
Ce format de sortie est également non négociable. Il ne doit y avoir aucune nouvelle ligne ni espace dans la sortie, seuls les caractères 1
- 9
et A
- I
(les minuscules sont acceptables à la place des majuscules si vous préférez).
La grille cible (l'état que vous devez recréer) est la suivante:
123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
Les chiffres 1
- 9
doivent être utilisés comme instructions pour retourner les lignes, et les lettres A
- I
doivent être utilisés pour les colonnes. Ceci est montré ci-dessous avec la grille dans son état restauré.
ABCDEFGHI
|||||||||
vvvvvvvvv
1 -> 123456789
2 -> 234567891
3 -> 345678912
4 -> 456789123
5 -> 567891234
6 -> 678912345
7 -> 789123456
8 -> 891234567
9 -> 912345678
Donc, un 8
moyen retourne la deuxième ligne à partir du bas et un F
moyen retourne la sixième colonne.
Si aucune solution n'est possible, le programme doit se terminer sans rien afficher.
Exemples
Contribution:
987654321
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
Sortie:
1
Dans ce cas, seule la rangée supérieure doit basculer pour revenir à l'état d'objectif.
Contribution:
123456788
234567897
345678916
456789125
567891234
678912343
789123452
891234561
912345679
Sortie:
I
Dans ce cas, seule la dernière colonne (colonne I
) doit être retournée pour recréer l'état de l'objectif.
Contribution:
123456788
798765432
345678916
456789125
567891234
678912343
789123452
891234561
912345679
Sortie:
2I
Dans ce cas, nous devons retourner une ligne 2
puis une colonne I
pour revenir à l'état d'objectif.
Remarques:
- Veuillez inclure un exemple d'utilisation dans votre réponse.
- La sortie donnée ne doit pas nécessairement être la séquence la plus courte qui retournera l'état de l'objectif - toute séquence renvoyant l'état de l'objectif fera l'affaire aussi longtemps que cela fonctionnera (c'est-à-dire tant que je pourrai le tester)
- Je vais essayer de tester chaque réponse et de lever le vote vers tous ceux qui travaillent et qui ont manifestement tenté de jouer au golf.
- Il s'agit d'un concours ouvert - j'accepterai la réponse la plus courte la semaine prochaine, mais si une nouvelle réponse valide est fournie, elle est plus courte à l'avenir, je modifierai la réponse acceptée en conséquence .
La prime a été fixée à 200 points de réputation pour la réponse la plus courte reçue le 26/01/2014 à 23:59:59 (GMT).La prime a été attribuée à Howard pour sa solution GolfScript à 268 caractères .
Essai
Veuillez fournir la réponse de votre programme pour les trois grilles de test suivantes:
986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378
927354389
194762537
319673942
351982676
567891234
523719844
755128486
268534198
812546671
813654789
738762162
344871987
341989324
567891234
576217856
619623552
194435598
926543271
J'ai créé un petit programme Python pour générer des grilles valides à des fins de test:
import random
def output(array):
print '\n'.join([''.join(row) for row in array])
def fliprow(rownum, array):
return [row[::1-2*(rownum==idx)] for idx,row in enumerate(array)]
def flipcol(colnum, array):
return zip(*fliprow(colnum, zip(*array)))
def randomflip(array):
op=random.randint(0,1)
row=random.randint(0,9)
if(op==1):
return fliprow(row, array)
else:
return flipcol(row, array)
def jumble(array):
arraycopy=array
for i in range(10, 1000):
arraycopy=randomflip(arraycopy)
return arraycopy
startarray=[
['1','2','3','4','5','6','7','8','9'],
['2','3','4','5','6','7','8','9','1'],
['3','4','5','6','7','8','9','1','2'],
['4','5','6','7','8','9','1','2','3'],
['5','6','7','8','9','1','2','3','4'],
['6','7','8','9','1','2','3','4','5'],
['7','8','9','1','2','3','4','5','6'],
['8','9','1','2','3','4','5','6','7'],
['9','1','2','3','4','5','6','7','8']]
print output(jumble(startarray))
(-2, 4)
,(2, 4)
,(2, -4)
ou(-2, -4)
.A1
) et déplacez-la versB1
. Vous pouvez obtenir un1
pour la positionB1
, mais ce sera la tuile deB9
, pas la tuile deA1
. Étant donné que nous ne sommes autorisés à effectuer des renversements que dans des rangées / colonnes entières, le premier en haut ne se trouvera jamais que dans l'un des quatre coins les plus à l'extérieur. Si je me suis trompé, veuillez me le faire savoir.Réponses:
GolfScript,
300279268 caractèresNotez que ce code est extrêmement lent (également en raison d'une manipulation lourde de bloc de code) et peut s'exécuter pendant plusieurs minutes. Le code est très peu-golfscript-ish avec beaucoup de variables et de boucles explicites.
J'avais écrit une solution plus analytique qui durait moins d'une seconde. Je l'ai complètement cassé en jouant au golf. Malheureusement, je n'ai pas pu revenir en arrière ou réparer le code au cours des deux derniers jours. Par conséquent, j’ai produit cette version d’essai et de vérification qui est de toute façon plus courte.
Les réponses aux énigmes données ci-dessus:
la source
Mathematica
582575503464282Pour me battre avec les golfeurs, je dois utiliser de l'artillerie lourde!
Sortie:
Ici,
PermutationGroup[...]
met en place des retournements possibles etGroupElementToWord[...]
résout le problème (environ0.2
seconde). Le problème principal est qu’il est difficile d’identifier la correspondance entre la position de9
dans la grille initiale et la grille finale. Pour le golf, je le fais au hasard (cela prend plusieurs secondes). Il y a des avertissements mais on peut les ignorer.Autre pour tester les grilles:
Il reproduit complètement les exemples:
Solution précédente (464)
sans fonctions intégrées intelligentes et avec un temps d'exécution de 4 ms:
Toutes les nouvelles lignes ici ne sont pas nécessaires.
Sortie:
Deux autres grilles de test:
Visualisation:
La chaîne de saisie
i
peut être générée aléatoirement parBrève discussion
Les flips peuvent uniquement interchanger ces éléments ("quadruple"):
Il est possible d'échanger ces éléments séparément des autres éléments uniquement si l'ordre initial et l'ordre final ont la même signature.
Des flips de ces quatre éléments forment le groupe alternant du degré 4 (= groupe de rotations du tétraèdre). Chaque élément de ce groupe est une composition de 2 éléments générateurs. Donc, si nous connaissons la position initiale et finale, nous pouvons décomposer la transformation correspondante en combinant de simples retournements.
Détails
Pour l'esprit sportif, j'affiche les détails avant la fin de la prime!
Convertissez la chaîne
i
en matriceM
.Nous allons ajouter des caractères à
S
. Maintenant c'est la chaîne vide.H[i,j]
ajoutera le caractèrei
(1,2,3,...,9
) et le caractèrej
(a,b,c,...,i
en base 36).Je convertis des éléments en tant que
pour obtenir la matrice cible sous la forme suivante
Ensuite, il y a deux étapes principales dans mon algorithme
Trouvez des flips pour obtenir les signatures comme dans la matrice cible (par exemple, la signature de
{-7,-1,1,7}
is1
et la signature de{-6,2,-2,6}
is-1
):Faites pivoter chaque "quadruple" pour obtenir le bon ordre:
C'est la partie la plus non triviale de l'algorithme. Par exemple, la transformation
1b1b
sera convertie{-7,-1,1,7}
en{-1,1,-7,7}
. La transformation9h9h
sera convertie{-7,-1,1,7}
en{-7,7,-1,1}
. Donc nous avons deux carteset nous voulons convertir un ordre arbitraire
{x,y,z,w}
en{1,2,3,4}
. La méthode simple est (sauf une recherche aléatoire)Je ne peux pas le prouver, mais ça marche!
La dernière étape est
Il effectue des retournements triviaux de la ligne centrale et de la colonne centrale et renvoie le résultat.
la source
J
487438d
est un verbe qui prend une chaîne de grille au format spécifié et renvoie une chaîne de solution au format spécifié.Exemple d'utilisation:
Accepte maintenant l'un ou l'autre type de nouvelle ligne.
Solutions aux grilles de test:
Je suis assez nouveau pour J; cela pourrait probablement être joué au golf encore plus loin.
La vérification des grilles invalides / insolubles entraîne une pénalité de 123 caractères. Je ne pense pas que les autres réponses à ce jour comportent une telle vérification d'erreur.
Pour ce faire, changez la première ligne
d
en ceci:et la dernière ligne à ceci:
J'ai choisi de revenir
0
sur des erreurs telles que renvoyer une chaîne vide serait impossible à distinguer de la résolution correcte d'une grille entièrement résolue. Notez que cela suppose (encore une fois) les retours à la ligne UNIX.la source
LF
s représentent les partitions du fichier séquentiel.C #
540399Eh bien, performance sacrifiée (cela prend maintenant jusqu’à 30 secondes), introduction de variables dynamiques, modification légèrement de la logique de la solution. Et oui, il attend maintenant une entrée sous la forme d'une chaîne avec des sauts de ligne (comme requis dans les règles).
Bien sûr, C # n’a pas de fonctions mathématiques prédéfinies, il serait donc difficile de se battre avec des gars de Mathematica. Néanmoins, c'était un grand défi, merci à l'auteur!
Grilles de test:
Ancienne Solution (540)
Fonctionne en moins d’une seconde sur n’importe quelle entrée (testé sur des milliers de grilles générées aléatoirement). La longueur maximale de la chaîne de sortie est de 165 (au départ, toute grille était résolue en moins de 82 retournements, mais au cours du golf, je l'avais sacrifié).
Réponse par exemple 1:
Réponse par exemple 2:
Réponse par exemple 3:
Réponses pour les carrés d'essai:
la source
1
,A
et2I
qui sont les solutions les plus simples - mais cela ne fait pas affaire puisque je ne suis pas juger de la longueur de solution de la grille :-) Si vous pouviez modifier et donnez les réponses pour les 3 grilles de test (je vais voir si je peux le faire fonctionner sur mon Mac maintenant), je peux vous donner votre +1.