# source_cell

id: f453061585d748fcb5aa682238d7f478
name: cell-9e0e2abf36b0f46b
cell_type: markdown
checksum: 82f1ae41d755b48ba72dcf96869c87b9
notebook_id: a14df18c4429485ead0215371215e9f2
source:
  # Laby, niveau 1a: à vous de jouer!
  Exécutez la cellule suivante pour faire apparaître le premier défi. On commence doucement, sans obstacles. À vous de compléter le programme dans la cellule du dessous pour diriger la fourmi vers la sortie. Revenez au niveau précédent pour avoir un exemple, et consultez la [documentation](0b.md#Documentation).

  [Niveau précédent](0b.md), <!--[Liste des niveaux](index.md#ListeDesNiveaux), !-->[Niveau suivant](1b.md)


id: d99e8d4c964949eb882b224c803dc3a9
name: cell-85120bbff0b4e671
cell_type: code
checksum: ed0c59afcfa1e471626f4875bd0023db
notebook_id: a14df18c4429485ead0215371215e9f2
source:
  debut();
  avance();
  droite();
  // REMPLACER CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
  throw std::runtime_error("À faire");


id: a314f630fda64c06834adad36e10e8b0
name: cell-edc418d15f68f486
cell_type: markdown
checksum: e9469f9f8a2419558d91a27c225b9ae2
notebook_id: 70eaf7a160fd422f9dac11a2cce3d982
source:
  # Laby, niveau 1b: Oh le caillou !

  Exécutez la cellule suivante pour faire apparaître le second défi. Cette fois il y a un obstacle: un caillou te barre la route. Il faut utiliser les instructions qui permettent de prendre et de poser les cailloux. Revenez au niveau 0 pour avoir un exemple, et consultez la [documentation](0b.md#Documentation).

  [Niveau précédent](1a.md), <!--[Liste des niveaux](index.md#ListeDesNiveaux), !--> [Niveau suivant](1c.md)


id: d7a7276640ba476584ef412daf1194e4
name: cell-e4edec00b45b5607
cell_type: code
checksum: e32a0d28d6530d98d365657f106c83a4
notebook_id: 70eaf7a160fd422f9dac11a2cce3d982
source:
  debut();
  // REMPLACER CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
  throw std::runtime_error("À faire");


id: 4e67aff02edb4cd38c87c7daa1578ac1
name: cell-d2e889c43a21a3bf
cell_type: markdown
checksum: 5904a9e117bd6c9cec7f861a97a69f48
notebook_id: d8ddd45f9cb74d13ab0bece0f7adc3f9
source:
  # Laby, niveau 1c: Encore un !

  Exécutez la cellule suivante pour faire apparaître le troisième défi.
  Un caillou au milieu d'un couloir. Comment passer ?

  [Niveau précédent](1b.md), <!--[Liste des niveaux](index.md#ListeDesNiveaux), !-->[Niveau suivant](2a.md), [Documentation](0b.md#Documentation)


id: c7d6029f4fdd4923a29ca9a15d3088a8
name: cell-fc82dd31f240c228
cell_type: markdown
checksum: b3c7b6b3dbbfe091d64d11f2af7d0074
notebook_id: cb1c67b8605e4a198f4e7035c4c5036d
source:
  # Laby, niveau 2a: Que c'est loin ...

  Simple pas vrai ? Mais bien répétitif, non? Le but du jeu ici est d'écrire un programme court en utilisant une boucle “while” qui dit à la fourmi d'avancer tant que la case devant lui est vide.

  [Niveau précédent](1c.md), <!--[Liste des niveaux](index.md#ListeDesNiveaux), !-->[Niveau suivant](2b.md), [Documentation](0b.md#Documentation)


id: 0e283420d7cb4f2a93b81009f5527cac
name: cell-bbdbb680e7dea70c
cell_type: code
checksum: 542df403e0a6c814b3efdaeb6e952889
notebook_id: cb1c67b8605e4a198f4e7035c4c5036d
source:
  debut();
  while ( regarde() == Vide ) {
      // REMPLACER CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
      throw std::runtime_error("À faire");
  }
  // REMPLACER CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
  throw std::runtime_error("À faire");


id: ff8845cacec84bb6a10fdf483cb80dc2
name: cell-8e9afc8537e9a183
cell_type: markdown
checksum: 40b0d6d00218eec1ffbe437b10a85339
notebook_id: 02b1036b0a974a5e9c109c63e2b68e52
source:
  # Laby, niveau 2b: Le couloir des cailloux

  Il va falloir voir comment passer le premier caillou. Puis recommencer! Une fois de plus la boucle “while” va être utile !

  [Niveau précédent](2a.md), <!--[Liste des niveaux](index.md#ListeDesNiveaux), !-->[Niveau suivant](2c.md), [Documentation](0b.md#Documentation)


id: 3d6dbf5561cd4fcabaeeae80b2644664
name: cell-b8c416c088e04329
cell_type: markdown
checksum: 447a0c4e2a87c3c7e5e7ac2176414a88
notebook_id: c3a1480aa4f84c3cb099857cebf85dfe
source:
  # Laby, niveau 2c: Zig-Zag

  Cinq longues distances à parcourir! On ne va tout de même pas recopier
  cinq fois la même boucle?

  [Niveau précédent](2b.md), <!--[Liste des niveaux](index.md#ListeDesNiveaux), !-->[Niveau suivant](2d.md), [Documentation](0b.md#Documentation)


id: 8dbf0b953dad4f32be092453475aed2f
name: cell-13c1041ad288bbb1
cell_type: markdown
checksum: f98428dc58661943a1eb4a46461bcf00
notebook_id: c3a1480aa4f84c3cb099857cebf85dfe
source:
  Complétez la ***fonction*** suivante (une nouvelle commande) pour
  qu'elle fasse avancer la fourmi le plus loin possible en ligne
  droite :


id: 4601e3339c084b4cbc6f77611a611ce0
name: cell-b73f084d78a8d520
cell_type: code
checksum: 422b2c87c326e6f9dcce05869be42578
notebook_id: c3a1480aa4f84c3cb099857cebf85dfe
source:
  void avance_tant_que_tu_peux() {
      // REMPLACER CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
      throw std::runtime_error("À faire");
  }


id: 004de38164574935a5189887d072f034
name: cell-5eb33a572123ee68
cell_type: code
checksum: f81bf922999f23d2656f9d5a521aae92
notebook_id: c3a1480aa4f84c3cb099857cebf85dfe
source:
  debut();
  avance_tant_que_tu_peux();
  gauche();
  // REMPLACER CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
  throw std::runtime_error("À faire");
  ouvre();


id: d5f18b02e54d4572b1eedc722f1ba4b5
name: cell-b8c416c088e04329
cell_type: markdown
checksum: 1ae98047ab0c0fa3c5fb84ea1cec6196
notebook_id: 720b682ac3e942f4b30fb0a1268a245a
source:
  # Laby, niveau 2d: Le Zig-Zag des cailloux

  <!-- Objectifs pédagogiques
  - renforcer les fonctions
  - écrire ses propres fonctions
  - indiquer que l'on peut ajouter de nouvelles cellules
  !-->

  Un nouveau zig-zag, mais cette fois avec des cailloux, et c'est à vous
  de rédiger l'intégralité du programme. Inspirez-vous bien sûr des deux
  niveaux précédents!

  **Indications :**
  - Définissez deux fonctions.
  - Chaque fonction doit être définie dans une cellule dédiée. Pour
    insérer une nouvelle cellule, vous pouvez par exemple utiliser
    l'icône <kbd>+</kbd> de la barre d'outils.

  [Niveau précédent](2c.md), <!--[Liste des niveaux](index.md#ListeDesNiveaux), !-->[Niveau suivant](3a.md), [Documentation](0b.md#Documentation)


id: 52d26e9262994eeaa170697a162650b9
name: cell-5eb33a572123ee68
cell_type: code
checksum: 805baee5569996edb1554c01c5ab1dc1
notebook_id: 720b682ac3e942f4b30fb0a1268a245a
source:
  debut();
  // REMPLACER CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE
  throw std::runtime_error("À faire");
  ouvre();


id: 7e1f1e122faf413397046d407ad0b1ce
name: cell-04cf005bf031f785
cell_type: markdown
checksum: 0e90c38f694a5e9df3f6385f7acaac92
notebook_id: 91e180bdd8d24b98a43213d04f111d20
source:
  # Laby, niveau 3a: Ahhh des toiles!

  Des toiles d'araignées! La petite n'empêchera pas la fourmi de passer, mais la grande la retiendra prisonnière! Attention la grande toile n'est pas toujours du même côté ! Comment être sûr que la fourmi arrive toujours à la sortie ? On va utiliser une conditionnelle “if”.

  [Niveau précédent](2d.md), <!--[Liste des niveaux](index.md#ListeDesNiveaux), !-->[Niveau suivant](3b.md), [Documentation](0b.md#Documentation)


id: 03090f1fb3a0492090bb03d1ec04e847
name: cell-f4014db5cad66a1e
cell_type: markdown
checksum: 0a56bc3204de8463bded398a6aa12247
notebook_id: bd92cf4940db4c8895a92efdfd7fc903
source:
  # Laby, niveau 3b: Toiles et cailloux
  Oula cela devient de plus en plus compliqué ! Trouverez-vous un code qui ne l'est pas trop ?

  [Niveau précédent](3a.md), <!--[Liste des niveaux](index.md#ListeDesNiveaux), !-->[Niveau suivant](4a.md), [Documentation](0b.md#Documentation)


id: bc62e0608e0a431da8db1371ef1cd1e9
name: cell-cbd2ffa7dba495fb
cell_type: markdown
checksum: ce4908bff720a4ec95994e7d6839e38f
notebook_id: 9a24cccc6dae4119bab07685e676bd76
source:
  # Laby, niveau 4a: La spirale infernale

  [Niveau précédent](3b.md), <!--[Liste des niveaux](index.md#ListeDesNiveaux), !-->[Niveau suivant](4b.md), [Documentation](0b.md#Documentation)


id: 33c3765e44a24600a6045cf087470b66
name: cell-2677e377ce3e39dd
cell_type: markdown
checksum: e2f736696060d208f6ffe333d9cb6fd4
notebook_id: 3963e0af24fc489f9e9c3f3bc170b4d8
source:
  # Laby, niveau 4b: Par où passer ?

  [Niveau précédent](4a.md), <!--[Liste des niveaux](index.md#ListeDesNiveaux), !-->[Niveau suivant](counting-the-rocks.md), [Documentation](0b.md#Documentation)


id: 83f4814277fd4324bb8081d2ed99e09c
name: cell-b5e341b0d197b93b
cell_type: markdown
checksum: 33eb995cea5b47c3e2f11187c2f245cc
notebook_id: f797537d7e804db083625b83a4c68257
source:
  # Chou chèvre loup
  Faites traverser la rivière au chou, loup et chèvre,
  sans laisser le loup seul avec la chèvre, ou la chèvre
  seule avec le chou!


id: 89178520ca6d44a89468eb7065e0a0e1
name: cell-1011ecb37be8a8c9
cell_type: code
checksum: 7dab1af341eb1d1980e963b4395d57e8
notebook_id: f797537d7e804db083625b83a4c68257
source:
  from ipywidgets_game_wolf_goat_cabbage.__global__.fr import *
  charge = monter; traverse = traverser; décharge = descendre
  JEUX()


id: ae13b4b3d80a4ce7a39674191477bba3
name: cell-f0dcd60af1b24691
cell_type: code
checksum: ca3acc7a1dedc14f26078faedb0fad41
notebook_id: f797537d7e804db083625b83a4c68257
source:
  reset()
  charge("Chèvre")
  traverse()
  décharge("Chèvre")
  # REMPLACER CETTE LIGNE ET LA SUIVANTE PAR VOTRE RÉPONSE


id: e05c068bc1b94e5c832cb037b8ea3df0
name: cell-64acacb345e940e0
cell_type: markdown
checksum: 0a15ddb6db175b9077cc40cc1329f7dd
notebook_id: b4f169049344441da53075a0054447ad
source:
  # Laby: Compter les cailloux
  Ce niveau se résout facilement quand on peut compter… La boucle «for» est là pour vous !

  [Niveau précédent](4b.md), <!--[Liste des niveaux](index.md#ListeDesNiveaux), !-->[Niveau suivant](this-is-crazy.md), [Documentation](0b.md#Documentation)


id: 5aab89fad65a498c963597d43536de68
name: cell-531faa6d137cc87a
cell_type: markdown
checksum: 30edab3c3b48b688a1fe7deb30ec6d2f
notebook_id: 3ed5ba31ce6e485cbd3419fad2eedd1b
source:
  # Les cruches

  Soient deux cruches de capacités respectives 5 et 7 litres. Ces
  cruches ne sont pas graduées.  Vous avez accès à un robinet qui
  vous permet de remplir à tout moment l'une ou l'autre des cruches:

      remplir(0)
      remplir(1)

  De même, vous disposez d'une évacuation d'eau permettant de vider
  l'une ou l'autre des cruches:

      vider(0)
      vider(1)
      
  Enfin, vous pouvez transvaser le contenu de la première cruche
  dans la seconde, et réciproquement:

      verser(0)
      verser(1)

  Et c'est tout.


id: a988962fc1d447babd61250d2d75c97b
name: cell-498cce0f0d44af99
cell_type: markdown
checksum: 0bf332bdfc40a34fc025eb7b8c87d5b9
notebook_id: 3ed5ba31ce6e485cbd3419fad2eedd1b
source:
  Écrire un programme de sorte que l'une ou l'autre des cruches contienne 4 litres
  à la fin. Noter que, dans cette feuille, le programme doit être écrit en Python, mais
  ici cela ne change pas grand chose.


id: 017680c7b0574a2eb77b5b6e683162ac
name: cell-05ad37a017d55ccc
cell_type: markdown
checksum: b8e47555c1b29fa07ad21227d819a7c1
notebook_id: 3ed5ba31ce6e485cbd3419fad2eedd1b
source:
  ## Pour aller plus loin:

  Dans une nouvelle feuille de travail:
  - essayez avec des cruches de tailles différentes
  - est-il toujours possible d'obtenir n'importe quel
    volume?
  - écrire un algorithme qui, étant donné deux
    cruches de capacités quelconques, détermine
    et obtienne tous les volumes possibles.


id: e42d0b44d0474b7fac1825cf2b398786
name: 1
cell_type: markdown
checksum: 8ad448955b1ba80fb9a1ef1e85ca2fa2
notebook_id: 69f4ca1ae8364f9b9c56ddac2d73c777
source:
  :::{admonition} Exercice : Modélisation d'un problème et notion d'algorithme

  Un passeur doit faire passer de l'autre côté d'une rivière un loup, une
  chèvre et un chou. Pour cela, il ne peut transporter qu'un seul d'entre
  eux à la fois dans sa barque. On ne sait pas trop ce qui arriverait si
  le loup venait à rester seul en présence de la chèvre, ou si la chèvre
  se retrouvait seule en présence du chou.

  1.  Décrivez une suite d'instructions simples (un premier algorithme!)
      à effectuer scrupuleusement par le passeur garantissant que tout
      le monde traverse la rivière sain et sauf. Les instructions
      disponibles sont :

      -   `charge(objet)` (exemple: `charge(chèvre)`)
      -   `décharge(objet)`
      -   `traverse()`

  	**Indication :** Ne cherchez pas à résoudre le problème de tête;
  	au contraire, l'objectif est d'apprendre à raisonner sur papier
  	pour aborder ensuite des problèmes plus complexes et pouvoir
  	transmettre ce raisonnement. Cherchez une manière de représenter
  	l'état du système, et décrivez sur votre feuille comment celui-ci
  	évolue au fur et à mesure des instructions.

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  2.  Identifiez une séquence d'instructions qui se répète et proposer une
      nouvelle instruction les combinant -- d'un niveau d'abstraction plus
      élevé -- permettant de simplifier l'écriture de l'algorithme
      précédent.

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  :::


id: 37dba621132c47f683aa089fc7976d6d
name: 2
cell_type: markdown
checksum: 9d1d93a1ea55a97a541a509d31763bf9
notebook_id: 69f4ca1ae8364f9b9c56ddac2d73c777
source:
  ::::{admonition} Exercice : Modélisation d'un problème et notion d'algorithme

  Soient deux cruches de capacités respectives 5 et 7 litres. Ces
  cruches ne sont pas graduées. Le but de ce problème est que l'une des
  deux cruches contienne 4 litres. Vous avez accès à un robinet et à une
  évacuation d'eau, mais vous ne disposez de rien d'autre que les deux
  cruches.

  1.  Formalisez le problème en termes d'état du système et
      d'instructions, puis donnez une suite d'instructions permettant
      d'atteindre une solution.

  	**Indication :** Comme dans l'exercice précédent, ne cherchez pas
      à résoudre le problème de tête.

  	% REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  2.  Peut-on trouver une suite d'instructions de façon que l'une des
      deux cruches contienne 1 litre? 2 litres? 3 litres? 4 litres? 5
      litres?  6 litres? 7 litres?

  	% REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  ::::


id: f852fa6c46ed4ea9994c514979aa4604
name: 3
cell_type: markdown
checksum: 336f3e7d3d8dbac15b474014285f9cab
notebook_id: 69f4ca1ae8364f9b9c56ddac2d73c777
source:
  :::{admonition} Exercice

  Écrivez un algorithme qui, étant donné un nombre entier $N$, décide si
  $N$ est ou non le carré d'un autre entier.

  Par exemple, si l'entrée est $16$, la réponse est oui. Si l'entrée est
  $42$, la réponse est non.

  Votre algorithme doit être assez simple pour que vous puissiez
  l'appliquer vous-même uniquement à l'aide d'un papier et d'un crayon
  pour poser les opérations (pas de calculatrice).

  % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE


  :::


id: 02c4f1c14e80462f976db2a4767e3ec9
name: 4
cell_type: markdown
checksum: 9486416dcdc7b441f9f31d1461cd1d0c
notebook_id: 69f4ca1ae8364f9b9c56ddac2d73c777
source:
  <s></s>

  :::{admonition} Exercice : Nombre mystère

  On a fabriqué un robot «intelligent» capable de

  -   poser des questions dont la réponse est oui ou non;

  -   effectuer des opérations de base sur les nombres (addition,
      soustraction, multiplication, division).

  Voici un exemple d'algorithme pour le robot :

      Reponse = Demande("Êtes-vous né avant le 1er janvier 2000 ?")
      Si Réponse = Oui alors
          Dire("Vous avez plus de 22 ans")
      Sinon
          Dire("Vous avez 22 ans ou moins")

  1.  Décrivez un algorithme qui permet au robot de deviner un nombre
      choisi entre 0 et 100 par l'utilisateur.

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  2.  Décrivez un algorithme qui permet au robot de donner l'âge exact
      de l'utilisateur.

  	% REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  3.  Quelles difficultés avez-vous rencontrées pour écrire les
      algorithmes?

      % REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  :::


id: 8bd08fbfef9643c4a76e6a5eea3b9b1f
name: 5
cell_type: markdown
checksum: 05c0255d5284a46ad7d60ba1604593f4
notebook_id: 69f4ca1ae8364f9b9c56ddac2d73c777
source:
  :::{admonition} Exercice : $\clubsuit$ Un peu de logique et de booléens

  1.  Construisez les tables de vérité correspondant aux opérations
      booléennes suivantes :

      -   `op1(a, b): (a ET (NON b)) OU ((NON a) ET b)`
      -   `op2(a, b): (a OU b) ET ((NON a) OU (NON b))`.

  	% REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  2.  Que constatez-vous?

  	% REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  3.  `op1(a, b)` est en fait une opération très courante en informatique;
      elle a même un nom. Savez-vous comment on l'appelle?

  	% REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  4.  Écrivez une opération `op3(a, b)` dont le résultat est vrai si et
      seulement si le résultat de `op1(a, b)` est faux. Utiliser au plus
      5 mots `OU`, `NON` et `ET` dans l'écriture de `op3(a, b)`.

  	% REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  5.  Expliquez pourquoi cette opération permet de déterminer si deux mots
      booléens sont identiques.

  :::


id: 898820f17b1c435c81180c1798616262
name: 6
cell_type: markdown
checksum: 9c87fcfc225cd97c8857be3473d92d8b
notebook_id: 69f4ca1ae8364f9b9c56ddac2d73c777
source:
  :::{admonition} Exercice : $\clubsuit$ Notion de test de programme

  Une collègue s'est occupée de coder un programme `pointDeChute` qui
  calcule l'abscisse à laquelle retombe un projectile lancé en $x = 0$
  avec une vitesse $v$ suivant un angle $\alpha$ (en degrés). Vous
  voulez tester si les résultats de ce programme sont cohérents.

  1.  Spécifiez le programme sans écrire l'algorithme : que va-t-il
      prendre en entrée? renvoyer en sortie?

  	% REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  2.  Donnez une série de tests dont vous connaissez le résultat sans
      calculs: situations extrêmes (par ex : tirer verticalement),
      symétries, ...

  	% REMPLACER CETTE LIGNE PAR VOTRE RÉPONSE

  :::


id: 7b6b892f7bee44e3b2a41fd0bbb1c645
name: cell-05f3f0bf76964094
cell_type: markdown
checksum: 1412fa8dba22a59e78085d1ef371cf70
notebook_id: c79cf63da3cd4dc1a75413232c836a26
source:
  # Laby: C'est fou!

  Les obstacles se multiplient pour un défi de plus.

  [Niveau précédent](counting-the-rocks.md), <!--[Liste des niveaux](index.md#ListeDesNiveaux), !-->[Documentation](0b.md#Documentation)


