{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9dd16c10",
   "metadata": {},
   "source": [
    "# Feuille d'exercices 3 -- avancé\n",
    "\n",
    "\n",
    "```{warning} \n",
    "Ces exercices sont prévus pour les étudiant·e·s ayant déjà réussi la feuille d'exercices \"classiques\".\n",
    "```\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "## Exercice 8 : anagrammes\n",
    "\n",
    "Deux mots sont appelés des **anagrammes** s'ils sont composés d'exactement les mêmes lettres (comptées avec leur multiplicité). Par exemple :\n",
    "- \"juste\" et \"sujet\" sont des anagrammes\n",
    "- \"cannes\" et \"encas\" ne sont pas des anagrammes, car la lettre \"n\" apparaît 2 fois dans \"cannes\" et seulement une fois dans \"encas\".\n",
    "\n",
    "**Question 1.** Écrire une fonction `anagramme(mot1, mot2)` qui prend en entrée deux mots sous la forme de chaînes de caractères, et qui teste si ces deux mots sont l'anagramme l'un de l'autre."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6b5d9133",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "084a4ed6",
   "metadata": {},
   "source": [
    "**Question 2.** Testez votre fonction avec les paires de mots suivantes :\n",
    "1. \"niche\" et \"chien\"\n",
    "1. \"calcul\" et \"formel\"\n",
    "1. \"anna\" et \"naan\"\n",
    "1. \"sagemath\" et \"sagemath\"\n",
    "1. \"garage\" et \"rage\"\n",
    "1. \"doree\" et \"dorer\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "db511321",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dfeaba8b",
   "metadata": {},
   "source": [
    "La relation \"être l'anagramme l'un de l'autre\" est une **relation d'équivalence** (vous pouvez le vérifier mathématiquement si vous le souhaitez). On peut donc essayer **d'identifier les différentes \"classes d'anagrammes\"** dans une liste de mots.\n",
    "\n",
    "**Question 3.** Écrire une fonction `classe_anagrammes(liste)` qui prend en entrée une liste de mots `liste`, et qui retourne une liste des classes d'anagrammes de `liste`.\n",
    "\n",
    "Puis, tester sur la liste :\n",
    "```\n",
    "L = [\"niche\", \"casser\", \"carnet\", \"crasse\", \"ressac\", \"sagemath\", \"nectar\", \"chien\"]\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "83ad241f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cc400a4f",
   "metadata": {},
   "source": [
    "## Exercice 9 : chiffrement ROT13\n",
    "\n",
    "Le chiffrement **ROT13** est un chiffrement \"jouet\" (c'est-à-dire, à ne pas utiliser sérieusement) qui fonctionne sur des textes contenant uniquement des lettres de l'alphabet en majuscules. Ce chiffrement s'effectue **par substitution** : on remplace les lettres du message clair en des lettres du message chiffré selon la règle suivante :\n",
    "\n",
    "```\n",
    "caractère \"clair\"   : A B C D E F G H I J K L M N O P Q R S T U V W X Y Z\n",
    "caractère \"chiffré\" : N O P Q R S T U V W X Y Z A B C D E F G H I J K L M\n",
    "```\n",
    "\n",
    "Par exemple, le caractère `J` est remplacé par le caractère `W`.\n",
    "\n",
    "**Question 1 :** Écrire le dictionnaire de substitution de **ROT13**, c'est-à-dire le **dictionnaire** `SUB` qui a pour clés les caractères \"clairs\" allant de A à Z, et qui a pour valeur correspondant à un caractère clair, le caractère chiffré correspondant. Par exemple, il faut que `SUB['J']` soit égal à `W`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "deede0e4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45d3b284",
   "metadata": {},
   "source": [
    "**Question 2 :** Écrire une fonction `chiffre_rot13(texte)` qui prend en entrée un texte formé uniquement de caractères allant de A et Z, et qui retourne le chiffré correspondant par **ROT13**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "adf617fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "58bd90ec",
   "metadata": {},
   "source": [
    "**Question 3 :** Écrire la fonction de déchiffrement `dechiffre_rot13(chiffre)` qui \"inverse\" le chiffrement, c'est-à-dire qui prend en entrée un texte chiffré par **ROT13**, et qui retourne le texte clair correspondant. Puis, vérifier que le déciffrement d'un chiffré donne le message d'origine."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "47a67574",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70eafc72",
   "metadata": {},
   "source": [
    "**Question 4 :** Déchiffrer le cryptogramme `SRYVPVGNGVBAF`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b16a9905",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2fe3e4d5",
   "metadata": {},
   "source": [
    "## Exercice 10 : questions avancées sur les listes\n",
    "\n",
    "**Question 1.** Écrire une fonction `plus_grande_plage(L)` qui prend en entrée une liste d'éléments `L`, et qui retourne la **taille** de la plus grande série d'éléments identiques consécutifs (une telle série est appelée une **plage**). Par exemple, pour la liste `L = [0, 1, 1, 1, 3, 3, 2, 3, 3, 3, 3, 4, 0]`, la fonction retournera $4$, car la plus grande série d'éléments identiques consécutifs est de taille $4$ (c'est une série d'entiers qui valent $3$)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "724e8d40",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "44c79248",
   "metadata": {},
   "source": [
    "**Question 2.** Écrire une fonction `troisieme_plus_petit(L)` qui prend en entrée une liste d'entiers `L`, et qui retourne le troisième plus petit entier de la liste. Par exemple, pour la liste `L = [1, -8, -4, 5, 0, 6, -8, 2]`, la fonction retournera $-4$. Si la liste a strictement moins de $3$ éléments, retourner un message d'erreur."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2d66c25e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Votre réponse ici"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "python",
   "language": "python",
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
