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 vers B1
. Vous pouvez obtenir un 1
pour la position B1
, mais ce sera la tuile de B9
, pas la tuile de A1
. É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.