GBlog -Everything is possible

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