{
"cells": [
{
"cell_type": "markdown",
"id": "1083a244",
"metadata": {},
"source": [
"# Dixième exercice en Python (Niveau Lycée)"
]
},
{
"cell_type": "markdown",
"id": "6b34b83b",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"id": "88d56210",
"metadata": {},
"source": [
"*Résumé en français* : On vous donne une liste contenant des **couleurs** de **moufles** (donc pas de main gauche ou droite à distinguer). On vous demande le **nombre de paires** que vous pouvez **constituer**, c'est-à-dire avoir **2 moufles de la même couleur**. "
]
},
{
"cell_type": "markdown",
"id": "f54ad165",
"metadata": {},
"source": [
"Avec le **premier exemple** donné, on peut constituer une **paire** de moufles **rouge** (red) **et** une paire **bleue** (blue) soit **2 paires**."
]
},
{
"cell_type": "markdown",
"id": "248a940e",
"metadata": {},
"source": [
"## Version classique"
]
},
{
"cell_type": "markdown",
"id": "b44fedd4",
"metadata": {},
"source": [
"Relisez l'exercice 6 que j'ai proposé, vous devriez constater de nombreuses ressemblances.\n",
"\n",
"Une **première idée** est de commencer par **récupérer les différentes** couleurs puis, **pour chacune d'elle**, de compter **combien de fois** cette **couleur apparait**. Il suffira de **diviser par 2** ce nombre (sans tenir compte des virgules) pour savoir **combien de paires** on peut **constituer** avec cette couleur. Finalement, on fera la **somme** du **nombre de paires** trouvées."
]
},
{
"cell_type": "markdown",
"id": "d6fdeecc",
"metadata": {},
"source": [
"Je reprends la **structure classique** vue dans l'exercice 6 :"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "6c626080",
"metadata": {},
"outputs": [],
"source": [
"def nb_paires(gants):\n",
" couleurs = [ ] # couleurs distinctes\n",
" for g in gants: # on parcourt les gants\n",
" if g not in couleurs: # nouvelle couleur ?\n",
" couleurs.append(g) # on l'ajoute à la liste\n",
" paires = 0 # nombre de paires possibles\n",
" for c in couleurs: # on parcourt à nouveau les gants\n",
" paires += gants.count(c) // 2 # on compte puis ÷ entière par 2 \n",
" return paires # on renvoie le nombre de paires"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "8f57e2e6",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nb_paires([\"gray\",\"black\",\"purple\",\"purple\",\"gray\",\"black\"])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "a31135c9",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nb_paires([\"red\",\"green\",\"blue\"])"
]
},
{
"cell_type": "markdown",
"id": "d5035601",
"metadata": {},
"source": [
"## Version ensembliste"
]
},
{
"cell_type": "markdown",
"id": "e9375d3e",
"metadata": {},
"source": [
"Comme nous l'avons également vu dans l'exercice 6, nous pouvons utiliser des **ensembles** (`set`) pour récupérer les éléments **uniques**. Les versions sont alors nettement plus courtes :"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "6d432895",
"metadata": {},
"outputs": [],
"source": [
"def nb_paires(gants):\n",
" return sum(gants.count(v) // 2 for v in set(gants))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "3c04efc7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nb_paires([\"gray\",\"black\",\"purple\",\"purple\",\"gray\",\"black\"])"
]
},
{
"cell_type": "markdown",
"id": "90fd0000",
"metadata": {},
"source": [
"## Version utilisant une seule boucle et une pile"
]
},
{
"cell_type": "markdown",
"id": "d38d2080",
"metadata": {},
"source": [
"Est-il vraiment nécessaire de récupérer les couleurs uniques ? Imaginons la situation dans la **vie réelle** avec `'red' 'green' 'red' 'blue' 'blue'` :\n",
"\n",
"- Dans ma tête je pense à **0**, c'est le **nombre de paires** que j'ai réussi à faire\n",
"- Je prends le **premier** gant, il est `'red'`, je n'ai pas cette couleur donc je la garde\n",
"- Je prends le **deuxième**, il est `'green'`, je n'ai pas cette couleur donc je la garde\n",
"- Je prends le **troisième**, il est `'red'`. J'ai déjà cette couleur, je peux donc faire une **paire**. **J'enlève** les 2 moufles 'red' et **j'ajoute 1** au nombre de paires\n",
"- Je prends le **quatrième**, il est `'blue'`, je n'ai pas cette couleur donc je la garde\n",
"- Je prends le **cinquième**, il est `'blue'`. J'ai déjà cette couleur, je peux donc faire une **paire**. J'enlève les 2 moufles 'blue' et **j'ajoute 1** au nombre de paires\n",
"- J'ai finalement réussi à constituer **2 paires**."
]
},
{
"cell_type": "markdown",
"id": "5853d19b",
"metadata": {},
"source": [
"🤖 Refaites de tête le processus avec les gants `'red' 'red' 'red' 'red' 'red'`"
]
},
{
"cell_type": "markdown",
"id": "b44eeb17",
"metadata": {},
"source": [
"**Prendre** un gant revient à **ajouter** un élément dans une liste, inversement **créer** une **paire** à **éliminer** cette couleur de la liste. Voyons comment ajouter, enlever ou tester si un élément est dans un ensemble en utilisant les méthodes `add`, `remove` :"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "4968c2b2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'red'}"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"paires = set() # Ensemble vide\n",
"paires.add('red') # on ajoute 'red' à l'ensemble\n",
"paires"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "fea5c34d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'blue', 'red'}"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"paires.add('blue')\n",
"paires"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "1c2c463c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'blue'}"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"paires.remove('red') # on enlève 'red'\n",
"paires"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "117b34e2",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"'red' in paires # on teste si 'red' est dans l'ensemble"
]
},
{
"cell_type": "markdown",
"id": "74d805f4",
"metadata": {},
"source": [
"Version finale basée sur cette idée :"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "0df6090d",
"metadata": {},
"outputs": [],
"source": [
"def nb_paires(gants):\n",
" couleurs = set() # les couleurs trouvées\n",
" paires = 0 # nb de paires réalisées\n",
" for c in gants: # on parcourt les gants\n",
" if c in couleurs: # couleur déjà vue ?\n",
" couleurs.remove(c) # on la retire des couleurs trouvées\n",
" paires += 1 # le nombre de paires augmente de 1\n",
" else: # sinon\n",
" couleurs.add(c) # ajouter cette nouvelle couleur\n",
" return paires # nombre de paires trouvées"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "babfacab",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nb_paires([\"gray\",\"black\",\"purple\",\"purple\",\"gray\",\"black\"])"
]
}
],
"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
}