Outils pour utilisateurs

Outils du site


nsi:tds:robot_rebondissant

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
nsi:tds:robot_rebondissant [2021/12/05 17:13] – créée goupillwikinsi:tds:robot_rebondissant [2024/01/25 13:50] (Version actuelle) goupillwiki
Ligne 41: Ligne 41:
 La fonction ouvre le fichier ''source'', détermine le parcours du robot, déduit la position finale du robot, écrit la réponse dans le fichier ''dest''. La fonction ouvre le fichier ''source'', détermine le parcours du robot, déduit la position finale du robot, écrit la réponse dans le fichier ''dest''.
  
 +===== Aide =====
  
 +=== Ouvrir le fichier ===
  
 +<code python>
 +f = open(filename, 'r', encoding='utf8')
 +content = f.read()
 +f.close()
 +lines = content.split('\n')
 +</code>
  
 +Suite à ce code, ''lines'' contient un tableau où chaque item est une ligne du fichier.
  
 +<code>
 +['...#........', '...........#', 'O...........', '..........#.', '..#.........', '..........#.', '']
 +</code>
  
-For several years now, in elementary schools, we have seen the emergence of a new educational model, playful programmingThe students must program a small robot using assembly blocksThis allows them to get familiar with programming from an early age while exercising their logic and perception of space.+Vous remarquez que la dernière ligne est videCela peut arriver mais n'est pas certainCela dépend de comment à été écrit le fichierOn peut s'assurer que la dernière ligne n'est pas vide en supprimant toute dernière ligne qui serait vide :
  
-You are a student at one such school. The purpose of the exercise is simpleyour teacher has crafted a circuit for your robot, told you how many moves n the robot may make, and you must find out the final position of the robot at end of execution.+<code python> 
 +while lines[-1] == '': 
 +    lines.pop() 
 +</code>
  
-To do this you need to know some principles of robot operation+La fonction `pop`a pour effet d'enlever le dernier élément
-– When the robot encounters an obstacle (represented by #) it turns right (on same operationuntil there's no obstacle ahead anymoreOtherwise on an empty area (represented by .) it moves straight ahead+ 
-– The robot initially moves upwards+=== Accéder à un item === 
-– The robot stops after n moves+ 
-– The top left corner represents the coordinates (0,0+Maintenant que nous disposons de ''lines'', nous pouvons facilement consulter le contenu du fichier. 
-– The robot's environment is represented as followswhere O is the robot's initial position:+ 
 +<code python> 
 +>>> lines[2][0] 
 +'-' 
 +</code> 
 +En effet, ''%%lines[2]%%'' correspond au contenu de la ligne d'indice 2, c'est à dire ''%%'O...........'%%''. Donc ''%%lines[2][1]%%'' est le caractère de rang 0 dans cette ligne : ''%%'O'%%''
 + 
 +=== Direction === 
 + 
 +Il sera plus simple de raisonner en points cardinaux. Le robot peut aller au Nord, au Sud, à l'Est, à l'Ouest. La position du robot est donnée par une paire de coordonnées ''%%(line, col)%%'' qui donne sa ligne et sa colonne. 
 + 
 +Aller vers le Nord, c'est diminuer le numéro de ligne de 1. La colonne ne change pas. On peut raisonner de la même façon pour les autres de sorte que l'on pourra définir : 
 + 
 +<code python> 
 +NORD = (-1,0) 
 +SUD = (1,0) 
 +EST = (...) # je vous laisse deviner 
 +OUEST = (...) # idem 
 +</code> 
 + 
 +Ensuite, on dit que dans certains cas, le robot tourne à droite. Tourner à droite quand on va au Nord, cela fait aller à l'Est. Si on va au Sud, tourner à droite fait aller à l'Ouest
 + 
 +C'est bien de placer tout ça dans une fonction : 
 + 
 +<code python> 
 +def droite(dir_actuelle): 
 +    if dir_actuelle == NORD: 
 +        return EST 
 +    elif dir_actuelle == SUD: 
 +        return ..
 +    ...  # je vous laisse compléter 
 +</code> 
 + 
 +=== est-ce un mur ? === 
 + 
 +Je souhaite savoir si une certaines position ''%%(linecol)%%'' correspond à un mur. Cela arrive si le caractère à cet endroit est ''%%'#'%%'', ou bien si ''%%(line, col)%%'' correspond à une position hors du tableau. 
 + 
 +C'est bien de prévoir une fonction pour cela : 
 + 
 +<code python> 
 +def is_wall(linesline, col): 
 +    """ 
 +    lines: lignes du fichier 
 +    line, col: position demandée 
 +    renvoie True si la position correspond à un mur 
 +    """ 
 +    hauteur = ... # nombre de lignes 
 +    largeur = ... # nombre de colonnes 
 +    if not 0 <= line < hauteur or not 0 <= col < largeur: 
 +        # en dehors du cadre donc 
 +        return ... 
 +    car = lines[line][col] 
 +    # en fonction de la valeur de car, on sait si c'est un mur 
 +    ... 
 +</code> 
 + 
 +=== Fichier de sortie === 
 + 
 +On connaît le contenu du fichier d'origine avec ''lines''. On connait la position initiale du robot. On connait la position finale du robot. 
 + 
 +Il faut remplacer le caractère ''%%'O'%%'' par ''%%'.'%%'' à la position initiale et remplacer ''%%'.'%%'' par ''%%'O'%%'' à la position finale. 
 + 
 +On pourra utiliser la fonction suivante qui remplace le caractère à un certain indice : 
 + 
 +<code python> 
 +def replace_car_at(chaine, new_car, index): 
 +    """ 
 +    chaine: chaine de caractère originale 
 +    new_car: nouveau caractère 
 +    index: position du remplacement 
 +    renvoie une copie de chaine où le caractère à la position 
 +    index est remplacé par new_car. Si index trop grand, aucun changement 
 +    """ 
 +    if index >= len(chaine): 
 +        return chaine 
 +    return chaine[:index] + new_car + chaine[index+1:
 +</code> 
 + 
 +Une fois ''%%lines%%'' modifié, on peut faire l'opération inverse de l'ouverture : 
 + 
 +<code python> 
 +content = '\n'.join(lines) # recolle les lignes 
 +f = open(filename, 'w', encoding='utf8'
 +f.write(content) 
 +f.close() 
 +</code>
  
nsi/tds/robot_rebondissant.1638720813.txt.gz · Dernière modification : de goupillwiki