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

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

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 !

Catégories :Python Étiquettes :
  1. 7 juillet 2017 à 17:45

    C’est le style de projet qui fait aimer la programmation. En plus, ça parle de pizza … 😛

  1. No trackbacks yet.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.