oct 27 2008

Un petit solveur de sudokus…

Les sudokus, ces petites grilles carrées qui envahissent nos journaux et magazines depuis quelques années maintenant, ont donné naissance à de nombreux logiciels dont l’unique but est leur résolution. Appelés de façon barbare « solveurs », ces programmes sont désormais légion, qu’ils soient en C, en C++, en Python, en Java, et j’en passe. Aujourd’hui, je suis tombé (sans me faire mal) sur une de ces bêtes, mais particulièrement étonnante pour le coup ; un solveur de sudokus en Python… qui tient en quatre lignes !
Voici sans plus tarder l’exploit, dont je ne connais l’auteur :

#! /usr/bin/env python
# -*- coding: utf-8 -*-

def r(a):
    i = a.find(‘0’)
    if i<0: print a
    [m in[(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)]
    or r(a[:i]+m+a[i+1:]) for m in `14**7*9`]

En envoyant une chaîne de 81 chiffres à la fonction r, qui correspondent à la grille de sudoku avec 0 à la place des inconnues, cette dernière affiche une chaîne de 81 chiffres où, miracle, les 0 sont remplacés par les bonnes valeurs.

Certes, la méthode est tout ce qu’il y a de plus bourrin, du brute force au sens strict du terme, mais ça a la don de marcher et de ne tenir qu’en quatre lignes.

Comment ça marche ?

Si j’aère un peu le code, et que je l’explique un peu, ça sera sans doute plus clair :

#! /usr/bin/env python
# -*- coding: utf-8 -*-

# On va donc définir une fonction r qui, appelée récursivement, va résoudre
# nos sudokus.

def r(a):
    i = a.find(‘0’) # On cherche le premier 0 de la chaîne, donc le premier
                    # "trou" du sudoku duquel on va chercher la valeur.
    if i<0: print a  # Si il n’y en a pas, c’est que le sudoku est résolu
                     # (donc find renvoie -1) ; on l’affiche.

    # C’est là que ça devient génial. Savant mélange de compréhension
    # et de or, on se retrouve avec quelque chose de très compact mais
    # de diablement efficace que je détaille en dessous.
    [m in[(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)]
    or r(a[:i]+m+a[i+1:]) for m in `14**7*9`]

En fait, on va dans un premier temps parcourir la grille de sudoku pour faire une liste de valeurs impossibles pour la case en cours. Cela se fait par le code suivant :

valeurs_impossibles = [(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)]
 

Pour chaque naturel j de 0 à 80, on ajoute à la liste valeurs_impossibles (i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3) ou, si cette expression est fausse, a[j]. La liste contient donc les valeurs des cases de la ligne, de la colonne et du carré où se situe i, en plus de valeurs farfelues largement supérieures à 9 qui ne nous intéresse donc pas (le résultat de (i-j)%9*(i/9^j/9)*(i/27^j/27|i%9/3^j%9/3) dans le cas où il est non nul, en fait). On obtient donc une liste de valeurs impossibles pour i.

[m in valeurs_impossibles or r(a[:i]+m+a[i+1:]) for m in "123456789"]
 

On regarde pour chaque chiffre m si il est dans la liste valeurs_impossibles. Si ce n’est pas le cas (or), on appelle la fonction r en lui envoyant la nouvelle grille où on a placé m dans la case i.
Enfin, dernier détail, dans le code original on a `14**7*9` et non « 123456789 ». En fait, ça revient au même, puisque 14**7*9 = 948721536, on a donc dans les deux cas une chaîne de tous les chiffres sauf zéro (l’ordre n’a pas d’importance). Seulement, `14**7*9` comporte deux caractère de moins par rapport à « 123456789 », utile quand on veut faire le plus petit solveur ;) .
Grâce à la récursivité, on teste ainsi toutes les combinaisons possibles, au détriment de l’optimisation, mais on est sûr de trouver, si elle existe, la solution à notre sudoku (reste à savoir en combien de temps !). Factorisé au maximum, le code tient en quatre lignes, une prouesse permise par la puissance du langage de programmation Python.


oct 25 2008

« La décision »

Geekscote strip #115
Je lisais un des 188 contes à régler de Sternberg tout à l’heure quand j’ai repensé aux élections américaines, et plus précisément aux machines à voter.
Des machines pour voter, j’ai toujours trouvé ça débile, encore plus depuis la victoire contestable de Bush face à Al Gore. Justement, le conte de Sternberg parlait d’une machine de ce genre ;

« Dans cette importante entreprise, les demandeurs d’un emploi, modeste ou exigeant au contraire de réelles capacités, avaient exclusivement affaire à un seul ordinateur.
Qui les questionnait, les psychanalysaient, leur faisait passer des tests, les piégeaient et les soupesaient, examinant à la loupe toutes les facettes de leur profil de futur employé.
Il fallut attendre plusieurs années avant de comprendre que les décisions finales, définitives, de refus ou d’engagement, l’ordinateur les avait toujours jouées simplement à pile ou face. »
- Sternberg, « La décision », 188 contes à régler
(La citation est courte hein, je viole pas le copyright… enfin, j’espère ;) )

C’est ça qui m’a fait songer aux machines à voter. En fait, je m’inquiète de savoir si le drame de 2001 peut se reproduire et conduire Mc Cain au pouvoir (même s’il faudrait dans ce cas bien plus qu’une fraude). Apparemment, d’après cet article du Nouvel Obs : « erreurs de programmation, problèmes informatiques divers ou encore inexpérience des utilisateurs ont eu raison des machines à voter électroniques aux États-Unis ». La nouvelle semble bonne, même si on apprend à la suite de l’article que ce sont tout de même 43 % des électeurs qui se retrouveront face à ces machines liberticides. Et puis, il n’y a pas que les USA : dois-je rappeler que notre pays lui-même impose de plus en plus ces ordinateurs tout-puissant (alors même que les États-Unis tendent à les supprimer) ?
Je ne suis pas « technophobe », loin de là, mais les machines à voter me choquent autant que les télécrans d’Orwell. Peut-être que, dans des années, on aura compris que les élections sont toujours jouées simplement à pile ou face… avec une pièce pipée.

Geekscote strip #50

Les images qui illustrent ce billet sont sous licences Creative Commons (Attribution-Share Alike 3.0 pour la première, Attribution-Share Alike 2.0 pour la deuxième). Elles ont été réalisées par l’excellent nojhan (nojhan@gmail.com) et sont disponibles, parmi tant d’autres, sur Geekscottes.


oct 20 2008

Shipit : Pré-commandes d’Ubuntu 8.10 ouvertes !

Après quelques soucis, ShipIt est enfin prêt : aujourd’hui, les pré-commandes de CD de la version 8.10 d’Ubuntu, répondant au doux nom d’Intrepid Ibex, ont été ouvertes. Le formulaire, déjà accessible depuis quelques heures, était cependant victime d’un bug, heureusement réparé, qui empêchait toute commande.
Canonical propose, au travers de ce site, d’envoyer gratuitement (oui, gratuitement) des CD d’Ubuntu pressés, avec une joli pochette. Tout comme la dernière fois, la firme anglaise n’enverra qu’un seul CD (alors qu’elle en envoyait jusqu’à 10 pour la version Feisty Fawn).
Ces CD, qui commenceront à être envoyés après la sortie de la version finale le 30 octobre, mettent quelques semaines à arriver (la gratuité à un coût…), souvent trois ou quatre.
À noter aussi que pour cette version, il n’est pas possible de commander des CD Edubuntu.

Vous pouvez donc commander dès maintenant un CD d’Ubuntu ou de Kubuntu grâce à Shipit !


oct 19 2008

Censure, filtrage : quand le Mangin se sinise.

« Pour des raisons de sécurité, afin d’éviter que les élèves n’aient accès à des informations de nature douteuse, la consultation des sites est filtrée. »
- Charte informatique et internet de la cité scolaire Mangin

Un constat alarmant

Depuis quasiment le début de l’année scolaire, nous travaillons chaque lundi après-midi sur les TPE. Afin de nous organiser de manière simple, j’ai mis en place un wiki sur mon ordinateur personnel, accessible grâce à un nom de domaine dyndns. Tout fonctionnait bien, jusqu’à lundi dernier : en tapant naïvement l’url dans la barre d’adresse d’Internet Explorer 5, nous ne recevions qu’une page blanche en réponse, agrémentée d’un petit paragraphe d’où ressortait, en lettres grasses, accès interdit.
Notre TPE serait-il douteux ? Notre wiki serait-il illégal ?
Même en Chine, je parie qu’il est accessible ! Mais au Mangin, non. La censure est déjà, par nature, inacceptable, mais son aveuglement la rend encore plus terrible, et terrifiante : force est de constater que le filtrage est hasardeux et, en plus d’être inefficace, profondément injuste. Nos conditions de travail ne sont déjà pas optimales en raisons d’un matériel défaillant, dépassé ; voilà qu’on nous impose désormais une censure incohérente.
La censure telle que nous devons la subir ne sert à rien : combien de sites de jeux sont accessibles ? Beaucoup, sans doute. Ces sites seraient-ils plus scolaires que celui de notre TPE ?
Mais où va-t-on ?
La censure, quelle qu’elle soit, doit être rejetée. Rien, comprenez bien, ne peut impunément nous empêcher d’être libres, or la censure est une atteinte directe, terrible et stupéfiante à notre Liberté.
Il existera cependant toujours un moyen de contrer la censure ; nous nous retrouvons pris dans une guerre idéologique dont le filtrage « Mangin » n’est qu’une petite bataille, au même titre que le grand pare-feu chinois est une grande bataille.

Des réponses à la censures et à l’espionnage de masse

Il existe des parades, fort heureusement, et il en existera toujours. Je prône un contournement de ces mesures inadmissibles par tous les moyens. Je ne peux cependant savoir quelles mesures marchent et quelles autres échouent, dans la mesure où le processus censeur est totalement opaque.
En premier lieu, la création en masse de noms de domaines redirigeant vers le site censuré peut fonctionner, au moins un temps. Ces innombrables adresses tomberont, les unes après les autres, mais si elles sont remplacées plus rapidement qu’elles ne tombent, le site demeurera accessible.
Des logiciels tels que psiphon peuvent aussi être employés.
Enfin, la mise en place de tunnels ssh peut s’avérer très efficace. En tout cas, il faut chiffrer les communications ; utiliser le protocole HTTPS (SSL), chiffrer les mails avec GPG/PGP, afin d’annihiler toute tentative de ce qu’il faut bien appeler de l’espionnage.

Il y avait la grille, il y avait la caméra. Maintenant, il y a la censure.

« ils me fusilleront ça m’est égal ils me troueront la nuque cela m’est égal à bas Big Brother ils visent toujours la nuque cela m’est égal À bas Big Brother. »
1984, George Orwell


oct 3 2008

C’est de circonstance

« Bientôt nous plongerons dans les froides ténèbres ;
Adieu, vive clarté de nos étés trop courts !
J’entends déjà tomber avec des chocs funèbres
Le bois retentissant sur le pavé des cours.

Tout l’hiver va rentrer dans mon être : colère,
Haine, frissons, horreur, labeur dur et forcé,
Et, comme le soleil dans son enfer polaire,
Mon cœur ne sera plus qu’un bloc rouge et glacé.

J’écoute en frémissant chaque bûche qui tombe ;
L’échafaud qu’on bâtit n’a pas d’écho plus sourd.
Mon esprit est pareil à la tour qui succombe
Sous les coups du bélier infatigable et lourd.

Il me semble, bercé par ce choc monotone,
Qu’on cloue en grande hâte un cercueil quelque part.
Pour qui ? - C’était hier l’été ; voici l’automne !
Ce bruit mystérieux sonne comme un départ. »
Charles BAUDELAIRE (1821-1867), Les fleurs du mal