Feat(NSI): fin du chapitre sur les string
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Bertrand Benjamin 2023-02-14 11:36:18 +01:00
parent dfcfe86d31
commit 809c20cc21
9 changed files with 633 additions and 17 deletions

View File

@ -0,0 +1,135 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "651b99d9",
"metadata": {},
"source": [
"# Unicode et python\n",
"\n",
"La fonction `chr` permet de passer du point de code au caractère. Le point de code peut être exprimé en décimal ou en exadécimal.\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "1b5a86a7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'🙏'"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chr(128591)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "128b0f7b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'😂'"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chr(0x01F602)"
]
},
{
"cell_type": "markdown",
"id": "442746cb",
"metadata": {},
"source": [
"La fonciton `print` quand à elle peut directement accépté le point de code. Pour cela, il faut ajouter \\U et les 0 nécéssaires pour avec un mot de 8 caractères"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "59bcd496",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"🔥\n"
]
}
],
"source": [
"print(\"\\U0001F525\")"
]
},
{
"cell_type": "markdown",
"id": "60dfa4c9",
"metadata": {},
"source": [
"1. Utilisez la fonction `chr` (en décimal) pour faire un tableau de 10 colonnes sur 5 lignes avec les caractères après 🔥"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a9f74419",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "9bb194d8",
"metadata": {},
"source": [
"2. Utiliser la fonction `chr` (en héxadécimal) pour faire un tableau de 15 colonnes sur 10 lignes avec les caractères après U+A000"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "eb44cde5",
"metadata": {},
"outputs": [],
"source": []
}
],
"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.10.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@ -0,0 +1,342 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "bf0de95a",
"metadata": {},
"source": [
"# Les strings\n",
"\n",
"Dans ce TP, vous apprendrez les manipulations de bases des chaine de caractères en python (`str`)."
]
},
{
"cell_type": "markdown",
"id": "e42ebfb4",
"metadata": {},
"source": [
"## Str\n",
"\n",
"Les `str` en python ont de nombreuses similarités avec les `list` et les `tuple`."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "64156203",
"metadata": {},
"outputs": [],
"source": [
"mot = \"Salut tout le monde\""
]
},
{
"cell_type": "markdown",
"id": "6a818ba8",
"metadata": {},
"source": [
"Reprendre le cours sur les listes et les tuples et trouver les similarités avec les `str`. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "640433ba",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "f758b002",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "35bbe2e4",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "ca07c701",
"metadata": {},
"source": [
"Les `str` ont des méthodes spécifiques"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "70da034e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Salut_tout_le_monde'"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mot.replace(\" \", \"_\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "952f4936",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'SALUT TOUT LE MONDE'"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mot.upper()"
]
},
{
"cell_type": "markdown",
"id": "45762d2b",
"metadata": {},
"source": [
"## Exercices techniques"
]
},
{
"cell_type": "markdown",
"id": "6c221743",
"metadata": {},
"source": [
"1. Ecrire une fonction `renverse` qui prend en argument une chaine de caractère et qui renverse cette dernière."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "24a281d3",
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "renverse() takes 0 positional arguments but 1 was given",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"Input \u001b[0;32mIn [11]\u001b[0m, in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# tests\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[43mrenverse\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mazerty\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mytreza\u001b[39m\u001b[38;5;124m\"\u001b[39m\n",
"\u001b[0;31mTypeError\u001b[0m: renverse() takes 0 positional arguments but 1 was given"
]
}
],
"source": [
"# tests\n",
"assert renverse(\"azerty\") == \"ytreza\""
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "7cb00bce",
"metadata": {},
"outputs": [],
"source": [
"# votre fonction"
]
},
{
"cell_type": "markdown",
"id": "1691a5f7",
"metadata": {},
"source": [
"2. Un palindrome est une chaine de caractère qui est identique peu importe le sens dans lequel on la lit.\n",
"\n",
"Écrire une fonction `est_palindrome` qui prend en argument une chaine de caractère et qui renvoie vrai ou faux suivant si elle est un palindrome ou non (on ne tiendra pas compte des espaces)."
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "b16877c0",
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'est_palindrom' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"Input \u001b[0;32mIn [9]\u001b[0m, in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# tests\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[43mest_palindrom\u001b[49m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcoucou\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m est_palidrome(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mazertreza\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m est_palindrome(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcaser vite ce palindrome ne mord ni lape cet ivre sac\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n",
"\u001b[0;31mNameError\u001b[0m: name 'est_palindrom' is not defined"
]
}
],
"source": [
"# tests\n",
"assert est_palindrome(\"coucou\") == False\n",
"assert est_palindrome(\"azertreza\") == True\n",
"assert est_palindrome('caser vite ce palindrome ne mord ni lape cet ivre sac') == True\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "4f8ca51b",
"metadata": {},
"outputs": [],
"source": [
"# Votre fonction"
]
},
{
"cell_type": "markdown",
"id": "a06bc2e4",
"metadata": {},
"source": [
"## Chiffrement\n",
"\n",
"Le chiffrement de Césars consiste à décaler l'alphabet dans un message pour le rendre non comprehensible. Le décalage est appelé `clé de chiffrement`.\n",
"\n",
"Ainsi si la clé de chiffrement est 2, on aura\n",
"\n",
"| message orginnal | message chiffré |\n",
"| --- | --- |\n",
"| les | ngu |\n",
"\n",
"On supposera que le message original ne contient que des caractères ASCII (entre 32 et 126). Le message chiffré sera lui aussi composé de caractères ASCII entre 32 et 126.\n",
"\n",
"1. Écrire une fonction `chiffre_lettre` qui prend en argument la clé de chiffrement et un caractère et qui renvoie le caractère chiffré. "
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "db6ab5b9",
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'chiffre_lettre' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"Input \u001b[0;32mIn [13]\u001b[0m, in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# tests\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[43mchiffre_lettre\u001b[49m(\u001b[38;5;241m2\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124ml\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mn\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m chiffre_lettre(\u001b[38;5;241m4\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m~\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m#\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m chiffre_lettre(\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m10\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m?\u001b[39m\u001b[38;5;124m'\u001b[39m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m5\u001b[39m\u001b[38;5;124m'\u001b[39m\n",
"\u001b[0;31mNameError\u001b[0m: name 'chiffre_lettre' is not defined"
]
}
],
"source": [
"# tests\n",
"assert chiffre_lettre(2, 'l') == 'n'\n",
"assert chiffre_lettre(4, '~') == '#'\n",
"assert chiffre_lettre(-10, '?') == '5'"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "b5b0a910",
"metadata": {},
"outputs": [],
"source": [
"# Fonction"
]
},
{
"cell_type": "markdown",
"id": "765d8791",
"metadata": {},
"source": [
"2. Écrire une fonction `chiffre_message` qui prend en argument la clé de chiffrement et le message et qui renvoie tout le message chiffré."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "93ab941b",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "ca7c256c",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "43e00026",
"metadata": {},
"source": [
"3. Écrire une fonction `dechiffre_message` qui prend en argument la clé de chiffrement et un message chiffré et qui renvoie le message déchiffré."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "395c7b40",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "534209fd",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "271a2087",
"metadata": {},
"source": [
"4. Statistiquement, le caractère le plus présent dans un message et l'espace. Servez vous de cette connaissance pour écrire une fonction qui sera capable de trouver "
]
}
],
"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.10.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@ -1,14 +0,0 @@
\documentclass[a4paper,10pt]{article}
\usepackage{myXsim}
\author{Benjamin Bertrand}
\title{Representation de texte - Cours}
\date{janvier 2023}
\pagestyle{empty}
\begin{document}
\maketitle
\end{document}

Binary file not shown.

View File

@ -0,0 +1,89 @@
\documentclass[a4paper,10pt]{article}
\usepackage{myXsim}
\usepackage{minted}
\author{Benjamin Bertrand}
\title{Representation de texte - Cours}
\date{Février 2023}
\pagestyle{empty}
\begin{document}
\maketitle
Dans cette séquence, on traitera des différentes façons de faire correspondre un caractère (une lettre, un espace...) avec une représentation binaire.
\section{Table et encodage}
\begin{definition}[Table ASCII]
En 1960, la norme \textbf{ASCII} (American Standard Code for Information Interchange) a été crée pour uniformiser l'encodage des caractère par \textbf{l'ANSI} (American National Standards Institute).
Elle définit 128 codes, comprenant 95 caractères imprimables :
\begin{itemize}
\item les chiffres arabes de 0 à 9
\item les 26 lettres de l'alphabet latin en minuscules et en capitales
\item des symboles mathématiques et de ponctuation
\end{itemize}
Chaque caractère est codé sur 7 bits même si on le représente le plus souvent sur 8 bits (1 octet)
\end{definition}
\paragraph{Remarques:}
\begin{itemize}
\item Avantages de la table ASCII: \dotfill
\item Limitations: \dotfill
\end{itemize}
\begin{definition}[ISO-8859-1 ou Latin-1]
Pour rendre l'utilisation de la table ASCII plus universelle d'autres tables ont été créées.
L'ISO (Organisation internationale de normalisation) a proposé la norme ISO-8859 qui utilise le 8e bit pour ajouter 128 caractères supplémentaires pour un total de $2^8 = 256$ caractères.
Parmi les tables issues de cette norme, la table ISO-8859-1 (ou Latin-1) est celle qui a été le plus utilisée en occident car elle ajoute les caractères accentués et des nouveaux signes de ponctuation.
\end{definition}
\paragraph{Remarques:}
\begin{itemize}
\item Avantages de la table ISO-8859-1: \dotfill
\item Limitations: \dotfill
\end{itemize}
\begin{definition}[Unicode]
Pour assurer l'universalité de la représentation de caractères la norme \textbf{Unicode} découpe l'encodage en deux étape:
\begin{itemize}
\item Le point de code: association entre un caractère et un \textbf{point de code} codés sur 20 ou 21 bits
\item L'encodage du point de code (UTF-n où n est le nombre minimal de bit pour représenter un point de code).
\end{itemize}
Encodages les plus utilisés:
\begin{itemize}
\item UTF-8: le point de code est encodé sur 1 à 4 octets (ou 8 à 32 bits)
\item UTF-16: le point de code est encodé sur 2 à 4 octets (16 à 32bits)
\item UTF-32: le point de code est encodé sur 4octets (ou 32 bits)
\end{itemize}
\end{definition}
\paragraph{Encodage et décodage avec l'Unicode} (en vous aidant de \url{https://unicode-table.com/fr})
\begin{center}
\begin{tabular}{p{3cm}|p{3cm}|p{3cm}|p{3cm}}
Caractère & Point de code & UTF-8 & UTF-32 \\
\hline
a & & & \\
\euro & & & \\
$\aleph$ & & & \\
\end{tabular}
\end{center}
\paragraph{Remarques:}
\begin{itemize}
\item Avantages de l'Unicode: \dotfill
\item Limitations: \dotfill
\end{itemize}
\end{document}

View File

@ -16,12 +16,12 @@
\begin{center}
4D 61 74 68 3A 29
\end{center}
\item Le programme de l'enseignement scientifique de terminal contient \np{65252} caractères. Quelle sera son poids s'il est numérisé en ASCII? Vous exprimerez le résultat en octet et en bit.
\item Le programme de première NSI contient \np{25107} caractères. Quelle sera son poids s'il est numérisé en ASCII? Vous exprimerez le résultat en octet et en bit.
\end{enumerate}
\end{exercise}
\begin{exercise}[subtitle={Table ASCII et Python}, step={1}, origin={}, topics={ Representation de texte }, tags={ ASCII, Chiffrement }]
En Python, il existe deux fonctions qui permettent de convertir un caractère en son point de code en décimal et inversement.
En Python, il existe deux fonctions qui permettent de convertir un caractère en son point de code (lisez place dans la table ASCII pour le moment) en décimal et inversement.
\begin{itemize}
\item \mintinline{python}{ord}: caractère vers point de code
\item \mintinline{python}{chr}: point de code vers le caractère
@ -31,3 +31,51 @@
\item Comparer le résultat avec la table obtenu.
\end{enumerate}
\end{exercise}
\begin{exercise}[subtitle={Norme ISO-8859-1}, step={1}, origin={}, topics={ Representation de texte }, tags={ ASCII, Chiffrement }]
\begin{enumerate}
\item Chercher la table d'encodage ISO-8859-1 (ou latin-1).
\item Comparer cette table avec la table ASCII.
\item Encoder le mot \texttt{a«€éø}
\end{enumerate}
\end{exercise}
\begin{exercise}[subtitle={Unicode table}, step={2}, origin={}, topics={ Representation de texte }, tags={ ASCII, Chiffrement }]
La norme Unicode découpe le processus d'encodage en deux parties: le point de code et l'encodage.
Vous trouverez les points de code et les encodages correspondant sur le moteur de recherche \url{https://unicode-table.com/fr}.
\begin{enumerate}
\item Compléter le tableau ci-dessous avec les points de code et les encodage (représentée sous la forme qui vous semble la plus familière).
\begin{center}
\begin{tabular}{|p{3cm}|p{3cm}|p{3cm}|p{3cm}|p{3cm}|}
\hline
Caractère & Point de code & UTF-8 & UTF-16BE & UTF-32BE \\
\hline
I & & & &\\
\hline
\euro & & & &\\
\hline
$\aleph$ & & & &\\
\hline
& U+20B3 & & &\\
\hline
& U+1F606 & & &\\
\hline
& U+FE9A & & &\\
\hline
\end{tabular}
\end{center}
\item Quels sont les caractères qui sont inclus dans la norme Unicode?
\item Quels sont les encodages possibles et quelles sont leur caractéristiques?
\item Comment est placé la table ASCII dans cette norme?
\end{enumerate}
\end{exercise}
\begin{exercise}[subtitle={Exploration de l'Unicode}, step={2}, origin={}, topics={ Representation de texte }, tags={ ASCII, Chiffrement }]
Notebook \texttt{02_unicode}
\end{exercise}
\begin{exercise}[subtitle={Encodage UTF-8}, step={2}, origin={}, topics={ Representation de texte }, tags={ ASCII, Chiffrement }]
On verra...
\end{exercise}

View File

@ -2,7 +2,7 @@ Représentation du texte
#######################
:date: 2023-02-03
:modified: 2023-02-03
:modified: 2023-02-14
:authors: Benjamin Bertrand
:tags: Str, Python
:category: 1NSI
@ -12,7 +12,22 @@ Représentation du texte
Éléments du programme
=====================
Plan de travail
.. image:: ./plan_de_travail.pdf
:height: 200px
:alt: Plan de travail
Étape 1: Manipulation ASCII et ISO-8859-1
-----------------------------------------
Explication cours sur la différence entre table de caractère et encodage. Présentation de la table ASCII puis ISO-8859-1.
Étape 2: Unicode
----------------
Étape 3: String et python
-------------------------
`String et python - jupyter notebook <./03_str.ipynb>`_

Binary file not shown.

View File

@ -1,5 +1,6 @@
\documentclass[a4paper,12pt]{article}
\usepackage{myXsim}
\usepackage{minted}
\author{Benjamin Bertrand}
\title{Representation de texte - Plan de travail}