<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sudoku | Dr. Goulu</title><link>https://drgoulu.com/tags/sudoku/</link><atom:link href="https://drgoulu.com/tags/sudoku/index.xml" rel="self" type="application/rss+xml"/><description>Sudoku</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>fr-FR</language><lastBuildDate>Sun, 12 Oct 2008 00:00:00 +0000</lastBuildDate><image><url>https://drgoulu.com/media/icon_hu_eee4a95885829ab2.png</url><title>Sudoku</title><link>https://drgoulu.com/tags/sudoku/</link></image><item><title>Python : un petit Sudoku pour commencer</title><link>https://drgoulu.com/2008/10/12/python/</link><pubDate>Sun, 12 Oct 2008 00:00:00 +0000</pubDate><guid>https://drgoulu.com/2008/10/12/python/</guid><description>&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt=""
srcset="https://drgoulu.com/posts/2008/images/c2281c83670e31d8aaab7cb642b824db_hu_8f3a76d4d0cffefc.webp 320w, https://drgoulu.com/posts/2008/images/c2281c83670e31d8aaab7cb642b824db_hu_ff85c168c6ba8746.webp 480w, https://drgoulu.com/posts/2008/images/c2281c83670e31d8aaab7cb642b824db_hu_230bd27ab1f5d3ef.webp 601w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://drgoulu.com/posts/2008/images/c2281c83670e31d8aaab7cb642b824db_hu_8f3a76d4d0cffefc.webp"
width="601"
height="203"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
Ces temps-ci, je découvre
, un langage de programmation très apprécié en particulier dans la communauté scientifique. Ce &amp;ldquo;
&amp;rdquo; intègre des concepts développés dans plusieurs langages récents, ce qui en fait peut-être le langage le plus complet disponible actuellement.&lt;/p&gt;
&lt;p&gt;Pour une première approche de ce langage, je vous propose l&amp;rsquo;analyse du&amp;hellip;&lt;/p&gt;
&lt;h3 id="plus-court-solveurde-sudoku"&gt;Plus Court Solveur de Sudoku&lt;/h3&gt;
&lt;p&gt;Voici un  programme en Python de 173 caractères seulement qui serait le plus court
connu actuellement :&lt;/p&gt;
\[sourcecode lang="python"\]&lt;p&gt;def r(a): i=a.find(&amp;lsquo;0&amp;rsquo;) if i&amp;lt;0:print a &lt;/p&gt;
\[m in\[(i-j)%9\*(i/9^j/9)\*(i/27^j/27|i%9/3^j%9/3)or a\[j\]&lt;p&gt;for j in range(81)]or r(a&lt;/p&gt;
\[:i\]&lt;p&gt;+m+a&lt;/p&gt;
\[i+1:\]&lt;p&gt;)for m in`14**7*9`]r(raw_input())&lt;/p&gt;
\[/sourcecode\]&lt;p&gt;Ce programme est extrêmement compact et condensé, voire cryptique à l&amp;rsquo;instar des
. Ce n&amp;rsquo;est pas forcément la meilleure façon de programmer, mais ça révèle souvent la puissance cachée de certains langages. Ce programme est décrit en anglais et en détail
, mais voici son principe en gros et en français:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;def r(a): ... r(raw_input())&lt;/code&gt; // définit la fonction &amp;ldquo;r&amp;rdquo; qui résout le sudoku, puis on l&amp;rsquo;appelle en passant en paramètre ce que l&amp;rsquo;utilisateur a entré au clavier. Ca doit être une chaine de 81 caractères contenant ligne par ligne les chiffres de 1 à 9 donnés, et des 0 aux emplacements vides.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;i=a.find('0') if i&amp;lt;0:print a&lt;/code&gt; // au début de la fonction, on cherche le premier emplacement vide. Si on ne le trouve pas, on imprime le sudoku résolu&lt;/p&gt;
&lt;p&gt;la partie principale de la fonction utilise deux concepts puissants de Python:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;la &amp;ldquo;lazy evaluation&amp;rdquo; qui fait que l&amp;rsquo;expression &amp;ldquo;a or b&amp;rdquo; est équivalente à &amp;ldquo;if not(a):b&amp;rdquo;&lt;/li&gt;
&lt;li&gt;la &amp;ldquo;compréhension de liste&amp;rdquo; qui permet de créer une liste en écrivant une boucle à l&amp;rsquo;intérieur de
\[crochets\]. Par exemple &amp;ldquo;l =
\[x\*\*2 for x in range(10)\]&amp;rdquo; crée la liste des carrés des 10 premiers nombres entiers&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ainsi cette expression &lt;code&gt;[(i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3)or a[j]for j in range(81)]&lt;/code&gt; fournit la &amp;ldquo;liste d&amp;rsquo;exclusion&amp;rdquo; contenant les chiffres qui ne peuvent pas figurer dans le trou à la position i. On l&amp;rsquo;obtient en parcourant toutes les celllules et en ajoutant à la liste la valeur des cases a&lt;/p&gt;
\[j\]&lt;p&gt; situées sur la même ligne, la même colonne ou dans le même bloc que i. Le grand test compliqué détermine ces conditions en utilisant les opérateurs modulo (%), ou binaire (|) et ou exclusif (^).&lt;/p&gt;
&lt;p&gt;Finalement, le &lt;code&gt;[m in [...] or r(a[:i]+m+a[i+1:])for m in`14**7*9`]&lt;/code&gt; remplit successivement la grille avec les chiffres possibles en utilisant la &amp;rsquo;lazy evaluation&amp;rsquo; une fois de plus : ce n&amp;rsquo;est que si le chiffre m n&amp;rsquo;est pas dans la liste d&amp;rsquo;exclusion qu&amp;rsquo;on execute la partie droite du or, laquelle appelle récursivement la fonction r en lui passant la grille en paramètre la grille &lt;code&gt;a[:i]+m+a[i+1:]&lt;/code&gt;. Ici , l&amp;rsquo;opérateur + sert à concaténer des listes : d&amp;rsquo;abord les i-èmes premières cases, puis le chiffre m proposé pour la case vide, puis les cases à partir de la i+1 ème.&lt;/p&gt;
&lt;p&gt;Ce programme utilise donc une approche &amp;ldquo;force brute&amp;rdquo; loin d&amp;rsquo;être optimale en temps de calcul : on essaie les chiffres possibles dans chaque case vide jusqu&amp;rsquo;à ce que ça marche.&lt;/p&gt;
&lt;p&gt;Reste à découvrir une astuce de geek que je ne connaissais pas : 14**7*9 vaut 948721536, un nombre qui contient les chiffres 123456789, dans le désordre, mais ça va aussi pour notre application. Les backquotes ´&amp;hellip;´ servent à former une chaine, comme d&amp;rsquo;ailleurs la fonction str(). L&amp;rsquo;avantage de ´14**7*9´sur ´123456789´ ? ben c&amp;rsquo;est évident : il faut deux bytes de moins &amp;hellip;&lt;/p&gt;</description></item><item><title>Sudoku</title><link>https://drgoulu.com/2005/10/26/sudoku/</link><pubDate>Wed, 26 Oct 2005 00:00:00 +0000</pubDate><guid>https://drgoulu.com/2005/10/26/sudoku/</guid><description>&lt;p&gt;Ce jeu &amp;ldquo;à la mode&amp;rdquo; n’est en fait pas très difficile si on suit une méthode systématique.&lt;/p&gt;
&lt;p&gt;Les 2 &amp;ldquo;solveurs en ligne&amp;rdquo; suivants montrent la méthode en résolvant un Sudoku pas à pas :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;celui-ci permet d&amp;rsquo;imprimer un sudoku pour le résoudre à la main
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il est à mon avis plus difficile de créer un Sudoku, en étant sur qu’il n’admette qu’une seule solution d’une part, et ayant une difficulté donnée d’autre part.&lt;/p&gt;
&lt;p&gt;Les générateurs de Sudoku que j’ai trouvé sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>