Aide algo sudoku
Fermé
Hugo33
-
5 avril 2020 à 15:11
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 7 avril 2020 à 20:29
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 7 avril 2020 à 20:29
A voir également:
- Aide algo sudoku
- Sudoku gratuit - Télécharger - Jeux vidéo
- Télécharger sudoku gratuit pour mobile - Télécharger - Puzzle & Réflexion
- Telecharger algo pour pc - Télécharger - Édition & Programmation
- Sudoku pc - Télécharger - Outils professionnels
- Aide : algo palindrome - Forum Programmation
20 réponses
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
6 avril 2020 à 11:09
6 avril 2020 à 11:09
Bonjour Hugo33,
Si je comprends bien, tu voudrait vérifier que les cases remplies par l'utilisateur sont correctes par rapport aux règle du sodoku ?
Dans le temps j'avais fait un programme qui résolvait automatiquement une grille existante
On saisit la grille avec les chiffres et les cases vides telle qu'on la lit sur un journal (moi, c'est dans mon programme de télé préféré ...), ensuite il y a la recherche avec une fonction récursive (une fonction qui s'appelle elle-même), puisqu'on répète plusieurs fois la même opération de contrôle des cases , et la solution s'affiche avec le nombre d'itérations faites
Toi, tu ne fait pas exactement çà, mais tu peux regarder ma fonction 'contraintes_OK' qui vérifie la case courante par rapport au carré 3x3 cases, et par rapport a toute la grille (9x9)
Pour info, l'exécution de mon script donne çà:
Le code:
Sinon : (ne te vexe pas, hein ?) :-)
booléen s'écrit comme çà
colonnes prends 2 n
variable utilisée avec un e à la fin (une variable)
sont compatibles avec un s à la fin
Quelle valeur voulez vous entrer avec un r à la fin (infinitif)
elle vous est donnée : ée pas z, la valeur est donnée
il semble que l'on est un problème : il semble que l'on ait un problème,
c'est pas le verbe être, c'est le verbe avoir : avoir un problème
Bon, allez, j'arrête-là, mais il y en a d'autres :-)
Si je comprends bien, tu voudrait vérifier que les cases remplies par l'utilisateur sont correctes par rapport aux règle du sodoku ?
Dans le temps j'avais fait un programme qui résolvait automatiquement une grille existante
On saisit la grille avec les chiffres et les cases vides telle qu'on la lit sur un journal (moi, c'est dans mon programme de télé préféré ...), ensuite il y a la recherche avec une fonction récursive (une fonction qui s'appelle elle-même), puisqu'on répète plusieurs fois la même opération de contrôle des cases , et la solution s'affiche avec le nombre d'itérations faites
Toi, tu ne fait pas exactement çà, mais tu peux regarder ma fonction 'contraintes_OK' qui vérifie la case courante par rapport au carré 3x3 cases, et par rapport a toute la grille (9x9)
Pour info, l'exécution de mon script donne çà:
Le code:
# -*- coding:Latin-1 -*- import os import sys TITRE = ''' ********************** SUDOKU 9x9 ******************************* Entrer les valeurs sous la forme suivante (point=case inconnue) : 9 caractères par ligne Appuyez sur 'enter' pour passer à la ligne suivante 53..7.... 6..195... etc .. ''' def saisie_grille(): k = 0 grille = {} print(TITRE) while (k < 81): c = sys.stdin.read(1) if (c >= '1' and c <= '9'): grille[k] = int(c) k+=1 elif (c == '.'): grille[k] = VIDE k+=1 return(grille) def affiche_grille(grille): for l in range (0,9): for c in range (0,9): k = l*9+c if (grille[k] == VIDE): print('.', end = ' ') else: print(grille[k], end = ' ') print(' ') def contraintes_OK(n, grille): ''' Verifcation des contraintes de la case n ''' l,c = n // 9, n % 9 lb,lr = l // 3, l % 3 cb,cr = c // 3, c % 3 #Verif de la colonne contenant la case n for l2 in range (0,9): if (l2 != l and grille[l2*9+c] == grille[n]): return False #Verif de la ligne contenant la case n for c2 in range (0,9): if (c2 != c and grille[l*9+c2] == grille[n]): return False #Verif du carré 3x3 contenant la case n for lr2 in range (0,3): for cr2 in range (0,3): if ((lr2 != lr or cr2 != cr) and grille[(lb*3+lr2)*9+(cb*3+cr2)] == grille[n]): return False return True def recherche_recursive(n, grille): ''' on considère que que toutes les cases dont l'index < n sont déjà remplies ''' global nombre_de_noeuds #Affichage solution if (n == 81): print('\nTrouvé !\n') affiche_grille(grille) return #La case est remplie : on passe à la suivante if (grille[n] != VIDE): recherche_recursive(n+1, grille) return #La case est vide : verif des contraintes nombre_de_noeuds += 1 for grille[n] in range (1,10): if (contraintes_OK(n, grille)): recherche_recursive(n+1, grille) #On laisse la case comme elle était au départ grille[n] = VIDE VIDE = 0 nombre_de_noeuds = 0 grille = saisie_grille() os.system('cls') print('\nGrille de depart:\n') affiche_grille(grille) recherche_recursive(0, grille) print('\n{:d} noeuds cherchés'.format(nombre_de_noeuds)) input ('\nPresser Entrée ...')
Sinon : (ne te vexe pas, hein ?) :-)
booléen s'écrit comme çà
colonnes prends 2 n
variable utilisée avec un e à la fin (une variable)
sont compatibles avec un s à la fin
Quelle valeur voulez vous entrer avec un r à la fin (infinitif)
elle vous est donnée : ée pas z, la valeur est donnée
il semble que l'on est un problème : il semble que l'on ait un problème,
c'est pas le verbe être, c'est le verbe avoir : avoir un problème
Bon, allez, j'arrête-là, mais il y en a d'autres :-)
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
Ambassadeur
1 555
6 avril 2020 à 09:19
6 avril 2020 à 09:19
bonjour,
je pense que les fonctions ne se trouvent pas, elle se conçoivent.
qu'as-tu essayé, comment penses-tu pouvoir faire cette vérification?
je pense que les fonctions ne se trouvent pas, elle se conçoivent.
qu'as-tu essayé, comment penses-tu pouvoir faire cette vérification?
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
>
Hugo33
6 avril 2020 à 11:06
6 avril 2020 à 11:06
où se trouve cette vérification dans ton code?
je pense que la ligne 122 ne fait pas ce que tu imagines.
connais-tu l'instruction for? ce serait plus clair de l'utiliser parfois au lieu de while.
je pense que la ligne 122 ne fait pas ce que tu imagines.
connais-tu l'instruction for? ce serait plus clair de l'utiliser parfois au lieu de while.
Hugo33
>
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
6 avril 2020 à 11:08
6 avril 2020 à 11:08
je l'ai enlevé car j'en avait honte...
Oui je connait for mais ou veux tu en venir ?
Oui je connait for mais ou veux tu en venir ?
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
>
Hugo33
6 avril 2020 à 11:12
6 avril 2020 à 11:12
commence par réfléchir à la ligne 122...
Regarde ma fonction contraintes_OK comme je te le disais …
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
6 avril 2020 à 14:53
6 avril 2020 à 14:53
Je ne sais pas ce que tu entends par "en les collants"
En fait, comme ma grille est un tableau de 81 cases (de 0 à 80), et non pas un tableau carré à 2 dimensions (9x 9 cases), et que je veux quand même explorer des lignes ou des colonnes, j'utilise cet artifice pour simuler un tableau à 2 dimensions (lignes, colonnes)
pour une case d'indice n (grille[n] ):
le numéro de ligne est n//9 (division entière de n par 9)
le numéro de colonne est n%9 (n modulo 9)
Exemples :
si n = 0 le calcul donne l = 0 et c = 0, car la 1ere case serait bien dans la 1ere ligne, 1ere colonne
si n = 9 : l=1, c=0 : la case 9 serait bien dans la 2eme ligne, 1ere colonne
Et donc dans ma fonction:
on explore toute la colonne de la case n : [l2*9+c] donne tous les indices des cases de la colonne c qui contient n, et on vérifie que l'une d'elles ne contient pas le même chiffre que dans la case n
si c'est le cas, (grille[l2*9+c] == grille[n]), on sort de la fonction en retournant False : le contenu de n n'est pas OK
Ensuite on fait pareil pour la ligne qui contient la case d'indice n, puis pour le carré 3x3 qui contient la case d'indice n
Si tout est OK, la fonction retourne True
En fait, comme ma grille est un tableau de 81 cases (de 0 à 80), et non pas un tableau carré à 2 dimensions (9x 9 cases), et que je veux quand même explorer des lignes ou des colonnes, j'utilise cet artifice pour simuler un tableau à 2 dimensions (lignes, colonnes)
pour une case d'indice n (grille[n] ):
le numéro de ligne est n//9 (division entière de n par 9)
le numéro de colonne est n%9 (n modulo 9)
Exemples :
si n = 0 le calcul donne l = 0 et c = 0, car la 1ere case serait bien dans la 1ere ligne, 1ere colonne
si n = 9 : l=1, c=0 : la case 9 serait bien dans la 2eme ligne, 1ere colonne
Et donc dans ma fonction:
for c2 in range (0,9): if (c2 != c and grille[l*9+c2] == grille[n]): return False
on explore toute la colonne de la case n : [l2*9+c] donne tous les indices des cases de la colonne c qui contient n, et on vérifie que l'une d'elles ne contient pas le même chiffre que dans la case n
si c'est le cas, (grille[l2*9+c] == grille[n]), on sort de la fonction en retournant False : le contenu de n n'est pas OK
Ensuite on fait pareil pour la ligne qui contient la case d'indice n, puis pour le carré 3x3 qui contient la case d'indice n
Si tout est OK, la fonction retourne True
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
6 avril 2020 à 14:59
6 avril 2020 à 14:59
oups, pour mon exemple j'ai recopié la 2eme boucle for qui explore les lignes et non les colonnes, mais çà ne change rien au principe …
Donc concraitement que donnerai la fonction pour définir un carré a partir d'une entrée de l'utilisateur ?
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
Modifié le 6 avril 2020 à 15:38
Modifié le 6 avril 2020 à 15:38
que suggères-tu? tu apprendras mieux en créant toi-même, plutôt qu'en recopiant.
comment ferais-tu cette vérification sans ordi?
comment ferais-tu cette vérification sans ordi?
L = entrée de ligne C = entrée de colone # pour le décalage tableau La , LR = La // 3, LR % 3 Ca , CR = Ca // 3, CR % 3 if LR != 0 and CR != 0: La = +1 Ca = +1 if La = 4 or Ca = 4 La = 3 Ca = 3 tab = [g1[La][Ca],g1[La][Ca+1],g1[La][Ca+2] g1[La+1][Ca],g1[La+1][Ca+1],g1[La+1][Ca+2] g1[La+2][Ca],g1[La+2][Ca+1],g1[La+2][Ca+2] #et je lance la comparaison
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
6 avril 2020 à 16:15
6 avril 2020 à 16:15
as-tu testé?
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
6 avril 2020 à 16:26
6 avril 2020 à 16:26
plus élégant, pour peupler tab:
tab=[] for i in range(3): for j in range(3): tab.append (g1[La+i][Ca+j])
L = input("entrée de ligne") C = input("entrée de colone") La , LR = L // 3, L % 3 Ca , CR = C // 3, C % 3 if LR != 0 and CR != 0: La = +1 Ca = +1 if La == 4 or Ca == 4: La = 3 Ca = 3 tab = [g1[La][Ca],g1[La][Ca+1],g1[La][Ca+2] g1[La+1][Ca],g1[La+1][Ca+1],g1[La+1][Ca+2] g1[La+2][Ca],g1[La+2][Ca+1],g1[La+2][Ca+2]
invalid syntax sur le tableau tab
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
6 avril 2020 à 16:27
6 avril 2020 à 16:27
compte les [ et les ]
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
6 avril 2020 à 16:29
6 avril 2020 à 16:29
à quoi servent les lignes 7 à 12?
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
6 avril 2020 à 17:08
6 avril 2020 à 17:08
je pense que La et Ca ne sont pas correctement calculés.
Hugo33
>
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
6 avril 2020 à 17:09
6 avril 2020 à 17:09
oui c'est ce que je suis entrain de voir...
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
6 avril 2020 à 17:31
6 avril 2020 à 17:31
Holà Hugo33,
Je ne sais pas si tu as bien lu tout ce que je te raconte, et tout bien assimilé
notamment l'utilisation de l et c: moi je fais çà parce que mon tableau est unidimensionnel
tu n'est pas obligé de tout changer: toi tu as déjà un tableau (lignes, colonnes):
g1[0][0],"|",g1[0][1], etc...
Il te restait juste a faire une double boucle pour balayer toutes les cases de ta grille, et pour
chaque case, tu appelles une fonction qui ressemble à la mienne, donc qui explore la ligne et la
colonne qui contient la case pour vérifier si une autre case ne contient pas le même chiffre
(et aussi le carré 3x3 qui contient la case)
Je ne sais pas si tu as bien lu tout ce que je te raconte, et tout bien assimilé
notamment l'utilisation de l et c: moi je fais çà parce que mon tableau est unidimensionnel
tu n'est pas obligé de tout changer: toi tu as déjà un tableau (lignes, colonnes):
g1[0][0],"|",g1[0][1], etc...
Il te restait juste a faire une double boucle pour balayer toutes les cases de ta grille, et pour
chaque case, tu appelles une fonction qui ressemble à la mienne, donc qui explore la ligne et la
colonne qui contient la case pour vérifier si une autre case ne contient pas le même chiffre
(et aussi le carré 3x3 qui contient la case)
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
6 avril 2020 à 17:37
6 avril 2020 à 17:37
il n'a pas de raison de faire cela ainsi, son programme n'a pas la même fonction que le tien.
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
6 avril 2020 à 17:49
6 avril 2020 à 17:49
Hello Yg_be,
Cà, je le sais et je le dis dès ma 1ere réponse …. :-)
Sa question initiale était bien de vérifier les cases du tableau pour voir si elles sont remplies correctement vis à vis des règles du sodoku ? non ?
Si oui, pas la peine de tout révolutionner, il y a juste à balayer toutes les case et d'appeler une fonction pour vérifier
Mais bon …
Cà, je le sais et je le dis dès ma 1ere réponse …. :-)
Sa question initiale était bien de vérifier les cases du tableau pour voir si elles sont remplies correctement vis à vis des règles du sodoku ? non ?
Si oui, pas la peine de tout révolutionner, il y a juste à balayer toutes les case et d'appeler une fonction pour vérifier
Mais bon …
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
6 avril 2020 à 17:57
6 avril 2020 à 17:57
je pense que l'idée est de vérifier qu'un chiffre puisse être ajouté dans une case, donc de vérifier la ligne, la colonne, et le carré.
inutile de vérifier toutes les cases, si la vérification est faite à chaque ajout.
inutile de vérifier toutes les cases, si la vérification est faite à chaque ajout.
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
>
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
6 avril 2020 à 18:06
6 avril 2020 à 18:06
ah !
ok yg_be, excuse-moi
Moi j'avais compris qu'il voulait vérifier que le sudoku était correct en fin de remplissage:
"... fonction pour vérifier que les carrés soit bien rempli à la fin de la partie…"
ok yg_be, excuse-moi
Moi j'avais compris qu'il voulait vérifier que le sudoku était correct en fin de remplissage:
"... fonction pour vérifier que les carrés soit bien rempli à la fin de la partie…"
Hugo33
>
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
6 avril 2020 à 18:08
6 avril 2020 à 18:08
Cela m'est égal... Je ne sais pas ce qui vous parlez être le plus simple ?
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
>
Hugo33
6 avril 2020 à 19:12
6 avril 2020 à 19:12
quand veux-tu vérifier quoi?
Et en faisant des test je suis tomber sur un os dans mon code je soustrait par 1 la ligne et la colone pour que le joueur puisse "compter normalement ": problème en plus.
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
6 avril 2020 à 18:04
6 avril 2020 à 18:04
ton code utilisant 0 comme base, il suffit de soustraire ou d'ajouter 1 en communiquant avec le joueur.
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
6 avril 2020 à 17:52
6 avril 2020 à 17:52
Ouh la …
Ben, faire une double boucle pour trouver le chiffre qui est dans chaque case de la grille …
Ben, faire une double boucle pour trouver le chiffre qui est dans chaque case de la grille …
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
7 avril 2020 à 18:26
7 avril 2020 à 18:26
Bonjour Hugo33,
Pour te donner à réfléchir, ci-dessous ton code en 3 fois plus court, en plus concis et beaucoup plus simple
Regarde par exemple la fonction affichage_grille()
Il y avait aussi quelques variables inutiles (g2, rdm2, …)
Mon programme affiche la grille et tant qu'on n'entre pas un numéro de ligne ou de colonne valide, il efface l'écran, ré affiche la grille et repose la question
Si ligne et colonne sont valides, Il contrôle de suite si la case n'est pas déjà remplie,
si oui, on affiche un message d'erreur, on efface, on ré affiche, on redemande ligne et colonne
sinon on demande la valeur à mettre, on remplit, et la grille se réaffiche avec la nouvelle valeur
Dès que les cases sont toutes remplies, on appelle la fonction de vérification …
Pour te donner à réfléchir, ci-dessous ton code en 3 fois plus court, en plus concis et beaucoup plus simple
Regarde par exemple la fonction affichage_grille()
Il y avait aussi quelques variables inutiles (g2, rdm2, …)
Mon programme affiche la grille et tant qu'on n'entre pas un numéro de ligne ou de colonne valide, il efface l'écran, ré affiche la grille et repose la question
Si ligne et colonne sont valides, Il contrôle de suite si la case n'est pas déjà remplie,
si oui, on affiche un message d'erreur, on efface, on ré affiche, on redemande ligne et colonne
sinon on demande la valeur à mettre, on remplit, et la grille se réaffiche avec la nouvelle valeur
Dès que les cases sont toutes remplies, on appelle la fonction de vérification …
# -*- coding:Latin-1 -*- #Jeu de sudoku 07/04/2020 15:26:54 import random import os # définition d'une grille de sudoku valide grille = [[3, 6, 7, 9, 4, 1, 2, 8, 5], [1, 5, 2, 6, 8, 3, 4, 9, 7], [4, 9, 8, 7, 5, 2, 1, 6, 3], [7, 4, 6, 1, 9, 5, 8, 3, 2], [8, 1, 9, 2, 3, 7, 6, 5, 4], [2, 3, 5, 8, 6, 4, 7, 1, 9], [9, 2, 1, 5, 7, 8, 3, 4, 6], [5, 8, 4, 3, 2, 6, 9, 7, 1], [6, 7, 3, 4, 1, 9, 5, 2, 8]] nb_de_cases_vides = int((len(grille)*len(grille))*0.5) def affichage_grille(): ''' Affiche la grille complete ''' print('Bonne chance !\n') for k in range (9): print('|', end = '') for j in range (9): print(grille[k][j], end = ' | ') print('\n------------------------------------') def grille_aleatoire(): ''' Remplit aléatoirement 40 cases de la grille avec un 0 ''' k = 0 while k != nb_de_cases_vides: rand_1, rand_2 = random.randint(0, 8), random.randint(0, 8) if grille[rand_1][rand_2] != 0: grille[rand_1][rand_2] = 0 k += 1 def verif_case(ligne,colonne): ''' Verifie que la valeur d'une case est unique dans sa ligne et sa colonne''' valeur_case = grille[ligne][colonne] for k in range(9): if(k != colonne and grille[ligne][k] == valeur_case): print('Doublon de la case {:d},{:d} en case {:d},{:d}'.format(ligne,colonne,ligne,k)) for k in range(9): if(k != ligne and grille[k][colonne] == valeur_case): print('Doublon de la case {:d},{:d} en case {:d},{:d}'.format(ligne,colonne,k,colonne)) #Jeu grille_aleatoire() nb_de_cases_remplies = 0 while(nb_de_cases_remplies < nb_de_cases_vides): #Ligne ligne = -1 while(not ligne in ('0', '1', '2', '3', '4', '5', '6', '7', '8','q')): os.system('cls' if os.name=='nt' else 'clear') affichage_grille() ligne = input('Dans quelle ligne voulez vous jouer (0 à 8, q = quitter) ? ') if(ligne == 'q'): break ligne = int(ligne) #Colonne colonne = -1 while(not colonne in ('0', '1', '2', '3', '4', '5', '6', '7', '8')): os.system('cls' if os.name=='nt' else 'clear') affichage_grille() colonne = input('Dans quelle colonne voulez vous jouer (0 à 8) ? ') colonne = int(colonne) #Test si la case est vide if(grille[ligne][colonne] != 0): input('Erreur : la case {:d},{:d} est deja remplie Appuyer sur entrée pour recommencer ...'.format(ligne,colonne)) else: #Chiffre de la case chiffre = -1 while(not chiffre in ('1', '2', '3', '4', '5', '6', '7', '8', '9')): os.system('cls' if os.name=='nt' else 'clear') affichage_grille() chiffre = input('Dans valeur voulez vous entrer (1 à 9) ? ') chiffre = int(chiffre) grille[ligne][colonne] = chiffre nb_de_cases_remplies += 1 #La grille est complète : on vérifie if(cases_remplies == nb_de_cases_vides): for k in range (9): for j in range (9): verif_case(k,j) input('Appuyer sur entrée ...')
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
>
Hugo33
7 avril 2020 à 18:43
7 avril 2020 à 18:43
elle est inutile, puisque la vérification a été faite à chaque case rentrée.
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
Modifié le 7 avril 2020 à 19:21
Modifié le 7 avril 2020 à 19:21
afin de vérifier également les carrés:
def verif_case(ligne,colonne): ''' Verifie que la valeur d'une case est unique dans sa ligne et sa colonne et son carré''' valeur_case = grille[ligne][colonne] for k in range(9): if(k != colonne and grille[ligne][k] == valeur_case): print('DoublonC de la case {:d},{:d} en case {:d},{:d}'.format(ligne,colonne,ligne,k)) if(k != ligne and grille[k][colonne] == valeur_case): print('DoublonL de la case {:d},{:d} en case {:d},{:d}'.format(ligne,colonne,k,colonne)) c=3*(colonne//3) l=3*(ligne//3) for k in range(3): for m in range(3): if(k+c != colonne and m+l != ligne and grille[m+l][k+c] == valeur_case): print('DoublonP de la case {:d},{:d} en case {:d},{:d}'. format(ligne,colonne,m+l,k+c))
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
7 avril 2020 à 19:26
7 avril 2020 à 19:26
Erreur yg_be !
"elle est inutile, puisque la vérification a été faite à chaque case rentrée. "
Cette vérif - là ne se fait pas a chaque case rentrée !
(je parle de ma fonction verif_case() )
Les verifs dans la boucle while ne portent que sur la validité des numéros de lignes et de colonnes et si la case à remplir est bien vide
Par contre je vois que tu as complété ma fonction en y ajoutant le contrôle du carré 3x3
Mais çà, on aurait pu laisser Hugo33 s'y atteler, non ? :-)
"elle est inutile, puisque la vérification a été faite à chaque case rentrée. "
Cette vérif - là ne se fait pas a chaque case rentrée !
(je parle de ma fonction verif_case() )
Les verifs dans la boucle while ne portent que sur la validité des numéros de lignes et de colonnes et si la case à remplir est bien vide
Par contre je vois que tu as complété ma fonction en y ajoutant le contrôle du carré 3x3
Mais çà, on aurait pu laisser Hugo33 s'y atteler, non ? :-)
yg_be
Messages postés
23358
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 novembre 2024
1 555
Modifié le 7 avril 2020 à 19:37
Modifié le 7 avril 2020 à 19:37
n'est-ce pas un malentendu de laisser compléter une grille incorrecte?
tu suggères de laisser Hugo33 chercher la solution que tu proposes en #5?
tu suggères de laisser Hugo33 chercher la solution que tu proposes en #5?
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
7 avril 2020 à 19:32
7 avril 2020 à 19:32
Hugo33,
Tu n'as plus qu'a tester et comparer avec ce que tu avais fait pour voir comment on peut écrire un code plus simple et plus concis …
Tu n'as plus qu'a tester et comparer avec ce que tu avais fait pour voir comment on peut écrire un code plus simple et plus concis …
Phil_1857
Messages postés
1872
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
28 février 2024
168
7 avril 2020 à 20:29
7 avril 2020 à 20:29
Holà yg_be,
Je vois ce que tu veux dire : quand on fait un sudoku a la main, on contrôle dans la ligne et dans la colonne au fur et a mesure que l'on remplit la grille
moi, je n'ai fait que recopier le code d'Hugo33 pour lui montrer comment faire plus court et plus concis, pour commencer
Ensuite il n'y a plus qu'à améliorer ...
Je vois ce que tu veux dire : quand on fait un sudoku a la main, on contrôle dans la ligne et dans la colonne au fur et a mesure que l'on remplit la grille
moi, je n'ai fait que recopier le code d'Hugo33 pour lui montrer comment faire plus court et plus concis, pour commencer
Ensuite il n'y a plus qu'à améliorer ...
6 avril 2020 à 11:14
Oui j'ai déja des fonctions pour vérifier les lignes et les colonnes mais pas pour les carrés.
Si tu as une idées je prends...