Avis aux lecteurs...
Cette page ne vit plus beaucoup (mais je vais remettre de nouveaux jouets dans le bac à sable). Du contenu plus «finalisé» est disponible sur la page dédiée aux cours et TP de PCSI

Stage Python
Contributions au stage Python de l'ÉNS Lyon, les 28 et 29 juin 2013 :



Voici le début d'une série de TP pour apprendre Python (et quelques points d'informatique «générale») :


Pour information, voici les programmes (à ce jour) pour les taupins et les agros

Ces séances seront proposées aux collègues du lycée du parc et de la martinière. Si des collègues de la région sont intéressés mais n'ont pas la masse critique suffisante pour organiser quelque chose en interne, il peuvent me contacter : stephane.gonnord at mp933.fr

On me glisse dans l'oreillette qu'un collègue de Kléber a tendu un piège grossier pour ruiner la productivié de tous les pythoneux pour plusieurs mois !



BAC À SABLE
Voici quelques sujets très variés sur lesquels on peut jouer avec python. Certains peuvent constituer de gros exercices, d'autres des bases pour des TP plus ou moins difficiles. D'autres seront tout à fait inutilisables pour des élèves, mais peuvent constituer de bons projets d'entrainement pour s'aguerrir.

Ces sujets vont apparaître et disparaître au cours du temps (pour éventuellement basculer dans les feuilles de TP). Je suis VRAIMENT preneur de toute critique et retour d'expérience...

  • (15 janvier 2014) Vous connaissez le problème du cube-serpent ? En voici une résolution par backtracking (50 lignes de code, écrites en une demi-heure... et ça a miraculeusement marché du premier coup !). Pour passer au 4*4*4, le principe est le même, mais le résultat était incertain : la où 41 backtracks ont été suffisants en 3*3*3 (pour un minimum de 27 et un majorant de 4^16), je n'avais qu'un majorant déraisonnable de 4^45... et finalement, 16 millions de backtracks ont plié le problème \o/. Voici le code non optimisé/nettoyé.
  • (10 novembre 2013; retour aux affaires !) Le problème des tours de Hanoï se résout facilement... mais c'est plus joli après un petit coup de pdfgen.
  • (12 mai 2011) Avec une expérience de presque 48H sur les bases de données... voici un premier essai. L'archive contient un TD «élèves» travaillant sur une base sqlite fournie. Il y a aussi le howto (TD «prof») pour construire soi-même ce genre de base-jouet.
  • (24 mars 2013) Vous avez certainement toujours rêvé d'avoir un critère simple de divisibilité par 7. Les automates finis fournissent une solution simple, et donnent une expression rationnelle décrivant ces nombres. Par exemple, on peut décrire les multiples de 2 par l'expression (0+1+2+...+9)*(0+2+4+6+8). Mon programme python (que je cache pour le moment...) fournit une expression de longueur 18003 pour les multiples de 7. Un peu moins bien, donc, que David Madore sur son blog. Bonus : qu'en est-il si on lit le nombre à l'envers ? Accessoirement, ça fait un bien joli truc à parser. Encore un exercice python : quelle est la hauteur d'étoile de cette expression rationnelle ?
  • (12 mars 2013) Wow, le module odeint de scipy est très efficace, et produit de belles choses, avec matplotlib. En trois dimensions, c'est encore plus spectaculaire tout en restant simple. L'équation différentielle y'=1/(y^2-x) est très bien pour tester odeint, mais aussi une éventuelle résolution «maison» via la méthode d'Euler. Je conseille les conditions initiales y(-1)\in{-3,-2,-1,0,1}; représenter les solutions sur [-1,4] par exemple
  • (9 mars 2013) Un exercice très simple qu'on retrouvera dans quelques feuilles de TP : ici. Le résultat est amusant. Cette extension a l'air sympa; au boulot ! Vous pouvez aussi aller voir le problème de Joseph (mieux expliqué sur le version en; ce n'est pas du snobisme !)
  • (3 mars 2013) Une grand-mère méchante ? Demandez-lui de vous tricoter un petit napperon. Si elle connaît ça, elle ira vite, mais elle n'est alors probablement pas si méchante que ça. Dans les Canvas de reportlab.pdfgen, il y a bien une méthode rectangle... qui ne fait que des rectangles «horizontaux». Faire des tas de droites était assez gore et laid. Mais heureusement, les Canvas ont une méthode setLineWidth qui fait ce qu'on imagine. Pour les couleurs, j'ai utilisé la méthode setStrokeGray. J'ai ramé un peu avec une erreur de débutant : l=l+... n'était pas une bonne idée dans mes appels récursifs. Un bel exemple pour de futurs TPs sur les listes ! (le 14 mars 2013) On peut aussi jouer avec Sierpinski ou bien.
  • (18 février 2013) Un peu de simulation sur un exercice de proba ? Cent personnes entrent successivement dans un train, chacune avec un numéro (distribution bijective !). Le premier, un peu gâteux/sans-gêne se place au hasard. Ensuite, chacune des 99 autres personnes prend sa place si elle est libre, et une place au hasard parmi les restantes sinon. Quelle est la probabilité pour que le dernier soit à sa place ? Ce code confirme le résultat... que j'avais trouvé moi-même, ce qui est encore assez rare sur ce type d'exo ! Un petit graphique, histoire de visualiser cela...
  • (17 février 2013) Ma fille a des tonnes de pyramides d'additions à faire. Ce code doit vaguement faire l'affaire
  • (12 février 2013) Inspiré du TD d'info d'aujourd'hui : quelques calculs des nombres de catalan : en récursion brutale (il s'agissait de changer de l'exemple fibonaccien usuel); via la formule close à l'aide de factorielle; en tabulant, et enfin (je suis très content de cette dernière version) en calculant le coefficient binomial à l'aide de somme. Comme prévu, c'est plus rapide qu'en tabulant \o/ Voici mon code
  • (5 février 2013) Un correspondant anonyme me signale qu'une matrice aléatoire l'est nettement moins après inversion. Bonne occasion pour utiliser numpy, qui a l'air assez efficace pour inverser une matrice (500,500). (Et au moment où j'écris ceci, je n'ai pas encore compris le pourquoi du comment de la chose, pour l'inverse !)
  • (29 janvier 2013) Un collègue m'a demandé récemment comment récupérer la loi de répartition des gris d'une image. C'est vraiment écoeurant de facilité ! Voici un code élémentaire, qui répond au problème en une ligne d'import plus sept lignes de codes. Il y a en bonus la récupération d'un fichier sur le web (2 lignes), la conversion d'un fichier image (d'un jpg couleur en un bitmap noir et blanc; une ligne !), la sauvegarde des résultats dans un fichiers .csv (quatre lignes), et même la création d'une jolie figure avec matplotlib (10 lignes, plus une dernière pour sauver le résultat en pdf). Je ne sais pas si je deviens pythoneux, mais tout cela me semble extrèmement lisible. Python est vraiment un langage diabolique.
  • (29 janvier 2013) Petite amélioration du fichier précédent : il s'agissait de vérifier qu'en échangeant des pixels, la loi de répartition est inchangée. Voici le code. Bon, j'ai fait un GUI, mais qui est pour le moment très laid et assez gore... Petite farce : la loi de répartition changeait violemment alors que je ne faisais qu'échanger quelques pixels. Il m'a fallu un temps infini pour réaliser que je travaillais sur des jpg (c'est tellement transparent : on lit les pixels comme si c'était un bmp). Et bien entendu pour un jpg, changer un pixel a quelques effets de bord :-)
  • (22 janvier 2013) Un très beau résultat de Szegö et Bollobas nous dit que dans un graphe à N sommets, si on place N/2(C+ln(N)) arêtes aléatoires, la probabilité d'être connexe tend vers exp(-exp(-C)) lorsque N tend vers l'infini. J'en ai fait un TP Caml autour de l'union-find et des tas de Tarjan... mais c'est encore mieux en python puisqu'on peut avoir le dessin pour le même prix ! Voici le code
  • (25 décembre 2012) Un jeu extrèmement élaboré écrit pour une petite fille qui harcelait son père pour qu'il lui «apprenne le python»... Et la dichotomie par la même occasion !
  • (17 décembre 2012) Pour le TIPE d'un élève, j'ai évalué le temps de multiplication entre gros entiers (quelques (centaines de) milliers de bits). Le résultat est celui attendu :-)
  • (4 décembre 2012) Allez voir les jolis textes d'Étienne Ghys sur les échangeurs et arbres généalogiques ici et . J'ai codé (en moins de 50 lignes) un programme calculant (lorsqu'on est en présence d'un échangeur) l'arbre généalogique associé à une permutation (mais avec mon algorithme à moi : je ne comprenais rien à celui présenté dans le papier !). Sans optimisation, il me faut 120 secondes pour détecter/arboriser les 206098 échangeurs parmi les 10! permutations. J'ai utilisé itertools pour engendrer les permutations, et une classe «Arbre» tout à fait élémentaire : un champ étiquette, un champ fils constitué d'une liste d'Arbres, et une méthode d'affichage en pretty printing.
  • Créez un objet Matrice (muni des bonnes méthodes) indépendant de numpy. Écrivez ensuite tout ce qui tourne autour du pivot de Gauss : déterminant, rang, PJrQ, décompositions LU et de Bruhat... Mettez en avant d'éventuels problèmes liés aux manipulations de float.
  • Même chose dans le monde euclidien, avec Gram-Schmidt, son amie la décomposition QR; reprenez cette décomposition via les matrices de Householder.
  • Il y a bien sur l'incontournable solveur de sudoku... Vous trouverez ici une base de grilles. Les importer est le début de l'exercice !
  • Beaucoup (considérablement !) plus compliqué : un solveur de Rubiks cube !
  • Écrivez un programme résolvant le problème du «compte est bon»... Je suis certain que ça va vous donner ensuite d'attaquer le problème des interfaces graphiques...
  • Le projet Euler sera une source dramatique de perte de temps inépuisable de bonheur. Quand vous aurez accroché, c'en sera fini de vos corrections de DM pour plusieurs années vous découvrirez une communauté très intéressante, et en particulier, constaterez que les anglo-saxons peuvent avoir des points de vue très déroutants au départ (assez orthogonaux à notre culture et nos réflexes)... et finalement très intéressants. C'est particulièrement le cas en probabilités.
  • Une intégrale à calculer ? def integ(f,t0,t1,n): return sum(f(t0+k*(t1-t0)/n) for k in range(0,n))*(t1-t0)/n. Il s'agit de complexes ? pas de problème... import cmath fera l'affaire. Contexte : je voulais calculer l'indice d'une courbe par rapport à un point, et maple ne s'en sortait ni en formel ni en numérique (mais je n'ai pas trop insisté...)


«I wrote 20 short programs un Python yesterday. It was wonderful. Perl, I'm leaving you» - xkcd 353