Pendant les vacances, avec mon fils, on s’est amusé à faire les premières activités proposés dans le manuel Informatique Sans Ordinateur, disponible sur http://csunplugged.org/ (où plusieurs activités complémentaires peuvent être téléchargées, mais en anglais seulement). Pour des raisons personnelles, mon fils est de plus en plus amené à utiliser l’ordinateur à l’école. Et je dois avouer que ça me gêne de la voir manipuler un outils qu’il ne maîtrise pas vraiment (je renvoie d’ailleurs à un billet de Dr Goulu qui disait la même chose au début de l’année). Que les choses soient claires : je ne prétend pas non plus maîtriser l’informatique ! Mais comme je l’ai déjà raconté sur ce blog, à son âge, je codais mes premiers jeux (souvent en recopiant des codes en BASIC), et j’ai l’impression que manipulant les ordinateurs depuis presque 30 ans m’a permis d’avoir un peu de recul, en tous les cas plus que lui. Et je dois avouer que le manque de culture en informatique de la génération entre la mienne et celle de mon fils me surprend. Bref, comme je l’avais dit dans un précédant billet, ça me dérange qu’une génération autant amenée à utiliser l’outil informatique en sache aussi peu à ce sujet. Aussi, quand j’ai découvert ce petit programme d’activités le mois dernier, j’ai eu envie de tenter l’expérience.
Au départ, je pensais proposer les activités à mon fils et à ma fille (qui a 8 ans) mais cette dernière était plongée dans des dessins quand on a débuté, et je n’ai pas réussi à la faire décrocher. Pour ceux qui veulent tenter l’expérience, il y a une logique dans les activités, et je pense qu’il serait dommage se rater les premières. Bref, je n’ai pas re-proposé à ma fille de se joindre à nous. Mais on verra aux prochaines vacances….
Le document propose une douzaine d’activités (davantage si on traîne sur http://csunplugged.org/activities). La première partie (que je vais évoquer ici) porte sur la représentation de l’information.
- section 1 : le système binaire
La première activité est vraiment bien faite. On apprend la base 2, l’écriture en 0 et en 1, les codes ASCII, et les notions de 32 et 64 bits. Histoire d’illustrer, je vais coder un peu (sur ordinateur cette fois) pour expliquer comment ça fonctionne.
> base2=function(x,n=8){ + Base.b=rep(0,n) + ndigits=(floor(logb(x,base=2))+1) + for(i in 1:ndigits){ + Base.b[n-i+1]=(x%%2) + x=(x %/% 2)} + plot(0:1,0:1,xlab="",ylab="", + axes=FALSE, xlim=c(0,n),ylim=c(0,1),col="white") + for(i in 1:n){ + polygon(i-1+c(.1,.1,.9,.9),c(.1,.9,.9,.1),lwd=2, + col=c("white","red")[1+(Base.b[i]==1)])} + return(Base.b)}
On découpe des bouts de cartons, et on les juxtapose, de manière à écrire des nombres.
Regardons par exemple le nombre 17. Rouge pour un 1, et blanc pour un 0.
> base2(17) [1] 0 0 0 1 0 0 0 1
Le premier jeu est d’écrire quelques nombres, pour se familiariser. Ensuite, on voit que c’est même facile de faire des opérations de base. Par exemple, si on multiplie par 2, c’est facile : on décale vers la gauche, et on rajoute un carré blanc, tout à droite
> base2(17*2) [1] 0 0 1 0 0 0 1 0
Amusant, non ? On peut aussi faire des additions, par exemple, 12 s’écrit
> base2(12) [1] 0 0 0 0 1 1 0 0
et si on somme 12 et 17, on obtient
> base2(12+17) [1] 0 0 0 1 1 1 0 1
où on raisonne comme en base 10. En fait, dans cet exemple, on retrouve que 0+1=1+0=1 et que 0+0=0 (oui, il n’y a pas de retenue dans cet exemple). Ensuite, on utilise une décomposition en nombre de l’alphabet pour coder des lettres (A-1, B-2, C-3, etc), puis rapidement, on passe aux codes ASCII, C’est très ludique ! Je dois avouer qu’on en a profité pour faire une digression par les codes secrets, mais j’en reparlerais une autre fois. Bref, cette première activité nous a emballé !
- section 2 : pixeliser et dessiner.
Suite logique de l’étape précédente, on a ensuite évoqué la pixellisation. Cette activité me parlait beaucoup, car c’est précisément ce que je faisais quand j”avais l’âge de mon fils (ou presque). Sur le MO5 de la maison, il y a avait essentiellement deux jeux, sur cassettes: un jeu de voitures, et super tennis. Au tennis, les personnages étaient assez simples avec 4 positions possibles: l’attente, le service, le coup droit, et le revers. Ensuite, la figure était juste translatée (on avait déjà évoqué ce point il y a quelques mois).
Mais autant ça me parle énormément, autant je me suis demandé ce que ça pouvait dire aujourd’hui, car les images sont incroyablement lissées… On a pris une image sur mon ordinateur, et on a zoomé, zoomé…
… en vain. On ne voit plus vraiment les pixels sur les dessins. C’est dommage ! Heureusement, j’ai fini par trouver quelques exemple pour illustrer ce concept (finalement assez théorique) de la pixellisation. Je ne me sentais pas très à l’aise pour parler de lissage avec mon fils. Ce sont des choses que j’explique à l’occasion à mes étudiants, et ça me gêne que mon fils de 11 ans sache plus de choses que mes étudiants. En fait, ce dilemme m’a tiraillé tout au long de nos activités, pour être honnête… D’un côté, ce sont des exercices pour enfants de primaire, et de l’autre, ce sont des choses que certains étudiants en formation universitaire de mathématique se devraient de maîtriser.
Pour revenir un peu à l’activité, c’était amusant, et ça annonçait un peu le principe de la compression (qui viendrait avec la prochaine activité). Mais trouver une tasse, et une image de Saturne en coloriant des cases, ça a vite lassé mon fils. On a fini par abandonner sans vraiment finir l’activité. Cela dit, j’ai découvert par la suite qu’il y avait des activités amusantes en ligne, sur http://csunplugged.org/activities, avec en particulier une discussion sur les traits et les cercles (en anglais seulement)
- section 3 : compresser et zipper
Cette activité était…. surprenante. On a joué avec des algorithmes de compression, type LZ77 utilisé pour zipper des fichiers. Le principe est assez amusant…. Par exemple. dans la phrase
on retrouve des blocs de lettres. Alors l’idée (difficile à suivre si on se limite aux indications données) est que si on a plus de 2 lettres qui se répètent, on peut faire un pointage.
On va alors remplacer le second bloc par de l’information expliquant où aller chercher l’information,
Aussi, la phrase devient
Autrement dit, on lui dit de reculer d’un certain nombre de caractères, et d’utiliser un bloc de caractères, d’une certaine longueur. Amusant non ? En plus, on peut utiliser une écriture récursive, et remplacer par des lettres non encore définies. Comme le joli exemple suivant
On recule de 2 lettres, et on prend un bloc de 3 lettres. Amusant non ? C’est facile à faire, et on peut facilement lire un fichier compressé. Par contre, compresser soit même un texte est plus compliqué ! On s’est longtemps interrogé sur la marche à suivre, car l’aogorithme est mal expliqué. Manifestement, on part de la gauche, et si on retrouve un bloc de 2 caractères déjà lu (ou plus), on pointe dessus. Manifestement, selon ce qu’on y lit, on peut passer de 2500 caractères à 500. C’est dommage que la compression en question ne soit pas mentionnée. Par contre, on imagine bien que plus le texte est long, plus on va retrouver des blocs déjà vus. Et l’idée d’illustrer par un poème est brillante !
On s’est bien amusé pendant cette activité, on a fait des essais, mais on ne sait pas si ce qu’on fait est “optimal“. Cela dit, m’a donné envie de lire davantage, d’autant que plusieurs articles évoquent ce point (et que la notion d’information et d’entropie se cachent derrière, mais on va la voir dans quelques sections).
- section 4 : gérer les erreurs et l’exemple des codes barres
On a ensuite une activité réellement amusante, sur la gestion des erreurs. Ça commence par un petit tour de magie et l’écriture binaire…. On considère la grille suivante (avec les cartes utilisées dans la première activité: une face rouge, une face blanche)
Les couleurs ont étés mises au hasard… on a constitué une grille 5×5 en posant les cartes au hasard (ce sont les cartes sur le tapis bleu). Pour ceux qui sont autour… c’est le truc du tour de magie. Maintenant, je lasse mon fils retourner une carte au hasard, sur le tapis bleu (en fait, je pense qu’il peut retourner celle qu’il veut)
Pendant qu’il la retournait, je n’ai pas regardé, et il va falloir maintenant retrouver quelle carte a été retournée… En fait, le truc pour la retrouver, c’est que les cartes à droite, et en bas, ont été mises de telle sorte que le nombre de cartes rouges par ligne, et par colonne soit pair !
En plus, si deux cartes avaient été retournées, j’aurais aussi pu les retrouver. Amusant non ? L’idée est vraiment géniale…. Ensuite, on apprend à vérifier les codes d’identité bancaire ou de code ISBN, pour les livres. Oui, le code qui figure sur les livres, au dos.
Bon, le soucis est que sur ce code barre, il y a manifestement un problème, car le code généré n’est pas le bon. En fait, le code ISBN qu’on va utiliser est le suivant
> isbn=1466592591 > checkcode=function(n){ + l=as.character(n) + while(nchar(l)<10) l=paste("0",l,sep="") + a=substr(l,1,9) + y=as.numeric(substr(l,10,10)) + x=as.numeric(unlist(strsplit(a,""))) + s=sum(x*(10:2)) + z=11-(s%%11) + return(z==y) + }
Sur notre code à 10 chiffres, le dernier chiffre va servir à vérifier si les premiers sont bons, ou pas. Tout est expliqué dans la définition du International Standard Book Number sur Wikipedia. C’est presque simple, à condition de maîtriser le reste de la division par 11 (comme le montre le code précédant)
> checkcode(isbn) [1] TRUE
On a pris quelques livres dans la bibliothèque, et je lui demandais de me dicter le code…. C’était assez amusant comme exemple… Mais mon fils a voulu essayer un nombre au hasard… et il a trouvé un code ISBN du premier coup…. Bon, il avait une chance sur 12.
> mean(Vectorize(checkcode)(trunc(1e10*runif(1000000)))) [1] 0.08327
- section 5 : jeu du “devine le chiffre auquel je pense” et système binaire
La dernière section a été de loin la plus intéressante ! On effleure l’information (au sens de Shannon) et le logarithme (en base 2)… J’avais évoqué des idées similaires dans un vieux billet, justement, suite à un jeu avec les enfants. On voit en particulier la construction par arbre de la méthode dichotomique… Par exemple, si je pense à un nombre (entier) entre 0 et 7, la méthode pour trouver le nombre, la plus efficace, est la suivante :
Ce qui est amusant, c’est qu’on retrouve la décomposition en base binaire des nombres,
avec d’abord 2² puis 2¹ et enfin 2⁰. Amusant, non ? On a ensuite fait un test (et ma fille est venu se joindre à nous). On a commencé par “choisir un nombre entre 1 et 100” puis “choisir un nombre entre 1 et 1000“, à tour de rôle. On a vu qu’il fallait environ 7 coups pour réussir avec 100 chiffres possibles, et une dizaine avec 1000. Sans parler de logarithme, on a vu qu’il fallait chercher les exposants de 2 pour attendre 100, ou 1000.
Mais le plus intéressant, c’est que j’ai commencé, pour montrer qu’on divise en deux, à chaque fois. Je commençais avec “plus grand que 50 ?” puis “plus grand que 25 ?” puis “plus grand que 12 ?” etc. Mon fils a opté pour une stratégie plus étrange, en commençant par couper au milieu “plus grand que 50 ?” puis (directement) “plus grand que 5 ?“. En fait, en jouant plusieurs fois, je me suis rendu compte que sa stratégie pouvait être (en quelque sorte) optimale, car sa sœur ne prend visiblement pas des nombres de manière uniforme entre les deux bornes: elle a tendance à prendre des petits ou des très grands nombres. Sur une partie, il a ainsi être plus rapide que ma stratégie soit-disant optimale, en gagnant en 5 coups. On a ensuite eu une longue discussion sur ce que pouvait être la stratégie optimale. C’était vraiment une discussion intéressante… qui s’est poursuivie avec l’activité suivante, de classement et de tri. Mais on en reparlera bientôt !
Quand on voit les ressources qui traînent en ligne, je ne comprends pas que l’enseignement de l’informatique en primaire ne soit pas obligatoire : c’est incroyablement ludique ! Bref, on s’est vraiment bien amusé avec ces activités, et on a appris plein de choses. Bon, peut être que le fait d’être resté autour de -30°C ces derniers jours n’a pas vraiment permis de proposer d’alternatives…