Skip to content

Commit 6b2cd8e

Browse files
committed
beginners: countdown, guess, palindrom, anagrams
1 parent 16a689e commit 6b2cd8e

15 files changed

+739
-0
lines changed

notebooks/_toc.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,16 @@
33
format: jb-book
44
root: README
55
parts:
6+
- caption: exercices débutants
7+
chapters:
8+
# input, loop, int(), except
9+
- file: exos/beginners/EXO-countdown-nb
10+
# import, argparse
11+
- file: exos/beginners/EXO-guess-nb
12+
# slicing conditional expression return/break
13+
- file: exos/beginners/EXO-palindrom-nb
14+
#
15+
- file: exos/beginners/EXO-anagrams-nb
616
- caption: exercices basiques
717
chapters:
818
# str, ints, binary computations
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
---
2+
jupytext:
3+
text_representation:
4+
extension: .md
5+
format_name: myst
6+
format_version: 0.13
7+
jupytext_version: 1.16.4
8+
kernelspec:
9+
display_name: Python 3 (ipykernel)
10+
language: python
11+
name: python3
12+
---
13+
14+
# les anagrammes
15+
16+
+++
17+
18+
## le sujet
19+
20+
+++
21+
22+
très similaires au palindrome, sauf que cette fois-ci:
23+
24+
- on travaille sur deux mots
25+
- et on regarde s'ils sont l'anagramme l'un de l'autre
26+
27+
deux mots sont des anagrammes si ils sont composés des mêmes lettres, mais dans un ordre différent
28+
on vous demande d'écrire un programme `anagrams.py`
29+
30+
- v0: lorsqu'on le lance avec
31+
32+
```bash
33+
python anagrams.py
34+
```
35+
36+
le programme commence par vous demander d'entrer deux mots
37+
puis il vous indique si oui ou non ce sont des anagrammes, et s'arrête
38+
39+
- v1: cette fois le programme continue cette logique jusqu'à ce qu'on entre le
40+
mot `exit` qui signifie qu'on veut s'arrêter
41+
42+
+++
43+
44+
## solutions
45+
46+
+++
47+
48+
### v0: on traite un seul couple de mots
49+
50+
````{admonition} pour voir la v0
51+
:class: dropdown
52+
53+
```{literalinclude} anagrams_v0.py
54+
```
55+
````
56+
57+
+++
58+
59+
### v1: jusqu'à ce qu'on tape `exit`
60+
61+
````{admonition} la v1
62+
:class: dropdown
63+
64+
```{literalinclude} anagrams_v1.py
65+
```
66+
````
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
---
2+
jupytext:
3+
text_representation:
4+
extension: .md
5+
format_name: myst
6+
format_version: 0.13
7+
jupytext_version: 1.16.4
8+
kernelspec:
9+
display_name: Python 3 (ipykernel)
10+
language: python
11+
name: python3
12+
---
13+
14+
# compte à rebours
15+
16+
+++
17+
18+
## le sujet
19+
20+
+++
21+
22+
on vous demande d'écrire un programme `countdown.py`
23+
lorsqu'on le lance avec
24+
25+
```bash
26+
python countdown.py
27+
```
28+
29+
il commence par vous demander de taper le nombre de secondes que vous voulez
30+
attendre, et les décompte, et s'arrête une fois arrivé à 0
31+
32+
+++
33+
34+
## comment poser une question à l'utilisateur
35+
36+
pour faire ça on utilise la fonction *builtin* `input()`
37+
ça se présente comme ceci
38+
39+
```bash
40+
reponse = input("vous avez quel âge ? ")
41+
### ici dans la variable `reponse` on a **une chaine**
42+
print(f"vous avez répondu {reponse}")
43+
```
44+
45+
```{admonition} ça retourne une chaine
46+
du coup pensez bien à convertir cette réponse en entier !
47+
```
48+
49+
+++
50+
51+
## comment attendre
52+
53+
pour attendre un certain temps, on utilise en Python la fonction `sleep` dans le
54+
module `time`
55+
ça se présente comme ceci
56+
57+
```python
58+
import time
59+
# pour attendre une demie-seconde
60+
time.sleep(0.5)
61+
```
62+
63+
+++
64+
65+
## solutions
66+
67+
+++
68+
69+
70+
### une version v0 un peu naïve
71+
72+
ça fonctionne, mais on ne contrôle pas l'entrée de l'utilisateur:
73+
si on entre autre chose qu'un entier positif ça se passe mal
74+
75+
````{admonition} pour voir la v0
76+
:class: dropdown
77+
78+
```{literalinclude} countdown_v0.py
79+
```
80+
````
81+
82+
+++
83+
84+
### v1: un peu mieux
85+
86+
cette fois on continue de poser la question jusqu'à ce qu'on reçoive un entier
87+
88+
````{admonition} la v1
89+
:class: dropdown
90+
91+
```{literalinclude} countdown_v1.py
92+
```
93+
````
94+
95+
+++
96+
97+
### quelques remarques
98+
99+
* dans un premier temps on avait écrit la fonction `saisie_entier()` et le texte
100+
de la question était *cablé* à l'intérieur;
101+
mais dans un exercice suivant, on a voulu réutiliser cette fonction, d'où le paramètre
102+
* il reste un défaut ici; pouvez-vous voir lequel ?
103+
```{admonition} réponse
104+
:class: dropdown
105+
que se passe-t-il si on entre un entier négatif ?
106+
```
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
---
2+
jupytext:
3+
text_representation:
4+
extension: .md
5+
format_name: myst
6+
format_version: 0.13
7+
jupytext_version: 1.16.4
8+
kernelspec:
9+
display_name: Python 3 (ipykernel)
10+
language: python
11+
name: python3
12+
---
13+
14+
# deviner un nombre
15+
16+
+++
17+
18+
## le sujet
19+
20+
+++
21+
22+
on vous demande d'écrire un programme `guess.py`
23+
24+
- v0: lorsqu'on le lance avec
25+
26+
```bash
27+
python guess.py
28+
```
29+
30+
le programme commence par tirer au sort un nombre entre 0 et 100;
31+
puis il vous propose de deviner ce nombre; pour cela il vous demande quel
32+
nombre vous choississez, et vous indique si vous avez trouvé, ou si vous
33+
choisi trop grand, ou trop petit;
34+
le programme continue jusqu'à ce que vous trouviez le bon nombre
35+
36+
- v1: on veut pouvoir fixer cette borne max sur la ligne de commande, en faisant
37+
38+
```bash
39+
python --max 1000 guess.py
40+
```
41+
42+
bien sûr vous pouvez sophistiquer comme vous le sentez; par exemple ajouter un
43+
compteur pour dire combien d'essais il a fallu pour trouver, etc...
44+
45+
+++
46+
47+
## comment tirer au sort
48+
49+
pour cela on utilise le module `random`
50+
allez sur la page de la documentation officielle et cherchez la bonne fonction
51+
pour faire ça
52+
53+
le plus simple pour trouver cette page est de
54+
- partir de google
55+
- et de chercher `python module random`
56+
- choisissez bien la page de `docs.python.org` (elle existe en français si vous
57+
préferez à l'anglais)
58+
59+
````{admonition} la réponse
60+
:class: dropdown
61+
```python
62+
import random
63+
aleatoire = random.randint(0, 100)
64+
```
65+
````
66+
67+
+++
68+
69+
## comment poser une question à l'utilisateur
70+
71+
plutôt que de récrire le même code que dans `countdown.py` (on a vu que c'était
72+
non trivial si on veut le faire proprement) on va **réutiliser** la fonction
73+
`saisie_entier()` qu'on avait fait à ce moment-là:
74+
75+
```python
76+
# pour pouvoir réutiliser la fonction saisie_entier
77+
# qui se trouve dans le fichier countdown
78+
from countdown import saisie_entier
79+
80+
borne = saisie_entier("borne max: ")
81+
print(f"le nombre à deviner est entre 0 et {borne}")
82+
```
83+
84+
+++
85+
86+
## comment utiliser la ligne de commandes
87+
88+
ça se fait avec un module spécialisé qui s'appelle `argparse`
89+
vous pouvez chercher de votre coté pour trouver des exemples d'utilisation, ou
90+
simplement aller voir la solution ci-dessous
91+
(et oui, c'est un peu du charabia, mais c'est tellement utile qu'on s'habitue
92+
assez vite si on en a besoin 🙂)
93+
94+
+++
95+
96+
## solutions
97+
98+
+++
99+
100+
### une version v0
101+
102+
le nombre est entre 0 et 100, on ne peut pas changer la borne
103+
104+
````{admonition} pour voir la v0
105+
:class: dropdown
106+
107+
```{literalinclude} guess_v0.py
108+
```
109+
````
110+
111+
+++
112+
113+
### v1: on peut changer la borne sur la ligne de commande
114+
115+
````{admonition} la v1
116+
:class: dropdown
117+
118+
```{literalinclude} guess_v1.py
119+
```
120+
````

0 commit comments

Comments
 (0)