{ "cells": [ { "cell_type": "markdown", "id": "fe8d3904", "metadata": {}, "source": [ "# Cinquième exercice en Python (Niveau Lycée)" ] }, { "cell_type": "markdown", "id": "d4dba9e5", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "id": "1f899d69", "metadata": {}, "source": [ "Exemple 1 : `~O~O~O~OP`\n", "Tous les rats vont bien vers le joueur de flûte, donc aucun n'est sourd. Valeur attendue = 0\n", "\n", "Exemple 2 : `PO~O~~OO~`\n", "Le rat souligné va dans la mauvaise direction, il est donc sourd. Valeur attendue = 1\n", "\n", "Exemple 3 : `~OO~~O~OP~OO~O~`\n", "Cette fois il y a 2 rats sourds. Valeur attendue = 2" ] }, { "cell_type": "markdown", "id": "dddcd526", "metadata": {}, "source": [ "## Séparer les rats à gauche et à droite du joueur de flûte" ] }, { "cell_type": "markdown", "id": "c1ee6357", "metadata": {}, "source": [ "Une *première idée* est de récupérer les rats qui sont à **gauche** et à **droite** du joueur de flûte. Pour cela on utilise `split` :" ] }, { "cell_type": "code", "execution_count": 1, "id": "dd8fa4ae", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['~O~O~O~O', '']" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'~O~O~O~OP'.split('P')" ] }, { "cell_type": "code", "execution_count": 2, "id": "f4f7ca5e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['', 'O~O~~OO~']" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'PO~O~~OO~'.split('P')" ] }, { "cell_type": "code", "execution_count": 3, "id": "afa05146", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['~OO~~O~O', '~OO~O~']" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'~OO~~O~OP~OO~O~'.split('P')" ] }, { "cell_type": "markdown", "id": "95b3da50", "metadata": {}, "source": [ "Ensuite, un rat sera sourd dans la partie **gauche** s'il y a un 'O' à une position **paire** (puisque l'on est censé avoir déjà la queue du rat puis la tête ~O et pas l'inverse). De la même façon, dans la partie **droite**, un rat est sourd si on trouve un 'O' à une position **impaire**. On pourrait donc imaginer faire 2 boucles, chacune ressemblant à :\n", "\n", "
for i in range(len(gauche)):\n",
    "  if gauche[i] == 'O' and i%2 == 0:   # un 'O' à une position paire\n",
    "    sourds += 1 
\n", " \n", "Une boucle suffit si on concatène **gauche** et **droite** (et que l'on retourne une des 2 chaines). C'est-à-dire passer de `['~OO~~O~O', '~OO~O~']` à l'unique chaine `'~OO~~O~O~O~OO~'` (on a retourné tous les rats qui étaient dans la partie **droite**). Les rats sourds sont ceux où il y a un 'O' à une position paire (rappel, en Python et JavaScript, le premier élément d'une chaine ou d'un tableau est à la position **0**). " ] }, { "cell_type": "markdown", "id": "e4f99935", "metadata": {}, "source": [ "Retourner une chaine en Python :" ] }, { "cell_type": "code", "execution_count": 4, "id": "6708e3f4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'ruojnob'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'bonjour'[::-1]" ] }, { "cell_type": "markdown", "id": "10ec6782", "metadata": {}, "source": [ "Il faut donc parcourir toutes les lettres de la chaine contenant les rats et regarder s'il y a un 'O' à une position paire. Pour cela on utilise `enumerate` qui permettra de récupérer à la fois le caractère et son rang :" ] }, { "cell_type": "code", "execution_count": 5, "id": "172fd0dd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(0, '~'),\n", " (1, 'O'),\n", " (2, 'O'),\n", " (3, '~'),\n", " (4, '~'),\n", " (5, 'O'),\n", " (6, '~'),\n", " (7, 'O'),\n", " (8, '~'),\n", " (9, 'O'),\n", " (10, '~'),\n", " (11, 'O'),\n", " (12, 'O'),\n", " (13, '~')]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(enumerate('~OO~~O~O~O~OO~'))" ] }, { "cell_type": "markdown", "id": "ebcf5139", "metadata": {}, "source": [ "Vous avez tout pour comprendre cette version :" ] }, { "cell_type": "code", "execution_count": 6, "id": "07dc0d69", "metadata": {}, "outputs": [], "source": [ "def rats_sourds(town):\n", " [gauche, droite] = town.split('P')\n", " rats = gauche + droite[::-1]\n", " return sum([c == 'O' and i % 2 == 0 for i,c in enumerate(rats)])" ] }, { "cell_type": "code", "execution_count": 7, "id": "63631e8b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rats_sourds('~O~O~O~OP')" ] }, { "cell_type": "code", "execution_count": 8, "id": "04291bed", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rats_sourds('PO~O~~OO~')" ] }, { "cell_type": "code", "execution_count": 9, "id": "c1ef39ce", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rats_sourds('~OO~~O~OP~OO~O~')" ] }, { "cell_type": "markdown", "id": "9196e4da", "metadata": {}, "source": [ "## A-t-on vraiment besoin de séparer la gauche et la droite ?" ] }, { "cell_type": "markdown", "id": "581605f5", "metadata": {}, "source": [ "En observant un peu plus attentivement la chaine représentant une ville, par exemple `'~OO~~O~OP~OO~O~'`, on se rend compte que peu importe l'emplacement du joueur de flûte, il y aura un rat sourd dès qu'un `'O'` est observé à une position **paire**. Par exemple dans la ville `'P~OO~O~'`, la tête du rat sourd est bien à une position paire.\n", "\n", "*Finalement, il suffit de compter le nombre de 'O' qu'il y a dans la ville en n'ayant récupéré que les lettres qui sont aux positions paires.*" ] }, { "cell_type": "markdown", "id": "518e6ccb", "metadata": {}, "source": [ "Il est très facile de récupérer une lettre sur 2 en Python :" ] }, { "cell_type": "code", "execution_count": 10, "id": "2956be03", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'UeeteuDu'" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'UneLettreSurDeux'[::2]" ] }, { "cell_type": "markdown", "id": "88d73496", "metadata": {}, "source": [ "Et le programme final, beaucoup plus court suite à notre analyse : " ] }, { "cell_type": "code", "execution_count": 11, "id": "5e5758d1", "metadata": {}, "outputs": [], "source": [ "def rats_sourds(ville):\n", " return ville[::2].count('O')" ] }, { "cell_type": "code", "execution_count": 12, "id": "75ddc5ec", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rats_sourds('~OO~~O~OP~OO~O~')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.6" } }, "nbformat": 4, "nbformat_minor": 5 }