977731833235239280 un nombre étonnant !

Ce nombre a une propriété surprenante :

Vous pouvez changez deux quelconques de ses chiffres, et vous ne tomberez jamais sur un nombre premier. Il semble, d’après deux mathématiciens polonais que c’est le plus petit nombre ayant cette propriété !

Ce problème (la recherche de ce nombre) datait d’une vingtaine d’années…

Bravo donc à Witold Jarnicki et Maciej Żenczykowski qui laissent leurs imprononçables noms à la postérité mathématiques !

Un logiciel de Poker Hold em gratuit et open source

Vu ce soir sur framasoft, dans la catégorie “jeux réseau”, un soft appelé PokerTH.

PokerTH est un logiciel de Poker Texas Hold’Em (la variante du poker la plus jouée au monde), qui permet de jouer seul(e) contre l’ordinateur ou jusqu’à 7 joueurs en réseau. Il est disponible en plusieurs langues (dont le français et l’anglais) et pour les principaux systèmes d’exploitation (Windows, Linux, MacOSX).

Téléchargé dans la foulée, et essayé aussi vite (pas en réseau), je suis enthousiasmé par la qualité et l’ergonomie de ce soft.

Il permet de s’entrainer “pour du beurre” avant d’affronter ses amis autour d’une vraie table !

De blogger vers WordPress, une migration laborieuse

Laborieuse ne veut pas dire désagréable, mais la migration de Blogger vers WordPress ne se fait pas sans un certain travail !


D’abord, pouquoi migrer ?

Je n’ai rien contre Blogger, même contre sa soit-disante inéfficacité au niveau du référencement : WoufsBlog était plutôt bien indexé, dans des niches très spécifiques comme les échecs ou le développement Python.

C’est plutôt la curiosité qui m’a poussé à migrer.

De plus je connaissais Dotclear mais  pas WordPress et la honte commençait à me gagner quand je lisais les articles de la blogosphère qui le glorifiait.

Je me suis donc lancé,
les pluggins existants et mon ami google m’ont rendu la tâche plus facile.

Pourtant tout n’est pas si simple.

Par exemple il m’a semblé impossible
(à tort ?) de garder la communauté MyBlogLog  de Woufsblog en migrant.

Dans technorati, j’ai dû créer un “nouveau” blog…

Et puis, si la majorité des URL sont bien redirigées, d’autres se retrouvent… dans les choux.

Des regrets ?

Négatifs ! La rapidité de l’affichage des pages m’a convaincu, ma migration était la bienvenue !

Et pourtant…

Je ne regrette pas d’avoir pas d’avoir commencé par Blogger,
qui m’a appris à privilégier le contenu par rapport au “design” .

Et c’est pourquoi,

malgré la richesse des thèmes proposés par Wordpress,
je garde ce thème par défaut, pour ne pas sombrer,
comme beaucoup dans le travers du beau pour le beau,
en perdant de sa substance…

Le renard n’aimant pas l’Ajax, je file à l’Opera


Le couple Firefox-Netvibes me cause du souci. J’adore les deux, mais ils se disputent sans cesse. Il n’est pas rare que Firefox se referme, gêné par les javascript un peu violent de Netvibes.

Quand des amis se disputent, les soirées sont moins agréables, et il est nécessaire de trouver rapidement une solution.

Abandonné les deux ? Hors de question ! Quoi que…

Un peu exaspéré des lenteurs du renard, je m’étais tourné il n’y a pas longtemps vers la bêta d’IE8, un peu honteux quand même…

J’ai surfé cette nuit, à la vitesse de l’éclair avec un navigateur que (J’avoue) je ne connaissais que de nom : Opera.

Opera est rapide ! très rapide !!!

Oui mais mes extensions Firefox étaient bien pratiques quand même…

AVG 8.0 safe search me validait les liens sûr.

MySpell me corrigeait une partie de mes trop nombreuses fautes d’orthographe.

Del.icio.us Bookmarks 1.5.44 me permettait d’avoir mes favoris sur tous les ordinateurs connectés au web.

DownThemAll! gérait mes téléchargement.

Google PageRank Status me donnait des informations sur la popularité des sites que je visitais.

Clipping 3.0 (génial!) m’aidait à la saisie des textes répétitifs

Et j’en passe…

Comme beaucoup, je voudrai le beurre, et l’argent du beurre : la vitesse et les fonctionnalités “qui vont bien”…

Oh, bien sûr, on peut déporter certaines extensions hors du navigateur en les remplaçant par des applications standalone de qualité. (Par exemple opter pour Ditto, pour gérer les clippings…)
Mais il fut avouer que l’on perd en simplicité…

Je me demande si, en plus je ne voudrai pas le sourire de la crémière !

Anecdote polémique sur les différences Windows-Linux

Je viens de “cramer” une carte mère. Une ASUS qui doit avoir environ 5 ans et qui a supporté sans broncher (jusque là) une alimentation environ 20H sur 24 en moyenne…
Un processeur P4 à 2,4 Ghtz, une bête de compétition à l’époque, aujourd’hui toujours efficace pour ce que j’ai à en faire…

Aussi décidais-je de changer la carte mère, bien que le socket vieillissant ne m’accordait pas de choix fantastiques quant à la marque (Asrock).

Cette bécane est en dual boot: Windows et Suse Linux.

Avec Linux, le démarrage s’est passé comme une lettre à la poste (un tout petit peu plus long que d’habitude) et tout (son, usb…) est immédiatement fonctionnel.

Avec Xp, l’écran bleu au démarrage me sembla normal, évidemment il fallait (au moins) réparer windows. Ce qui, il est vrai, s’est passé rapidement, et sans difficulté.

J’ ai ensuite du installer manuellement les pilotes de la nouvelles carte mère, mettre à jour le pilote du chipset son, télécharger à nouveau les SP1 et 2 et gérer un problème de disque USB invisible dans l’explorer (j’en parle ici ).

Je m’efforce d’être impartial dans les polémiques continues entre ces deux OS (que j’aime) mais je dois reconnaître aujourd’hui, que sur ce coup là :

LINUX : 1 WINDOWS : 0


Combinaisons, coefficients binomiaux et triangle de Pascal

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
1 10 45 120 210 252 210 120 45 10 1
1 11 55 165 330 462 462 330 165 55 11 1
1 12 66 220 495 792 924 792 495 220 66 12 1

Les nombres ci-dessus, disposés géométriquement en triangle vous rappellent probablement quelques choses…

Ils s’agit des coefficients binomiaux que l’on obtient en développement des expressions du genre (a+b)2=1a2+2ab+1b2

Dans cet disposition géométrique chacun des nombres s’obtient en ajoutant le nombre du dessus et son voisin de gauche.

Ces nombres nous les avons déjà évoqués ici, il s’agit des C(n,p) qui servent à dénombrer le nombres de parties à p éléments d’un ensemble à n éléments.

(Par exemple on a vu dans ce billet que C(52,5)=2 598 960 nous donne le nombres de mains au poker)

On démontre aisément que C(n,p) = C (n-1,p-1) + C (n-1, p), et on peut utiliser cette formule pour se créer une fonction en Python pour calculer de façon récursive les C(n,p)

def cnp2 (n,p):
if p==0 or n==p:
return 1
exit
return cnp2(n-1,p-1)+cnp2(n-1,p)

Pour aller plus loin :
http://fr.wikipedia.org/wiki/Coefficient_binomial

Mathématiques pour les nuls, nombre de mains au poker

Le terme main désigne un ensemble de 5 cartes :

Par exemple:
As de trèfle, As de carreau, 8 de trèfle, 8 de pique et 6 de carreaux.

L’ordre des cartes n’a pas d’importance.

Pour bien comprendre ce billet, il peut être bon de relire:

Il y a 52 cartes dans le jeu.
Nous avons donc 52 possibilités pour la première carte. Celle-ci disparaît du jeu et il ne reste que 51 pour la deuxième, puis 50 pour la troisième, 49 pour la quatrième et enfin 48 pour la dernière.

52x51x50x49x48=311 875 200

Ce qui ne donne pas 311 875 200 mains! En effet nous avons spécifié plus haut que l’ordre n’avait pas d’importance !


photo credit: Wade From Oklahoma

Or nous avons dénombré plus de mains qu’il en a, puisqu’on a dénombré toutes les permutations possible des 5 cartes.
or il y a 5!=120 permutations dans un ensemble à 5 éléments.

La réponse au problème est donc
52x51x50x49x48/120=2598960Il y a exactement 2 598 960 mains au poker.
(On peut retenir, ça impressionne toujours en société qu’il y a environ 2,6 millions de mains au poker et que la probabilité d’avoir le plus gros jeu, soit la quinte flush royale à pique servie, est d’environ une chance sur 2,6 millions. Nous reparlerons de probabilité plus tard ! )

Qu’avons nous, mathématiquement, calculer ?

Combinaison, une définition simple :

On appelle combinaison de p élément d’un ensemble à n éléments une partie de cet ensemble ayant p éléments.

On note C(n,p) le nombre de ces combinaisons et on a:

Le script Python, avec la fonction cnp(n,p) qui permet de calculer le nombres de combinaisons :

Code Python traduit en HTML:
def fact (n):
    """retourne la factorielle de n""" 
    if n==0  :
        return 1
    else:
        return n*fact(n-1) #fonction récursive

def cnp (n,p):
    """retourne le nombre de combinaisons, p parmis n""" 

    if p>n:
        return "erreur" 
    result=1
    for i in range(n,n-p,-1):
        result *= i
    return result//fact(p)
def fact (n):
    """retourne la factorielle de n""" 
    if n==0  :
        return 1
    else:
        return n*fact(n-1) #fonction récursive

def cnp (n,p):
    """retourne le nombre de combinaisons, p parmis n""" 

    if p>n:
        return "erreur" 
    result=1
    for i in range(n,n-p,-1):
        result *= i
    return result//fact(p)

cnp

et un screenshot de l’IDLE:

Python, inverser une chaîne de caractères


La qualité numéro 1 du langage de programmation Python est son accessibilité, même pour les débutants.
Le code est lisible, compréhensible rapidement. Python est LE langage par excellence pour apprendre à programmer.

Si vous ne l’avez pas encore installer sur votre système, je vous engage fortement à le faire à partir du site officiel.

L’exemple de script que nous allons étudier aujourd’hui est basé sur une fonction crée par l’utilisateur, qui inverse une chaîne de caractère. Elle renverra par exemple TOM si on lui envoie MOT.

logigramme réalisé avec logigw
Code Python traduit en HTML:
def envers (mot):
 

    "inverse une chaine de caractères" 

    resultat=""                  # La chaine résultat est vide

    for lettre in mot:          # Pour chaque lettre de la chaine

     resultat=lettre+resultat   # On l'insère en première position

    return resultat             # Et on retourne la chaine

    

# Pour tester dans L'IDLE

a=input("chaine : " )

print (envers(a))

Le code ci-dessus que vous pouvez testé dans la console, est écrit en utilisant plusieurs couleurs :

Le rouge sert à afficher les commentaires, ceux-ci sont précédés du caractère #. Les commentaires ne sont pas des instructions exécutées par Python, mais sont destinés à la compréhension du code (Pour permettre de se replonger dans ses anciens scripts, sans risquer de maux de tête, par exemple)

En orange : les mots réservés du langage Python
ici nous avons def, for, in et return

En violet : les fonctions prédéfinies (non créées par l’utilisateur )
seule la fonction input() est utilisée dans ce script.

En bleu : Les fonctions crées par l’utilisateur
Ici une seule fonction : envers()

En vert : Les chaînes de caractères.
On en dénombre 3, dans des contextes très différents.

Une remarque importante, les espaces dans le code ont une importance capitale (On parle d’indentation du code), ainsi le bloc de code qui constitue le corps de la fonction envers est décalé de deux espaces vers la droite. Ainsi Python reconnaît la fin des instructions de cette fonction à l’arrêt de cette indentation.

Le mot clef def sert à définir notre propre fonction, il est suivi du nom de cette fonction (Ne pas utiliser de mots réservés ou de nom de fonctions prédéfinies!) puis de parenthèses enserrant une “variable” est du caractère “:”

def envers (mot):

On peut voir une fonction comme une usine, elle reçoit une matière première (ici une chaîne de caractère), effectue un travail (dans le bloc indenté) et livre (avec le mot clef
return) un produit fini (ici, une autre chaîne de caractère)

“inverse une chaîne de caractères”

Cette ligne est étrange, c’est une chaîne de caractères, seule, sans mot clefs qui demanderait à Python de faire quelque chose, sans affectation (On y reviendra). Elle semble ne servir à rien… Et pourtant son rôle est très pratique !
Si cette fonction est chargée en mémoire, en tapant envers ( avec une parenthèse ouvrante, cette phrase apparaît dans une bulle d’aide :

resultat=“”
On définit au départ la variable resultat comme une chaîne vide. A noter pour les vrais débutants en développement, le sens particulier du signe égal. Ce caractère est le symbole de l’affectation. On range la chaîne vide “” dans une “boite” qu’on a appelé resultat. Le contenue de cette boite changera au cours du script, cette boite est une variable.

for lettre in mot:

littéralement :
Pour lettre dans mot

mot est la matière première livrée à la fonction envers, une chaîne de caractères. Une chaîne de caractères étant constituée de lettres, l’expression for lettre in mot signifie que l’on va successivement affecter à la variable lettre les lettres contenues dans la chaîne mot (celle envoyée à la fonction).

Les deux points qui suivent, ainsi que l’indentation du code indique à Python que ce bloc indenté devra être exécuter pour chacune de ces lettres.

resultat=lettre+resultat

On reconnaît à nouveau ce signe égal d’affectation.
On va placer dans le membre de gauche (la variable resultat) l’évaluation de l’expression lettre + resultat. Je comprends l’étonnement de certain !
lettre est un caractère et resultat une chaîne ! Que signifie donc le signe + ?
Python comprend simplement +, pour des chaîne de caractère comme un ordre de concaténation :

“abc”+”def”=”abcdef”

 

 

Un exemple de ce qui se passe dans ce programme:
Supposons qu’on ait envoyé à la fonction envers, la chaîne “CHAT”

resultat est d’abord vide (resultat=””)
puis la boucle FOR IN parcourt les lettres de CHAT
1. resultat=”C”+”” soit “C”
2. resultat =”H”+”C” soit “HC”
3. resultat =”A” +”HC” soit “AHC”
4. resultat =”T” +”AHC” soit “TAHC”

la variable resultat contient donc une fois toutes les itérations de la boucles terminées, la chaîne de départ inversée.

Et l’usine envers() peut donc livrer son produit fini:

return resultat

La dernière partie du script, sert à tester la fonction:

a=input(“chaine : “)

input() est une fonction prédéfinie, son utilisation est aisée.
On range dans la variable a, la chaîne de caractères saisie au clavier par l’utilisateur.
Notez entre parenthèses une phrase d’invite pour lui indiquer ce qu’il doit faire.

print(envers(a))
Le mot réservé print
 

affiche à l’écran envers(a), le produit de la fonction envers quand on lui envoie la variable a.

On peut donc tester notre fonction:

Elle fonctionne, c’est déjà ça !!!

Tags Python abordés dans cet article

def
for
in
return
print
input

Google dans 20 ans !


Google in 20 years !, originally uploaded by the.voyager.

Même si c’est en Anglais, je pense que tout le monde peut comprendre!

Dans le champs de recherche il est écrit:
My fucking keys, qu’on pourrait traduire littéralement par:
-Mes putains de clefs de bagnole…

Et le célèbre moteur de recherche de répondre:
– Sur le frigo…

Etonnant non?