{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Produit des lettres d'un mot"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "On s'ennuie, c'est les vacances ! Récréation sans prétention ... Donnons la valeur 1 à la lettre A, 2 à la lettre B, ..., 26 à la lettre Z. Histoire d'être complets, la valeur d'une lettre minuscule est égale à celle de la majuscule correspondante, et on ne compte pas les accents. Enfin, un tiret ou un espace ont pour valeur 1, le neutre pour la multiplication. Pour ce que nous allons en faire, cela signifie que les espaces et les traits d'unions ne comptent pas. Euh ah bon pourquoi ?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Voici une fonction prenant une lettre en paramètre et renvoyant sa valeur. J'ai sans doute oublié des cas, libre à vous de compléter."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def valeur_lettre(c):\n",
    "    if c in ['é','è','ê','ë']: c = 'e'\n",
    "    elif c in ['à','â']: c = 'a'\n",
    "    elif c in ['ï','î']: c = 'i'\n",
    "    elif c in ['ô','ö']: c = 'o'\n",
    "    elif c in ['ù','ü']: c = 'u'\n",
    "    elif c in [' ', '-']: return 1\n",
    "    c = c.upper()\n",
    "    m = ord(c)\n",
    "    if m >= ord('A') and m <= ord('Z'): return m - ord('A') + 1\n",
    "    return 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "valeur_lettre('a')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "valeur_lettre('é')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "valeur_lettre('J')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La valeur d'un mot est le produit des valeurs de ses lettres. Le fait d'avoir attribué aux espaces et aux traits d'union la valeur 1 fait que ceux-ci ne comptent pas dans la valeur du mot. Remarquons que les A ne comptent pas non plus. Est-ce bien raisonnable ?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def valeur_mot(s):\n",
    "    p = 1\n",
    "    for c in s:\n",
    "        p = p * valeur_lettre(c)\n",
    "    return p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "valeur_mot('abc')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "valeur_mot('difféomorphisme')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Le fichier joint `frgut.py` contient un dictionnaire d'environ 200000 mots français (conjugaisons et pluriels compris). Je ne sais pas à quel point ce dictionnaire est exhaustif ... La fonction `mots` prend en paramètre un entier `n` et renvoie tous les mots du dictionnaire de valeur `n`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def mots(n):\n",
    "    f = open('frgut.txt', 'r')\n",
    "    lines = f.readlines()\n",
    "    f.close()\n",
    "    reps = []\n",
    "    for s in lines:\n",
    "        s = s.strip()\n",
    "        if valeur_mot(s) == n:\n",
    "            # print(s)\n",
    "            reps.append(s)\n",
    "    return reps"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Apparemment, 2016 était une année faste ! Soyez un tantinet patients, la fonction examine tous les mots du dictionnaire. Quand je dis patients, s'il ne s'affiche rien au bout de 10 secondes soyez plus inquiets que patients."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "mots(2016)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "J'adore l'Écosse !"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(mots(valeur_mot('cornemuse')))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Encore un essai ? Séquence culture : les holothuries (ne pas confondre avec les lolotueries, lorsque je rend les DS) sont une classe d'animaux marins de l'embranchement des échinodermes au corps mou et oblong, et possédant un cercle de tentacules autour de la bouche. Elles sont aussi appelées concombres de mer. Bon, on a rien compris, mais ça a l'air assez moche. Je confirme, masque et tuba à l'appui, c'est très moche."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(mots(valeur_mot('holothurie')))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ça ne sert à rien mais c'est rigolo. Amusez vous bien (disons 30 secondes :-))!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
