You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
================================ 3 passed in 14.19s =================================
71
67
```
72
68
73
-
mais bien sûr d'ici là, n'hésitez pas à lancer votre code interactivement et le debugger, soit dans ce notebook, soit dans ipython, etc..
69
+
```{admonition} il faut débugger avant de tester !
70
+
:class: important
71
+
72
+
MAIS BIEN SÛR avant de lancer les tests, il est ***impératif** d'avoir d'abord lancé votre code interactivement, et de l'avoir débuggé - que soit dans le notebook ou dans ipython
73
+
```
74
74
75
75
+++
76
76
77
+
````{admonition} l'autoreload
78
+
:class: danger
79
+
77
80
il y a toutefois une précaution à prendre si vous travaillez comme ceci
78
-
en effet l'import d'un module est **caché** par Python, ce qui fait que par défaut, les changements que vous faites dans fichier `rooks_and_queens.py` ne sont plus rechargés après le premier import
81
+
en effet l'import d'un module est **caché** par Python, ce qui fait que par défaut, les changements que vous faites dans fichier `rooks_and_queens.py` ne sont **plus rechargés après le premier import**
79
82
80
83
pour vous installer confortablement, voyez ce lien:
on se place sur un échiquier de taille $n \times n$
90
-
93
+
on se place sur un échiquier de taille $n \times n$
91
94
on cherche à écrire un générateur qui énumère **les positions de $n$ tours** qui ne se menacent pas les unes les autres
92
95
93
96
+++
@@ -106,7 +109,7 @@ c'est ainsi qu'on va représenter une position, comme par exemple celle-ci
106
109
:align: center
107
110
```
108
111
109
-
par le tuple `(0, 4, 1, 2, 3)` qui donne les coordonnées en Y dans les colonnes successives (ici le dessin est fait avec matplotlib, du coup les Y sont descendants, l'orientation n'a pas d'importance)
112
+
par le tuple `(0, 4, 1, 2, 3)` qui donne les coordonnées en Y dans les colonnes successives (ici le dessin est fait avec matplotlib, du coup les Y sont descendants, mais l'orientation n'a pas vraiment d'importance)
110
113
111
114
```{code-cell} ipython3
112
115
# prune-cell
@@ -142,16 +145,16 @@ next(r3)
142
145
```
143
146
144
147
```{code-cell} ipython3
145
-
# on a déjà consommé 3 des 6 positions :
146
-
# si on fait une boucle for on ne voit plus que les 3 dernières
148
+
# on a déjà consommé 3 des 6 positions; du coup ...
149
+
# si maintenant on fait une boucle for on ne voit plus que les 3 dernières !
147
150
148
151
for position in r3:
149
152
print(position)
150
153
```
151
154
152
155
### à quoi ça ressemble ?
153
156
154
-
il ne vous aura pas échappé que le problème est équivalent à énumérer les permutations de $n$ (et c'est d'ailleurs pour ça qu'on peut se permettre de retourner une liste d'entiers, et non pas des tuples)
157
+
il ne vous aura pas échappé que le problème est équivalent à énumérer les permutations de $n$ (et c'est d'ailleurs pour ça qu'on choisit de retourner une liste d'entiers, et non pas des tuples)
155
158
156
159
donc du coup on pourrait faire tout simplement
157
160
@@ -202,21 +205,16 @@ for p in queens(6):
202
205
# ...
203
206
```
204
207
205
-
+++ {"tags": ["level_intermediate"]}
206
-
207
-
## pour les rapides
208
-
209
-
cette partie est optionnelle
210
-
211
-
+++
212
-
213
208
### calculer la taille (longueur) d'un générateur
214
209
215
210
on ne peut pas utiliser `len()` sur un générateur (pourquoi ?)
216
211
comment feriez-vous pour calculer le nombre d'éléments dans un générateur ?
217
212
218
213
```{code-cell} ipython3
219
214
# écrivez generator_size
215
+
# ATTENTION quand même à NE PAS créer une liste dans ce code
216
+
# car comme résultat on veut un entier hein
217
+
# pas besoin de consommer toute la mémoire de l'ordi pour ça hein !
220
218
221
219
from rooks_and_queens import generator_size
222
220
generator_size(queens(8))
@@ -226,7 +224,7 @@ generator_size(queens(8))
226
224
227
225
+++
228
226
229
-
si vous avez fini avant tout le monde, dessinez les résultats avec numpy.imshow, ou autre outil de visualisation
227
+
si vous avez fini avant tout le monde, dessinez les résultats avec `numpy.imshow`, (ou autre outil de visualisation de votre choix)
230
228
231
229
```{code-cell} ipython3
232
230
%matplotlib inline
@@ -241,13 +239,32 @@ for p in queens(4):
241
239
```
242
240
243
241
```{code-cell} ipython3
242
+
:scrolled: true
243
+
244
244
for p in queens(6):
245
245
draw_position(p)
246
246
```
247
247
248
+
+++ {"tags": []}
249
+
250
+
## fin de la partie obligatoire
251
+
252
+
jusqu'ici c'est plutôt facile - ou court en tous cas; pour info ma correction tient en
253
+
254
+
- 7 lignes pour `rooks`
255
+
- 7 lignes pour `queens`
256
+
- 2 lignes pour `generator_size`
257
+
-`draw_position` est - de manière contrintuitive - bien plus long
258
+
il faut dire que je suis passé par deux fonctions pour traduire entre les tuples d'entiers et le tableau numpy;
259
+
en fait une seule aurait suffi, mais pour la suite j'ai tiré profit des deux
260
+
261
+
la partie qui suit est intéressante aussi, et pas tellement plus longue en fait (13 lignes pour `uniques` dans mon cas), n'hésitez pas à vous y essayer aussi.
262
+
263
+
+++
264
+
248
265
### éliminez les symétries
249
266
250
-
plus dur, éliminez les symétries et rotations
267
+
(un tout petit peu) plus dur, éliminez les symétries et rotations
251
268
252
269
il y a plein de façons d'envisager la question, idéalement on doit pouvoir écrire un itérateur `uniques` qu'on pourra en quelque sorte chainer avec les deux algorithmes qu'on vient d'écrire
253
270
@@ -257,15 +274,16 @@ from rooks_and_queens import uniques
257
274
```
258
275
259
276
```{code-cell} ipython3
260
-
# comme vous pouvez le voir plus haut, les solutions de queens(6)
261
-
# sont toutes les mêmes mais tournées à chaque fois d'1/4 de tour
277
+
# en fait les 4 solutions de queens(6) sont toutes les mêmes
262
278
# aussi quand on passe par uniques() il n'en reste qu'une
279
+
263
280
for p in uniques(queens(6)):
264
281
draw_position(p)
265
282
```
266
283
267
284
```{code-cell} ipython3
268
285
# en dimension 5 curieusement il y en a plus que pour n=6
286
+
269
287
for p in uniques(queens(5)):
270
288
draw_position(p)
271
289
```
@@ -277,3 +295,11 @@ for p in uniques(queens(5)):
277
295
278
296
generator_size(uniques(rooks(5)))
279
297
```
298
+
299
+
```{code-cell} ipython3
300
+
# et dans le cas de l'échiquier "normal"
301
+
# voici à peu près la performance que vous pouvez obtenir
================================ 3 passed in 14.19s =================================
67
67
```
68
68
69
-
mais bien sûr d'ici là, n'hésitez pas à lancer votre code interactivement et le debugger, soit dans ce notebook, soit dans ipython, etc..
69
+
```{admonition} il faut débugger avant de tester !
70
+
:class: important
71
+
72
+
MAIS BIEN SÛR avant de lancer les tests, il est ***impératif** d'avoir d'abord lancé votre code interactivement, et de l'avoir débuggé - que soit dans le notebook ou dans ipython
73
+
```
70
74
71
75
+++
72
76
77
+
````{admonition} l'autoreload
78
+
:class: danger
79
+
73
80
il y a toutefois une précaution à prendre si vous travaillez comme ceci
74
-
en effet l'import d'un module est **caché** par Python, ce qui fait que par défaut, les changements que vous faites dans fichier `rooks_and_queens.py` ne sont plus rechargés après le premier import
81
+
en effet l'import d'un module est **caché** par Python, ce qui fait que par défaut, les changements que vous faites dans fichier `rooks_and_queens.py` ne sont **plus rechargés après le premier import**
75
82
76
83
pour vous installer confortablement, voyez ce lien:
on se place sur un échiquier de taille $n \times n$
86
-
93
+
on se place sur un échiquier de taille $n \times n$
87
94
on cherche à écrire un générateur qui énumère **les positions de $n$ tours** qui ne se menacent pas les unes les autres
88
95
89
96
+++
@@ -102,7 +109,7 @@ c'est ainsi qu'on va représenter une position, comme par exemple celle-ci
102
109
:align: center
103
110
```
104
111
105
-
par le tuple `(0, 4, 1, 2, 3)` qui donne les coordonnées en Y dans les colonnes successives (ici le dessin est fait avec matplotlib, du coup les Y sont descendants, l'orientation n'a pas d'importance)
112
+
par le tuple `(0, 4, 1, 2, 3)` qui donne les coordonnées en Y dans les colonnes successives (ici le dessin est fait avec matplotlib, du coup les Y sont descendants, mais l'orientation n'a pas vraiment d'importance)
106
113
107
114
+++
108
115
@@ -133,16 +140,16 @@ next(r3)
133
140
```
134
141
135
142
```{code-cell} ipython3
136
-
# on a déjà consommé 3 des 6 positions :
137
-
# si on fait une boucle for on ne voit plus que les 3 dernières
143
+
# on a déjà consommé 3 des 6 positions; du coup ...
144
+
# si maintenant on fait une boucle for on ne voit plus que les 3 dernières !
138
145
139
146
for position in r3:
140
147
print(position)
141
148
```
142
149
143
150
### à quoi ça ressemble ?
144
151
145
-
il ne vous aura pas échappé que le problème est équivalent à énumérer les permutations de $n$ (et c'est d'ailleurs pour ça qu'on peut se permettre de retourner une liste d'entiers, et non pas des tuples)
152
+
il ne vous aura pas échappé que le problème est équivalent à énumérer les permutations de $n$ (et c'est d'ailleurs pour ça qu'on choisit de retourner une liste d'entiers, et non pas des tuples)
146
153
147
154
donc du coup on pourrait faire tout simplement
148
155
@@ -193,21 +200,16 @@ for p in queens(6):
193
200
# ...
194
201
```
195
202
196
-
+++ {"tags": ["level_intermediate"]}
197
-
198
-
## pour les rapides
199
-
200
-
cette partie est optionnelle
201
-
202
-
+++
203
-
204
203
### calculer la taille (longueur) d'un générateur
205
204
206
205
on ne peut pas utiliser `len()` sur un générateur (pourquoi ?)
207
206
comment feriez-vous pour calculer le nombre d'éléments dans un générateur ?
208
207
209
208
```{code-cell} ipython3
210
209
# écrivez generator_size
210
+
# ATTENTION quand même à NE PAS créer une liste dans ce code
211
+
# car comme résultat on veut un entier hein
212
+
# pas besoin de consommer toute la mémoire de l'ordi pour ça hein !
211
213
212
214
from rooks_and_queens import generator_size
213
215
generator_size(queens(8))
@@ -217,7 +219,7 @@ generator_size(queens(8))
217
219
218
220
+++
219
221
220
-
si vous avez fini avant tout le monde, dessinez les résultats avec numpy.imshow, ou autre outil de visualisation
222
+
si vous avez fini avant tout le monde, dessinez les résultats avec `numpy.imshow`, (ou autre outil de visualisation de votre choix)
221
223
222
224
```{code-cell} ipython3
223
225
%matplotlib inline
@@ -232,13 +234,32 @@ for p in queens(4):
232
234
```
233
235
234
236
```{code-cell} ipython3
237
+
:scrolled: true
238
+
235
239
for p in queens(6):
236
240
draw_position(p)
237
241
```
238
242
243
+
+++ {"tags": []}
244
+
245
+
## fin de la partie obligatoire
246
+
247
+
jusqu'ici c'est plutôt facile - ou court en tous cas; pour info ma correction tient en
248
+
249
+
- 7 lignes pour `rooks`
250
+
- 7 lignes pour `queens`
251
+
- 2 lignes pour `generator_size`
252
+
-`draw_position` est - de manière contrintuitive - bien plus long
253
+
il faut dire que je suis passé par deux fonctions pour traduire entre les tuples d'entiers et le tableau numpy;
254
+
en fait une seule aurait suffi, mais pour la suite j'ai tiré profit des deux
255
+
256
+
la partie qui suit est intéressante aussi, et pas tellement plus longue en fait (13 lignes pour `uniques` dans mon cas), n'hésitez pas à vous y essayer aussi.
257
+
258
+
+++
259
+
239
260
### éliminez les symétries
240
261
241
-
plus dur, éliminez les symétries et rotations
262
+
(un tout petit peu) plus dur, éliminez les symétries et rotations
242
263
243
264
il y a plein de façons d'envisager la question, idéalement on doit pouvoir écrire un itérateur `uniques` qu'on pourra en quelque sorte chainer avec les deux algorithmes qu'on vient d'écrire
244
265
@@ -248,15 +269,16 @@ from rooks_and_queens import uniques
248
269
```
249
270
250
271
```{code-cell} ipython3
251
-
# comme vous pouvez le voir plus haut, les solutions de queens(6)
252
-
# sont toutes les mêmes mais tournées à chaque fois d'1/4 de tour
272
+
# en fait les 4 solutions de queens(6) sont toutes les mêmes
253
273
# aussi quand on passe par uniques() il n'en reste qu'une
274
+
254
275
for p in uniques(queens(6)):
255
276
draw_position(p)
256
277
```
257
278
258
279
```{code-cell} ipython3
259
280
# en dimension 5 curieusement il y en a plus que pour n=6
281
+
260
282
for p in uniques(queens(5)):
261
283
draw_position(p)
262
284
```
@@ -268,3 +290,11 @@ for p in uniques(queens(5)):
268
290
269
291
generator_size(uniques(rooks(5)))
270
292
```
293
+
294
+
```{code-cell} ipython3
295
+
# et dans le cas de l'échiquier "normal"
296
+
# voici à peu près la performance que vous pouvez obtenir
0 commit comments