Skip to content
Tags

Volume d’une pizza: un cas généralisable ?

9 août 2012

Peut-être connaissez-vous le dessin montrant que le calcul du volume d’une pizza est équivalent à son nom (http://jaytest.posterous.com/solve-for-pizza) ?

pi.z.z.a = π.z².a
(avec z étant le rayon et a la hauteur)

Si cela fonctionne avec le mot pizza, peut-être cela fonctionne-t-il avec d’autres mots? Voilà la question que vous ne vous êtes jamais posé et dont cet article va s’empresser de répondre.

Contraintes

Il faut que le mot comporte :

  • le terme « pi » ;
  • strictement deux fois une autre lettre que p ou i et qu’elles soient consécutives ;
  • une cinquième lettre, différente de p, de i et de la lettre en double.

Par exemple, les mots suivants ne sont pas valides : « abcpi » (pas de lettre en double), « pizzas » (trop long), « pizaz » (non consécutifs), « pizzz » et « zpizz » (lettre triple).

Outils

Il faut une liste de mots du dictionnaire, par exemple /usr/share/dict/french et un peu de code pour faire le traitement.

Le script python écrit pour la circonstance :

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

import codecs
import re

def main():
   print(filtrer_mots(mots_avec_pi()))
   
def mots_avec_pi():
    with codecs.open("/usr/share/dict/french", "r", "utf-8") as f:
        return [mot[:-1] for mot in f.readlines() if "pi" in mot]


def filtrer_mots(mots):
    return [mot 
            for mot 
            in mots 
            if a_la_bonne_longueur(mot) and a_seulement_deux_caracteres_consecutifs(mot)]

def a_la_bonne_longueur(mot):
    return len(mot) == len("pi" + "rr" + "h")

def a_seulement_deux_caracteres_consecutifs(mot):
    doublons = re.compile(r".*(.).*\1")
    try:
        group = doublons.match(mot).group(1)
    except AttributeError:
        return False
    else:
        return not est_dans_pi(mot, group) and \
                est_consecutif(mot, group) and \
                a_deux_occurences(mot, group)

def est_dans_pi(mot, caractere):
    return caractere in "pi"

def est_consecutif(mot, caractere):
    return caractere * 2 in mot

def a_deux_occurences(mot, character):
    return mot.count(character) == 2


if __name__ == "__main__":
    main()

Conclusion

On obtient quatre résultats : « pilla », « pille », « pillé », « pizza ». À part pizza, pas facile de faire une représentation graphique.😦

L’équation reste valide même si les deux lettres représentant le rayon ne se suivent pas. Si on supprime cette contrainte, la liste est plus longue mais pas vraiment meilleure. Elle inclut de nouveaux termes : « épicé », « épiée », « épiés », « épilé », « expie », « piégé », « piété » et « tapit ».

Il existe donc des mots avec les mêmes caractéristiques sans qu’on puisse les utiliser pour faire le même trait d’humour. C’est vraiment pas drôle !

From → Python

Laisser un commentaire

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :