Un robot livreur, un tracé de figure, un mur à contourner : le programme fait ce qu'on écrit, pas ce qu'on voulait écrire.
-
Exécuter une séquence d'instructions
-
Ordonner les instructions d'un programme
-
Trouver et corriger une erreur dans un programme
-
Remonter un programme et choisir un chemin
Ces problèmes se traitent sans machine. On se repère sur un quadrillage dont les colonnes vont de \(\mathrm{A}\) à \(\mathrm{H}\) et les lignes de \(1\) à \(8\).
Le robot livreur
Un robot part de la case \(\mathrm{B2}\) et doit livrer un colis en \(\mathrm{F5}\).
-
De combien de colonnes doit-il se déplacer ? Et de combien de lignes ?
De \(\mathrm{B}\) à \(\mathrm{F}\), on compte \(\mathrm{C}\), \(\mathrm{D}\), \(\mathrm{E}\), \(\mathrm{F}\), soit \(4\) colonnes. De la ligne \(2\) à la ligne \(5\) :
$$ 5 - 2 = 3 $$$$ 4 \text{ colonnes} \quad \text{et} \quad 3 \text{ lignes} $$ -
Écrire un programme qui l'amène à destination.
Avancer de \(4\) vers la droite ; avancer de \(3\) vers le haut
-
Un camarade propose un autre programme, qui fonctionne aussi. Lequel peut-il avoir écrit ?
Il suffit d'inverser l'ordre des deux déplacements :
Avancer de \(3\) vers le haut ; avancer de \(4\) vers la droite
Le chemin emprunté est différent, mais la case d'arrivée est la même : un chemin n'est jamais unique.
L'ordre des instructions
On compare deux programmes appliqués à un robot posé en \(\mathrm{A1}\), tourné vers la droite.
-
Programme \(1\) : avancer de \(3\) ; tourner d'un quart de tour vers la gauche ; avancer de \(2\).
-
Programme \(2\) : tourner d'un quart de tour vers la gauche ; avancer de \(2\) ; avancer de \(3\).
-
Exécuter le programme \(1\) pas à pas et donner la case d'arrivée.
Le robot regarde vers la droite. Il avance de \(3\) : il atteint \(\mathrm{D1}\). Il pivote vers la gauche, donc regarde vers le haut. Il avance de \(2\) :
$$ \mathrm{D3} $$ -
Faire de même avec le programme \(2\).
Le robot pivote d'abord : il regarde vers le haut. Il avance de \(2\), puis encore de \(3\), toujours vers le haut, soit \(5\) cases en tout :
$$ \mathrm{A6} $$ -
Que faut-il conclure de la comparaison de ces deux programmes ?
Les deux programmes contiennent exactement les mêmes instructions, mais dans un ordre différent, et n'aboutissent pas au même endroit. L'ordre fait partie du programme.
Le tracé de figures
-
Écrire, en utilisant une répétition, le programme qui trace un carré de \(6 \ \text{cm}\) de côté.
Répéter \(4\) fois : \(\Bigl[\) avancer de \(6 \ \text{cm}\) ; tourner d'un quart de tour vers la droite \(\Bigr]\)
-
Combien d'instructions seront réellement exécutées ?
Chaque tour exécute \(2\) instructions, et il y a \(4\) tours :
$$ 4 \times 2 $$$$ 8 \text{ instructions} $$ -
Adapter le programme pour tracer un triangle équilatéral de \(6 \ \text{cm}\) de côté. Combien d'instructions cette fois ?
Le triangle a trois côtés, et l'on tourne d'un tiers de tour à chaque sommet :
Répéter \(3\) fois : \(\Bigl[\) avancer de \(6 \ \text{cm}\) ; tourner d'un tiers de tour vers la droite \(\Bigr]\)
$$ 3 \times 2 = 6 \text{ instructions} $$
Le programme qui bogue
Un élève veut amener son robot de \(\mathrm{A1}\) à \(\mathrm{E4}\). Il écrit : avancer de \(3\) vers la droite ; avancer de \(3\) vers le haut. Le robot n'arrive pas au bon endroit.
-
Exécuter son programme pas à pas et donner la case réellement atteinte.ÉtapeCase atteinteDépart\(\mathrm{A1}\)Avancer de \(3\) à droite\(\mathrm{D1}\)Avancer de \(3\) vers le haut\(\mathrm{D4}\)$$ \text{le robot arrive en } \mathrm{D4} $$
-
À quelle étape le programme dévie-t-il de ce qui était attendu ?
La ligne d'arrivée est correcte : la seconde instruction est bonne. C'est la première qui est fautive, puisque la colonne atteinte est \(\mathrm{D}\) au lieu de \(\mathrm{E}\).
-
Corriger le programme.
De \(\mathrm{A}\) à \(\mathrm{E}\), il faut franchir \(4\) colonnes et non \(3\) :
Avancer de \(4\) vers la droite ; avancer de \(3\) vers le haut
-
Quelle méthode générale permet de trouver l'instruction fautive d'un programme ?
On exécute le programme pas à pas en notant l'état après chaque instruction, puis on compare avec ce qui était attendu. La première différence désigne l'instruction à corriger.
D'où part le robot ?
Un robot a exécuté le programme suivant, et il est arrivé en \(\mathrm{E7}\) :
avancer de \(2\) vers la droite ; avancer de \(3\) vers le haut ; avancer de \(1\) vers la gauche.
-
Retrouver la case de départ du robot, en expliquant la méthode.
On remonte le programme à l'envers : on part de la dernière instruction, et chaque déplacement se fait dans le sens contraire.
ÉtapeCase atteinteArrivée\(\mathrm{E7}\)Défaire « \(1\) vers la gauche » : \(1\) vers la droite\(\mathrm{F7}\)Défaire « \(3\) vers le haut » : \(3\) vers le bas\(\mathrm{F4}\)Défaire « \(2\) vers la droite » : \(2\) vers la gauche\(\mathrm{D4}\)$$ \text{le robot est parti de } \mathrm{D4} $$Vérification : de \(\mathrm{D4}\), \(2\) vers la droite donne \(\mathrm{F4}\), \(3\) vers le haut \(\mathrm{F7}\), \(1\) vers la gauche \(\mathrm{E7}\).
-
Pour ramener le robot de \(\mathrm{E7}\) à son point de départ, Maëlle écrit : avancer de \(1\) vers la gauche ; avancer de \(3\) vers le bas ; avancer de \(2\) vers la droite. Exécuter son programme, puis expliquer son erreur.
De \(\mathrm{E7}\), le robot de Maëlle passe par \(\mathrm{D7}\), puis \(\mathrm{D4}\), et finit en :
$$ \mathrm{F4} \quad \text{et non} \quad \mathrm{D4} $$Maëlle a bien pris les instructions dans l'ordre inverse, mais elle n'a retourné que le déplacement vertical : elle a oublié de changer le sens des deux déplacements horizontaux. Le bon programme est : avancer de \(1\) vers la droite ; avancer de \(3\) vers le bas ; avancer de \(2\) vers la gauche.
-
Écrire un programme de seulement deux instructions qui ramène ce même robot de \(\mathrm{E7}\) à \(\mathrm{D4}\).
De \(\mathrm{E}\) à \(\mathrm{D}\), il y a \(1\) colonne vers la gauche ; de la ligne \(7\) à la ligne \(4\), \(3\) lignes vers le bas :
Avancer de \(1\) vers la gauche ; avancer de \(3\) vers le bas
Le mur à contourner
Le robot, représenté par un disque, est en \(\mathrm{B2}\). Il doit livrer le colis, représenté par un carré, en \(\mathrm{G6}\). Les cases grisées, de \(\mathrm{D1}\) à \(\mathrm{D5}\), forment un mur : le robot ne peut pas y passer.
-
Le programme « avancer de \(5\) vers la droite ; avancer de \(4\) vers le haut » amène-t-il le robot au colis ? Justifier.
Sur le papier, il mène bien en \(\mathrm{G6}\). Mais en avançant vers la droite depuis \(\mathrm{B2}\), le robot passe par \(\mathrm{C2}\) puis \(\mathrm{D2}\), qui fait partie du mur.
$$ \text{Non, le robot est bloqué en } \mathrm{C2} $$ -
Écrire un programme de deux instructions qui amène le robot au colis sans traverser le mur.
Le mur s'arrête à la ligne \(5\) : on monte d'abord jusqu'à la ligne \(6\), où la voie est libre.
Avancer de \(4\) vers le haut ; avancer de \(5\) vers la droite
Le robot passe par \(\mathrm{B6}\), puis \(\mathrm{C6}\), \(\mathrm{D6}\), \(\mathrm{E6}\), \(\mathrm{F6}\) et arrive en \(\mathrm{G6}\).
-
Combien de cases le robot doit-il franchir, au minimum, pour aller de \(\mathrm{B2}\) au colis ? Justifier.
Quel que soit le chemin, il faut changer de colonne \(5\) fois, de \(\mathrm{B}\) à \(\mathrm{G}\), et de ligne \(4\) fois, de \(2\) à \(6\) :
$$ 5 + 4 $$$$ 9 \text{ cases au minimum} $$Le programme de la question précédente en franchit exactement \(9\) : il est donc le plus court possible.
-
La batterie du robot lui permet de franchir \(15\) cases au plus. Peut-il livrer le colis, puis revenir en \(\mathrm{B2}\) sans recharger ? Justifier.
Le retour demande lui aussi au moins \(9\) cases :
$$ 9 + 9 = 18 $$Or \(18 > 15\) : il peut livrer le colis, mais il lui manquerait au moins \(3\) cases pour revenir.
$$ \text{Non, il doit recharger} $$
La chasse au trésor
Le robot, représenté par un disque, est en \(\mathrm{A1}\) ; le trésor, représenté par une étoile, est en \(\mathrm{G7}\). Les cases grisées \(\mathrm{C1}\), \(\mathrm{D4}\) et \(\mathrm{A5}\) sont des rochers : le robot ne peut pas y entrer. On cherche un programme de la forme :
Répéter \(\ldots\) fois : \(\Bigl[\) avancer de \(\ldots\) vers la droite ; avancer de \(\ldots\) vers le haut \(\Bigr]\)
On peut aussi échanger les deux instructions du bloc.
-
Exécuter le programme : Répéter \(2\) fois : \(\Bigl[\) avancer de \(3\) vers le haut ; avancer de \(3\) vers la droite \(\Bigr]\). Où le robot est-il arrêté ?
Le robot monte de \(\mathrm{A1}\) à \(\mathrm{A4}\), puis part vers la droite : \(\mathrm{B4}\), \(\mathrm{C4}\). La case suivante, \(\mathrm{D4}\), est un rocher.
$$ \text{le robot est bloqué en } \mathrm{C4} $$ -
Sans tenir compte des rochers, pour quels nombres de répétitions un programme de cette forme peut-il mener le robot en \(\mathrm{G7}\) ? Justifier.
De \(\mathrm{A}\) à \(\mathrm{G}\), le robot doit avancer de \(6\) colonnes en tout, et il avance du même nombre de cases vers la droite à chaque répétition. Le nombre de répétitions, multiplié par ce nombre de cases, doit donc donner \(6\) :
$$ 1 \times 6 = 6 \hspace{2em} 2 \times 3 = 6 \hspace{2em} 3 \times 2 = 6 \hspace{2em} 6 \times 1 = 6 $$Avec \(4\) ou \(5\) répétitions, c'est impossible : \(6\) n'est ni dans la table de \(4\), ni dans celle de \(5\). Au-delà de \(6\) répétitions, il faudrait avancer de moins d'une case à chaque fois.
$$ 1 \ ; \ 2 \ ; \ 3 \quad \text{ou} \quad 6 \text{ répétitions} $$De la ligne \(1\) à la ligne \(7\), il y a aussi \(6\) lignes : dans chaque bloc, le robot avance d'autant de cases vers le haut que vers la droite.
-
Trouver tous les programmes de cette forme qui mènent le robot au trésor sans heurter de rocher, et montrer qu'il n'y en a pas d'autre.
D'après la question précédente, il n'y a que \(4\) nombres de répétitions possibles, et deux ordres pour chacun : \(8\) programmes à suivre sur le quadrillage.
RépétitionsBloc répétéCe qui arrive\(1\)\(6\) vers la droite ; \(6\) vers le hautbloqué en \(\mathrm{B1}\) par \(\mathrm{C1}\)\(1\)\(6\) vers le haut ; \(6\) vers la droitebloqué en \(\mathrm{A4}\) par \(\mathrm{A5}\)\(2\)\(3\) vers la droite ; \(3\) vers le hautbloqué en \(\mathrm{B1}\) par \(\mathrm{C1}\)\(2\)\(3\) vers le haut ; \(3\) vers la droitebloqué en \(\mathrm{C4}\) par \(\mathrm{D4}\)\(3\)\(2\) vers la droite ; \(2\) vers le hautbloqué en \(\mathrm{B1}\) par \(\mathrm{C1}\)\(3\)\(2\) vers le haut ; \(2\) vers la droitearrive en \(\mathrm{G7}\)\(6\)\(1\) vers la droite ; \(1\) vers le hautbloqué en \(\mathrm{D3}\) par \(\mathrm{D4}\)\(6\)\(1\) vers le haut ; \(1\) vers la droitebloqué en \(\mathrm{C4}\) par \(\mathrm{D4}\)Un seul programme convient :
Répéter \(3\) fois : \(\Bigl[\) avancer de \(2\) vers le haut ; avancer de \(2\) vers la droite \(\Bigr]\)
Vérification : le robot passe par \(\mathrm{A3}\), \(\mathrm{C3}\), \(\mathrm{C5}\), \(\mathrm{E5}\), \(\mathrm{E7}\), et arrive en \(\mathrm{G7}\) sans toucher de rocher.
Trente répétitions
Le robot, représenté par un triangle qui pointe dans la direction où il regarde, est en \(\mathrm{D4}\), tourné vers la droite. Voici un bloc d'instructions :
avancer de \(2\) ; tourner d'un quart de tour vers la gauche ; avancer de \(1\).
-
Le robot exécute ce bloc une fois. Sur quelle case arrive-t-il, et vers où regarde-t-il ?
Le robot regarde vers la droite. Il avance de \(2\) : il atteint \(\mathrm{F4}\). Il pivote vers la gauche, donc regarde vers le haut. Il avance de \(1\) :
$$ \mathrm{F5} \quad \text{tourné vers le haut} $$ -
Le robot repart de \(\mathrm{D4}\), tourné vers la droite, et exécute : Répéter \(4\) fois : \(\Bigl[\) avancer de \(2\) ; tourner d'un quart de tour vers la gauche ; avancer de \(1\) \(\Bigr]\). Tracer son chemin sur le quadrillage et donner sa position finale. Que remarque-t-on ?RépétitionCase atteinteLe robot regarde vers\(1\)\(\mathrm{F5}\)le haut\(2\)\(\mathrm{E7}\)la gauche\(3\)\(\mathrm{C6}\)le bas\(4\)\(\mathrm{D4}\)la droite$$ \mathrm{D4} \quad \text{tourné vers la droite} $$
Le robot est revenu à son point de départ, dans la même direction, après avoir suivi le contour d'un carré de \(3\) cases de côté : chaque « avancer de \(1\) » se prolonge par l'« avancer de \(2\) » de la répétition suivante, dans la même direction.
-
Le robot repart de \(\mathrm{D4}\), tourné vers la droite, et répète ce même bloc \(30\) fois. Sur quelle case finit-il, et vers où regarde-t-il ? Justifier sans tout tracer.
Toutes les \(4\) répétitions, le robot se retrouve en \(\mathrm{D4}\), tourné vers la droite. On effectue la division euclidienne de \(30\) par \(4\) :
$$ 30 = 4 \times 7 + 2 $$Après \(28\) répétitions, le robot est en \(\mathrm{D4}\), tourné vers la droite. Les \(2\) répétitions qui restent le mènent, comme dans le tableau de la question précédente :
$$ \mathrm{E7} \quad \text{tourné vers la gauche} $$ -
Parti de \(\mathrm{D4}\), tourné vers la droite, ce même robot a répété le bloc un certain nombre de fois, entre \(1\) et \(20\), et il s'est arrêté en \(\mathrm{C6}\). Combien de répétitions a-t-il pu faire ? Donner toutes les possibilités.
À la fin d'une répétition, le robot ne peut être qu'en \(\mathrm{F5}\), \(\mathrm{E7}\), \(\mathrm{C6}\) ou \(\mathrm{D4}\), selon le reste de la division du nombre de répétitions par \(4\) :
Reste\(1\)\(2\)\(3\)\(0\)Case\(\mathrm{F5}\)\(\mathrm{E7}\)\(\mathrm{C6}\)\(\mathrm{D4}\)Le robot est en \(\mathrm{C6}\) après \(3\) répétitions, puis de nouveau à chaque fois qu'on en ajoute \(4\) :
$$ 3 + 4 = 7 \hspace{2em} 7 + 4 = 11 \hspace{2em} 11 + 4 = 15 \hspace{2em} 15 + 4 = 19 $$La suivante, \(23\), dépasse \(20\).
$$ 3 \ ; \ 7 \ ; \ 11 \ ; \ 15 \quad \text{ou} \quad 19 \text{ répétitions} $$