Table des Matières

SudokuStudyLib

_images/logo.jpg

** Il s’agit d’une bibliothèque Python pour l’étude de la logique en résolvant Sudoku et l’apprentissage de la programmation du langage python. ** Sudoku est une sorte de jeu de puzzle. il est l’un des meilleur moyen d’apprendre la logique, et dans le même temps, le langage Python est l’un des meilleurs langage informatique pour apprendre logique. Donc, si nous pouvons combiner ces deux types d’outils pour enseigner aux enfants ou jeunes gens à apprendre la logique, ce sera parfait. C’est pourquoi le projet soit terminé et va.

Bienvenue dans le monde la plus pure de l’homme: Sudoku et Logic

contenu:

Welcome to SudokuStudyLib’s documentation!

This is a tool and library for studying Logic and Python programming. It includes two packages, one is Sudoku, and another is Matrix. The Sudoku is an oop approaching library, while the Matrix is a traditional function processing library.

This library and document are major for Soduku package, the Matrix package is just a reference for a traditional programmer.

Install

You can use pip to install the library:

pip install SudokuStudyLib

and you can clone the project from:

https://github.com/RobertOfTaiwan/SudokuStudyLib

When you has installed, it will contain two packages, sudoku, and matrix. The following is the file structure:

_images/p1.png

Usage

  1. OOP method: sudoku, in the test.py:

    from sudoku import *
    
    # to solve a sudoku defined in data directory
    solve("m18.data")
    
    pass
    
    # to solve a sudoku and just using the methods which level <= 15 and if can't solve, don't use guess method
    solve("m3.data", level_limit=15, use_try=False)
    
    pass
    
    # to solve a sudoku with emulator methods and print the steps
    solve("m12.data", use_emu=True, print_step=True)
    
    pass
    
    # to solve the world's best difficult sudoku
    # by default method
    solve("m10.data")
    
    # by computer's try error
    try_error(None, file="m10.data")
    
    # by all methods but not using human guessing, it can't solve the sudoku
    solve("m10.data", use_emu=True, use_try=False)
    
    # by basic human methods and guess
    solve("m10.data", level_limit=10, use_try=True)
    solve("m10.data", level_limit=3, use_try=True)
    
  2. Traditional method: matrix, in the test.py:

    from matrix import *
    
    # solve it directly
    m, n, p = main("m6.data")
    
    # solve it by limit methods, it can't solve the sudoku
    m, n, p = main("m3.data", methods=8)
    
    # set the limit methods to the 10, and it can solve the sudoku
    m, n, p = main("m3.data", methods=10)
    
    # using the try error's method to solve the best difficult sudoku in the world
    m, n, p = TryError("m10.data")
    

The base knowledge of sudoku

Sudoku is a kind of puzzle game. It is one of the best way to learn logic, and at the same time, the Python language is one of the best computer language to learn logic. So, if we can combine these two kinds of tools to teach children or young men to learn logic, it will be perfect. This is why the project be done and going to.

A classic sudoku

You can study what and how is sudoku in Wiki Page: http://en.wikipedia.org/wiki/Sudoku

The following is a classic sudoku:   and the following is the solution for it:
sudoku_init   sudoku_result

Rules

The basic rules to solve a sudoku is very easy:

  1. Put the number of 1-9 to every line(including x-way and y-way) and every box.
  2. every line and every box can’t duplicate of the number of 1-9.

How many possible puzzles in a 9x9 sudoku

If we put the first number in a the position (1, 1), there are must have 9 numbers can be selected to put in. Then we put the second number in the postion (1, 2), there are must have 8 numbers can be selected to put in. So, and as it going on, we can write down the possible numbers we can select in every position:

9! 6! 3! 6! 3! 1! 3! 1! 1!
9 6 3 6 3 1 3 1 1
8 5 2 5 2 1 2 1 1
7 4 1 4 1 1 1 1 1
6 3 1 3 1 1 1 1 1
5 2 1 2 1 1 1 1 1
4 1 1 1 1 1 1 1 1
3 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1

So the possible combinations are 9!*6!*3!*6!*3!*1!*3!*1!*1* = 4,514,807,808,000

if we use python to caculate it:

>>> def n(x):
    if x==1:
        return 1
    else:
        return x*n(x-1)

>>> n(9)*n(6)*n(3)*n(6)*n(3)*n(1)*n(3)*n(1)*n(1)

About the mathematics of sudoku, you can get it at Wiki, http://en.wikipedia.org/wiki/Mathematics_of_Sudoku

What is logic?

Logic is the most important for a person starting to discover the world

The basic logic is dichotomy, is True or False in human language, or is 0 or 1 in computer language. It is the smallest and simplest classification which human can recognize and communicate with each other. So learning logic for children and young men is very important, because this is the base of all knowledge, and the base of all religion.

If you can’t judge a thing is right or not, is existed or not, in one certain view point, you don’t know the world, as you don’t know yourself either.

Learning Logic by Solving Sudoku

Learning logic can be a very happy thing if we teach it as a game, and Sudoku is the one. There are several good reasons to study logic by Solving sudoku:

  • Its rules are so simple, everybody can know it in 5 minutes,
  • It is so complicated that have more than billions of combinations.
  • It can be separated into different difficult levels easily.

Learning Logic by Learning Python Programming

Learning a computer language is the nature way to learn logic. Python is a interpreter script language, you can get every resource from https://www.python.org/. I recite a period of Python FAQ<https://docs.python.org/3/faq/general.html> about for the beginning programmers:

Q:
Is Python a good language for beginning programmers?
A:

Yes.

It is still common to start students with a procedural and statically typed language such as Pascal, C, or a subset of C++ or Java. Students may be better served by learning Python as their first language. Python has a very simple and consistent syntax and a large standard library and, most importantly, using Python in a beginning programming course lets students concentrate on important programming skills such as problem decomposition and data type design. With Python, students can be quickly introduced to basic concepts such as loops and procedures. They can probably even work with user-defined objects in their very first course.

For a student who has never programmed before, using a statically typed language seems unnatural. It presents additional complexity that the student must master and slows the pace of the course. The students are trying to learn to think like a computer, decompose problems, design consistent interfaces, and encapsulate data. While learning to use a statically typed language is important in the long term, it is not necessarily the best topic to address in the students’ first programming course.

Many other aspects of Python make it a good first language. Like Java, Python has a large standard library so that students can be assigned programming projects very early in the course that do something. Assignments aren’t restricted to the standard four-function calculator and check balancing programs. By using the standard library, students can gain the satisfaction of working on realistic applications as they learn the fundamentals of programming. Using the standard library also teaches students about code reuse. Third-party modules such as PyGame are also helpful in extending the students’ reach.

Python’s interactive interpreter enables students to test language features while they’re programming. They can keep a window with the interpreter running while they enter their program’s source in another window.

Features of this Library

There are so many sudoku’s puzzle games and studying in the world. Some are made for fun, some are for the studying of mathematics, while this library focus on logic learning. And the logic mainly is in human view, not in computer science view. So, there are some features in this package:

  1. This is mainly for studying logic for human.
  2. It is NOT to plan to be a normal programming courses.
  3. It is NOT to plan to be a studying of serious mathematics.
  4. The methods of solving a sudoku are mainly in a human view, NOT in computer science view.
  5. Let people to find their own methods to solve a sudoku, and name these methods in their own way. (This is not in this package, but should be arranged this in the courses.)
  6. Let people learning python to implement their own methods.
  7. Studying OOP programming to solve a sudoku. OOP method can be treated as human behavior.

Courses

We can arrange these courses as a sudoku summer camp. We can prepare 1-6 different level sudokus. The learners don’t need to learn all levels. The purpose of these courses is NOT to teach all solving methods of sudoku, its purpose is logic learning. So, we can let different learners have their suitable target to learn.

Who are suitable for these courses

Every one who have studied in an elementary school for three or four years.

First Step: Learn solve a sudoku by hand

Hours:
14 hours, 2 hours/day, 7 days
Purpose:
  1. Find the suitable level for every learner
  2. Learn the basic computer knowledge

Second Step: Learn to find methods to solve a sudoku

Hours:
14 hours, 2 hours/day, 7 days
Purpose:
  1. Nameing the method that they have found a model to solving a sudoku, and write down the description.
  2. Let them can express their methods to others.
  3. Learn the basic python programming by solving their home work, like solving how add all the value of 1 to 100.

Third Step: Learn to write python code to implement their methods

Hours:
14 hours, 2 hours/day, 7 days
Purpose:
  1. Learning Object Oriented Programming(OOP) concept.
  2. Learning to use OOP to implement their methods.

Comment faire un environnement de simulation en Python pour résoudre un sudoku

Nous pensons que les classes définies est la plus difficile pour l’apprenant dans la méthode de la programmation orientée objet de la programmation. Donc, dans ces cours d’apprentissage pour résoudre le sudoku, nous n’expliquons pas comment faire une classe, les biens et méthodes en détail. Mais juste faire une explication de classes existent, les propriétés et méthodes de cette bibliothèque pour les apprenants. Donc, nous pouvons expliquer ces structures de données comme un environnement de simulation pour résoudre un sudoku comme un être humain.

Nous pouvons première image que il ya des maisons 9x9 dans une belle vallée, et ils sont construits comme:

_images/p4.png

** Un monde imaginaire **

Il ya 9 pays, chaque pays dispose de 9 personnes. Ils décident de vivre ensemble dans cette belle vallée. Et il ya des maisons 9x9, Ils veulent laisser tous les gens vivent dans une maison, et chaque ligne X-chemin, la ligne Y-chemin, et chaque boîte 3x3 comprennent les gens de tous les pays. Et si c’est le cas, ils peuvent dire eux-mêmes sont un vrai groupe uni dans le monde, pouvez-vous les aider?

et alors nous pouvons commencer à résoudre le monde wondeful pour ces gens ...

Qu’est-ce qu’une classe? et un objet?

Classe est le nom collectif pour un groupe d’objets qui ont les mêmes comportements, les caractéristiques, les formes. Donc, animal peut être un nom de classe, et l’éléphant est un type d’objet de cette classe.

Un objet est chose qui appartiennent une classe ou plusieurs classes.You peuvent traiter un objet est une entité d’une classe, comme l’homme est une classe, mais vous est un objet, une entité qui appartient classe humaine.

Dépendra le domaine qui nous voulons aborder, ou à définir, nous allons définir quelques classes différentes pour décrire les mêmes objets. Comme si nous voulons étudier un système de bio-écologie de la ville, on peut définir une classe d’animaux, qui contiennent certaines personnes, certains animaux, et ainsi de suite ... Mais quand notre domaine est de faire une demande de livre de téléphone, nous pouvons définir une classe de personne qui contiennent certaines personnes, mais pas d’animaux, à l’exception de nos animaux de compagnie ont un téléphone portable aussi.

Dans cette bibliothèque sudoku de résolution, nous définissons les classes suivantes:

  • Nombre Classe:

    Vous pouvez traiter chaque numéro comme un autre homme, il ya 9 pays, et chaque pays dispose de 9 hommes. Donc, nous pouvons traiter la classe en tant que numéro un de catégorie Pays. Chaque pays a son ID, voici 1-9, et chaque pays serait d’enregistrer les positions où leurs habitants vivent dans cette vallée.

  • Point de Classe:

    Point est une maison ici. Il indique qu’il est vide ou pas, si elle n’est pas vide, quel pays les gens y vit? si elle est vide, les gens de qui comtés peuvent vivre ici?

  • GroupBase Classe:

    GroupBase est un groupe de ligne de X, Y ou ligne d’une zone de 3x3. C’est la classe de base de boîte, Linex, Liney. Il indique que les maisons appartiennent à lui, combien de personnes ont vécu dans ce groupe? et les personnes qui comtés toujours pas vivre dans ce groupe?

  • Box Classe:

    Chaque bloc de 3x3. Chaque boîte a son Identifiant, de gauche à droite, de haut en bas, il est affecté 1-9, comme l’image suivante:

    _images/p5.png
  • LinEx Classe:

    Chaque ligne X-Way. Chaque ligne X-Way a son Identifiant, de gauche à droite, il est affecté 1-9, comme l’image suivante:

    _images/p6.png
  • Liney Classe:

    Chaque ligne y-chemin. Chaque ligne y-chemin a son Identifiant, de haut en bas, il est affecté 1-9, comme l’image suivante:

    _images/p7.png
  • Matrix Class:

    Matrix Class est le monde d’un jeu de sudoku. C’est la belle vallée, dont 9 pays, tous les pays ont 9 personnes, il ya des maisons 9x9 pour tous ces gens.

Qu’est-ce qu’une propriété?

La propriété est dans une classe à déclamer ce qu’il COTAIN et comment ils ressemblent ou leurs conditions. Comme une classe de personne, peuvent avoir ces propriétés de combien d’argent il encore, combien d’enfants il encore, et premier enfant est garçon ou fille, quel âge ont-elles?

Voici les principales propriétés de toutes les classes dans ce libryary:

  • Nombre Classe:

    • v: l’identifiant d’un pays, il est 1-9.

    • p: la liste des maisons de ces gens de la campagne ont vécu dans

    • rempli: combien de personnes ont vécu dans une maison

  • Point de Classe:

    • x: x-chemin postion de cette maison

    • y: la position y-chemin de cette maison

    • v: quel pays les gens ont vécu ici, si elle est vide, sa valeur est 0

    • b: cette maison qui belogn boîte 3x3

  • GroupBase Classe:

    • idx: l’identifiant de ce groupe

    • p: la liste des maisons qui appartiennent à ce groupe

    • rempli: combien de personnes ont vécu dans ce groupe

    • possible: la liste des id de pays qui n’ont pas vécu dans ce groupe

  • Box Classe:

    • Toutes les propriétés GroupBase

    • effets: la zone de liste identifiant les voisins d’une boîte

    • effectsX: la zone de liste identifiant les voisins d’une boîte qui dans la direction X-Way

    • effectsY: la zone de liste identifiant les voisins d’une boîte qui dans la direction Y-chemin

  • LinEx Classe:

    • Ayant les mêmes propriétés que GroupBase

  • Liney Classe:

    • Ayant les mêmes propriétés que GroupBase

  • Matrix Class:

    • p: A deux dimention du point (maison), de p [0] [0] pour p [8] [8] de présenter toutes les maisons dans cette vallée.

    • LinEx: Une liste de ligne x-chemin des maisons

    • Liney: Une liste de droite y-chemin des maisons

    • b: Une liste de la boîte de 3x3 des maisons

    • n: Une liste de pays.

    • remplis: combien de personnes ont vécu dans une maison maintenant.

Qu’est-ce qu’une méthode?

Les méthodes sont les comportements d’une classe ou d’un objet. Par exemple, si nous définissons une classe de la radio contient plusieurs boutons, alors nous devrions définir les méthodes lorsque certaines bouton a été poussé. Il peut commencer à recevoir un programme d’une station, ou enregistrer un programme dans le lecteur CD, etc ..

Voici les principales méthodes des classes de cette bibliothèque:

  • Nombre Classe:

    • Setit (p1): quand le peuple d’un pays à trouver une maison (p1) à vivre, cette méthode sera appelée

  • Point de Classe:

    • can_see (p1): pour vérifier une maison peut voir une autre maison (p1) ou pas?

    • can_see_those (posList): pour vérifier une maison peut voir une liste de maisons, et retourner la liste des maisons qui ne peut les voir.

    Note

    Qu’est-ce que “** VOIR **”?

    les maisons dans le même sens x ou y-chemin ligne ou dans la même boîte, d’une maison, ce qui signifie que cette maison peut ** VOIR ** tous.

  • GroupBase Classe:

    • permettre (v): vérifier le groupe peut permettre aux gens de la campagne (dont l’id est v) de vivre ou pas?

    • get_num_pos (v): arriver là où les gens vivent dans ce groupe qui est les gens du pays (dont l’id est v), s’il n’y a pas des gens de ce pays, il retourne None.

    • count_num_possible (chiffre): obtenir l’identifiant et maisons, qui sont maintenant vide, et sont peut être attribué à un peuple des pays des pays, et les maisons sont égales au nombre (chiffre)

    • get_all_pos (méthode): obtenir toutes les maisons de ce groupe, si la méthode = “a ”; si la méthode = ” u”, obtenir toutes les maisons vides, si la méthode = “s ”, obtenir maisons pas tous vides.

  • Box Classe:

    • Toutes les méthodes GroupBase

    • get_group_number (num): Pour vérifier le nombre dans une boîte de formerait un numéro de groupe ou pas.

    Note

    Qu’est-ce que “** Nombre de groupe **”?

    Numéro du groupe se trouve dans une boîte. Ces maisons dans cette case peuvent et ne peuvent permettre aux gens de certains pays, et ces maisons dans un même ligne (ligne X-Way ou y de ligne de chemin), nous appellerons ces maisons forment un numéro de groupe ** **, Nous n ‘t savent quelle maison est les gens du pays devraient enfin vivre, mais nous savons que les autres maisons dans cette ligne ne seront pas permettre aux gens de la même pays à vivre.

  • LinEx Classe:

    • Avoir les mêmes méthodes que GroupBase

  • Liney Classe:

    • Avoir les mêmes méthodes que GroupBase

  • Matrix Class:

    • get_all_pos (méthode): si la méthode = “a”, obtenir toutes les maisons; si la méthode = “u”, obtenir toutes les maisons vides; si la méthode = “s”, obtenir toutes les maisons où ont vécu les gens

    • sort_unassigned_pos_by_possibles (possibles): obtenir toutes les maisons vides qui ne sont allowfd pour [possibles] pays, les personnes, si possibles == 0, il obtiendra toutes les maisons vides, et triés par les possiles de faible à élevé.

    • can_see (p0, method = “u”, num = 0): obtenir les maisons qui cand la maison (p0), si le num = 0, veut obtenir les maisons seulement sont autorisés les gens du pays num.

    • Setit (x, y, v): Laissez les gens du pays de v vivent dans la maison de la position (x, y).

    • réduire (x, y, v): Quand un peuple du pays à trouver une maison convenable pour vivre, alors une maison vide peut voir la maison permettra de réduire leurs pays possibles gens à vivre po

    • permettre (x, y, v): consultez le pays v gens peuvent vivre dans la maison de la position (x, y) ou pas?

    • lire (dossier): lire le premier défini que le nombre de personnes et où ils ont vécu dans cette vallée.

Jeu fichier défini

Vous pouvez définir le jeu de sudoku en donnant x, y, v ligne par ligne dans un fichier texte. comme suit: définir son fichier est dans le [répertoire d’installation] / sudoku / données /

Un échantillon de définir et de sa matrice originale et le résultat
m3.data

Matrice d’origine

résultat Matrice

_images/m3.png _images/origin.png _images/result.png

Lancer Programmation pour résoudre un Sudoku

Lorsque nous avons créé un monde de sudoku simulation dans l’ordinateur pour résoudre un sudoku, maintenant nous devons aller de l’avant pour mettre en œuvre des méthodes qui nous résoudre dans nos propres mains. En autre monde, la programmation, est la substance qui nous enseignons ordinateur de faire quelque chose que nous avons connue.

Nous présentons d’abord l’environnement résoudre, nous allons présenter quelques méthodes de base de cette bibliothèque.

environnement de résolution

Nous créons une fonction solve () pour faire la vraie résolution de sudoku, et nous faisons deux classes d’exception, SudokuDone, SudokuError pour capturer l’événement se produit lorsque nous utilisons des méthodes pour résoudre un sudoku.

Note

Quelle est “Exception”?

Exception est un événement défini, lorsque la condition d’événement s’est produit, le système s’arrête le traitement et passer au traitement d’exception. Il existe deux grandes exceptions dans l’environnement:

SudokuDone:

lorsque le sudoku a été résolu, va soulever cette exception

SudokuError:

quand un peuple de pays à mettre dans une maison, mais seront briser la règle de jeu, cela posera cette exception

Pour permettre à l’environnement sait combien les méthodes qu’ils peuvent utiliser pour résoudre un sudoku, nous créons une classe, SolveMethod. Nous utilisons cette classe pour créer toutes les méthodes dans un cerveau. Nous pouvons traiter ce cerveau comme le dieu de cette vallée. Chaque fois, quand les gens ne font pas la façon de choisir leurs maisons appropriées, vous pouvez demander au dieu de la vallée, et il vous donnera une réponse, ou il dire que, “** Je ne sais pas comment faire non plus! **

Chaque registre de la méthode dans le cerveau comme un objet SovleMethod, ils ont ces propriétés principales:

  1. amusant: le nom de la fonction de la méthode de codage de python

  2. idx: l’indice de la méthode, de la plus facile à la plus difficile, le cerveau va utiliser cette séquence pour régler un jeu de un à un.

  3. nom: le nom de la méthode

  4. niveau: le niveau difficile pour l’homme, l’aide à compter niveau difficile d’un jeu

processus de résolution

Voici l’organigramme de résoudre ():

_images/flowchart.png

Note

** Travailler ou non? **

Une méthode fonctionne ou pas signifie que l’utilisation de cette méthode peut:

  1. permettent une ou plusieurs personnes pour trouver son ou sa propre maison,

  2. OU peut laisser une ou plusieurs maisons savent qu’ils ne sont pas autorisés pour les personnes de certains pays.

Dans ce diagramme, nous savons que:

  1. Quand une méthode est de définir une personne ou réduire permis les gens d’une maison, il reviendra à la première méthode pour redémarrer la résolution du jeu.

  2. Si une méthode ne peut pas travailler à résoudre un jeu, il va donner le jeu à la méthode suivante pour le résoudre.

  3. Et si la méthode finale ne peut pas résoudre un jeu, il va sortir et de dire “Je ne peux pas comprendre ce jeu, désolé! “

  4. Dans le processus de résolution de problèmes, si événement “error”, “done” ou se produisent, il s’éteint.

Certaines méthodes de base

  1. fill_only_one_possible:

    Trouvez toutes les maisons dans un groupe, si il ya une seule maison que les gens d’un pays peuvent y vivre, cette maison doit laisser partir le peuple de ce pays à vivre po

  2. fill_last_position_of_group:

    Lorsque dans un groupe (ligne ou boîte) sont une seule gauche, il doit permettre un seul peuple du pays y vivent.

  3. check_obvious_number:

    Vérifiez tous les gens de la campagne qui a vécu dans une maison, et quand ces gens observent d’autres boîtes qui a encore pas vécu leurs gens du pays, peut trouver une seule maison qui a permis à leurs gens du pays ou pas?

  4. check_inobvious_number:

    C’est la même méthode que check_obvious_number, mais quelques maisons de boîtes sont formés comme un numéro de groupe ** **.

  1. reduce_by_group_number:

    Si il ya un numéro de groupe ** ** dans une boîte, des maisons vides de son même sens pourrait être de réduire les gens possibles de pays de ce numéro de groupe.

  2. update_chain:

    Comme les maisons ont été vécu certaines personnes, cela ferait quelques maisons vides réduisent les gens de certains pays possibles. Et puis ces maisons vides dans un groupe (ligne X-Way, y de ligne de chemin, boîte) peuvent former une chaîne ** **.

Comment mettre en œuvre une méthode?

Nous pourrions mettre en œuvre une méthode appelée check_obvious_for_a_country (m, num) méthode, par exemple:

 1  def check_obvious_for_a country(m, num):
 2  checked = list()
 3  for p1 in m.n[num].p:
 4      for b in m.b[p1.b].effects:
 5          possible = []
 6          if b in checked:
 7              continue
 8          else:
 9              checked.add(b)
10          if num not in m.b[b].possible:
11              continue
12          for p2 in m.b[b].p:
13              if p2.v != 0 or p2.can_see(p1) > 0:
14                  continue;
15              if not m.lineX[p2.x].allow(num):
16                  continue
17              if not m.lineY[p2.y].allow(num):
18                  continue
19              possible.append(p2)
20          if len(possible) == 1:
21              m.setit(possible[0].x, possible[0].y, num, d="Obvious For a Country People")
  1. ligne n ° 1, définir une méthode, * m * est le monde de ce jeu, et ** nombre ** est un identifiant de pays, voici 1-9.

  2. ligne n ° 3, commence à trouver les toutes les personnes qui ont vécu dans une maison d’un pays.

  3. ligne # 4-9, le scanner toutes ses boîtes d’effet si ceux n’ont pas été vérifiées.

  4. ligne # 10-11, il les gens du pays ont en direct dans cette zone, l’ignorer.

  5. ligne # 12-19, vérifier toutes les maisons vides dans cette boîte qui permettent les gens du pays ou pas, si oui, le mettre dans la liste des possibles.

  6. ligne # 20-21, si la liste des possibles ne dispose que d’une maison, il faut peut être attribué à cette maison pour les gens du pays.

Package: Sudoku - la méthode de la programmation orientée objet

C’est la méthode de oop pour résoudre le Sudoku.