Samedi 24 Décembre 2005
[Python] - Sudoku
Après que mat ai décidé de se mettre au Python, j'ai eu envie de vous faire part des événements Pytonesques de ma nuit.
J'ai programmé un solveur du jeu de Sudoku. Si l'exercice n'en est pas très difficile, il en reste cependant artistique. Je donne expres le code source en dehors de la page car je n'ai plus confiance dans les qualités de mon hightlighter de code pour ne rien pourrir. (TODO : Refaire ce blog de A à Z en passant par Python).
Ce travail m'a amené à une conclusion. Faire super attention quand on essaie d'utiliser des variables qui ne viennent pas du scope en cours.
Vous aller me demander ce que je raconte, on a toujours dit en progammation que les "globales" n'étaient pas une bonne chose. Cependant dans la philosophie Python c'est autre chose et l'on se sert en permanance des variables venant des scopes non locaux. (Je vous laisse utiliser l'import d'un module pour tester cela).
Alors que m'est-t-il arrivé, un truc stupide. J'ai essayé de faire quelque chose dans cette philosophie, cependant l'accès à une valeur venant d'un scope externe ne pose jamais de problème, Python remonte les espaces de noms pour trouver ce qui l'interesse.
Mais la modification ne se passe pas comme prévu. Or si vous tentez les deux il vous insulte gentiement. Dans le cas ou vous ne faites que la modification, Python se contente de modifier soit la valeur du scope local dans le cas d'une variable non mutable, soit celle du scope global pour une variable de type mutable.
J'ai été clair, non ?
def eggs():
def spam(i):
if i == 5:
boolean = True
booleanlist[0] = True
boolean = False
booleanlist = [False]
for i in range(10):
spam(i)
print boolean,booleanlist[0]
eggs()
Ce qui est tout à fait normal. Dans le cas de boolean on change d'objet, donc on en reference un nouveau dans l'espace local. Dans le cas de booleanlist, il va tout d'abord chercher l'objet booleanlist qu'il ne trouve pas et ensuite modifie une de ces valeurs.
Pigé ? Pas grave. Amusez vous bien avec le sudoku.
Commentaires
Dimanche 15 Janvier 2006 18:21:53 - roidelapluie
On peut remplacer game = [[None, None, 6, None, 8, None, 3, None, None],
[None, 4, 9, None, 7, None, 2, 5, None],
[None, None, None, 4, None, 5, None, None, None],
[6, None, None, 3, 1, 7, None, None, 4],
[None, None, 7, None, None, None, 8, None, None],
[1, None, None, 8, 2, 6, None, None, 9],
[None, None, 1, 7, None, 2, None, None, None],
[None, 7, 5, None, 4, None, 1, 9, None],
[None, None, 3, None, 9, None, 6, None, None]]
par
a,b,game = 0,0,[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]] # a est le numéro de la colonne et b l numéro de la ligne
print "Mettez 0 s'il n'y a rien"
while a < 9:
while b<9:
game[a][b] = int(raw_input("Entrez le nombre en ("+str(a+1)+";"+str(b+1)+"): "))
if game[a][b] == 0:
game[a][b] = None
b = b + 1
a = a + 1
b = 0
Mardi 17 Janvier 2006 15:33:53 - Guillaume
L'astuce c'etais qu'il s'agit d'une module, donc ce qui est dans __main__ n'est pas forcement executé. Tu en fais ce que tu veux après.
J'améliorerais ton code comme ceci:
game = [[None] * 9 for i in range(9)]
for i,line in enumerate(game):
for j in range(9):
while True:
try:
value = int(raw_input('Valeur de la ligne %i et de la colone %i' %(i+1,j+1)))
assert 0 <= value <= 9
except ValueError:
print 'Une valeur numerique est requise'
except AssertionError:
print 'Une valeur entre 0 et 9 est requise'
else:
break
if value: # sous entendu <> 0
line[j] = value
Mardi 17 Janvier 2006 15:34:10 - Guillaume
Faut que je patch ce blog qui vire les espaces
Mardi 17 Janvier 2006 15:34:28 - Guillaume
test
d'un pré
Mardi 17 Janvier 2006 15:39:59 - Guillaume
game = [[None] * 9 for i in range(9)]
for i,line in enumerate(game):
for j in range(9):
while True:
try:
value = int(raw_input('Valeur de la ligne %i et de la colone %i' %(i+1,j+1)))
assert 0 <= value <= 9
except ValueError:
print 'Une valeur numerique est requise'
except AssertionError:
print 'Une valeur entre 0 et 9 est requise'
else:
break
if value: # sous entendu <> 0
line[j] = value
Mardi 17 Janvier 2006 15:43:09 - Guillaume
game = [[None] * 9 for i in range(9)]
for i,line in enumerate(game):
____for j in range(9):
________while True:
____________try:
________________value = int(raw_input('Valeur de la ligne %i et de la colone %i' %(i+1,j+1)))
________________assert 0 <= value <= 9
____________except ValueError:
________________print 'Une valeur numerique est requise'
____________except AssertionError:
________________print 'Une valeur entre 0 et 9 est requise'
____________else:
________________break
________if value: # sous entendu <> 0
____________line[j] = value
Mardi 17 Janvier 2006 15:43:20 - Guillaume
ca ira le temps que !
Mardi 24 Janvier 2006 16:11:25 - David,biologeek Lien
Un peu gore comme solution pour ajouter des espaces :)
Sinon pour ajouter des chiffres à ton sudoku : http://groups.google.se/group/comp.lang.python/browse_frm/thread/5087890f4c5e770d/0cc74029e8fa8a48?tvc=1&q=sudoku#0cc74029e8fa8a48
Mardi 28 Mars 2006 15:15:40 - céline Lien
salut , j'ai découvert un site la semaine derniere trop géniale
c'est www.sudoku-gratuit.fr
on pêux télécharger des tonnes de grilles de sudoku gratuitement et jouer en ligne
et surtout trouver des truc et astuce pour résoudre nos grilles
on peux même creer son propre blog sur ce site
donc allez y c'est gratuit
c'est www.sudoku-gratuit.fr
Mercredi 05 Avril 2006 21:16:39 - Seb Lien
L'implémentation est effectivement simple et rapide, mais l'algorithme ne résoudra pas tous les sudokus. Pour une liste d'algorithmes plus complets (et plus rapides), allez sur http://www.setbb.com/phpbb/index.php?mforum=sudoku
Jeudi 06 Avril 2006 12:41:42 - Guillaume
L'algo les résoudra tous, le seul problème étant la mémoire utilisée et le temps nécessaire.
Merci pour le lien
Lundi 10 Avril 2006 20:23:47 - isabelle Lien
salut
je voulez vous faire partager ma passion le sudoku
j'ai découvert un site ce week end
www.sudoku-gratuit.fr
on peut télécharger pleins de grilles gratuitement(plus de 2000)
de plus on peux jouer en ligne au sudoku
et ce que j'ai trouver super c que le webmaster a mis aussi pleins de truc et astuce pour résoudre les grilles
aller vite sur www.sudoku-gratuit.fr si vous êtes accros comme moi ;o)
Vendredi 05 Mai 2006 17:58:39 - Chloé Lien
http://www.sudokumania.fr
Un nombre illimité de grilles gratuites de sudoku à jouer en ligne ou à imprimer ! Seul ou en tournois !
Les webmasters peuvent meme afficher les grilles sur leur site (via leurs couleurs et sans pub).
http://www.sudokumania.fr
Vendredi 02 Juin 2006 00:08:11 - Elghinn
vive le spam....
Vendredi 02 Juin 2006 14:33:56 - Guillaume
Oui, faudra que je tri...
Mercredi 07 Juin 2006 10:11:34 - sudokuz Lien
Pour répondre à la dernière question je n'ai rien pigé !!!
Alors ce solveur fonctionne ou pas ?
Mercredi 07 Juin 2006 13:35:38 - Guillaume
> Alors ce solveur fonctionne ou pas ?
Oui mais sera ultra lent sur certaines grilles
Réagissez
En fait non ! Trop de smap