TP2 de la vie

Sommaire

L’objectif de ce TP est de réaliser en assembleur RISC-V un automate cellulaire pour le jeu de la vie.

Description

Le TP se déroule sur une grille à deux dimensions de 16x16 cellules.

L’entrée est constituée de deux parties.

La première partie de l’entrée est la saisie de la grille sous la forme de 16 lignes de 16 caractères. Un caractère est soit un dièse (#) pour une cellule occupée, soit un point (.) pour une cellule libre. Chaque ligne est naturellement terminée par un saut de ligne (\n). Enfin, la grille est terminée par une ligne vide (un \n).

Tout autre caractère est une erreur et termine le programme. Toute grille invalide (mauvaise taille, mauvais format, etc) est aussi une erreur et termine le programme. Dans ces situations, le programme se termine avec comme tout message « Grille invalide. ».

La seconde partie de l’entrée est une séquence de nombres indiquant le nombre d’étapes à attendre. Le programme s’arrête quand un nombre strictement négatif est saisi. Tout nombre invalide est une erreur et termine le programme (laisser ReadInt échouer est ici suffisant).

Après la lecture de chaque nombre, le programme doit appliquer les règles d’étapes autant de fois que demandé, puis afficher l’état de la grille.

Les règles du jeu de la vie pour une étape sont les suivantes :

  • une cellule libre possédant exactement trois voisines occupées le devient (elle naît), sinon elle reste libre ;
  • une cellule occupée possédant deux ou trois voisines occupées le reste, sinon elle devient libre (elle meurt) ;
  • les diagonales doivent être prises en compte. Donc la plupart des cellules ont 8 voisines ; les cellules du bord n’ont que 5 voisines et les quatre cellules des coins n’ont que 3 voisines.

L’affichage est analogue à l’entrée, soit 16 lignes de 16 caractères dièse ou point. Toutefois, avant chaque affichage, on inclut une ligne composée du numéro de génération (le nombre total d’étapes depuis le début du jeu) et d’un deux points :.

Exemple

Entrée

..#...........#.
#..#.........#..
#..#.........###
.#..............
................
................
................
................
................
................
................
................
................
##..........#...
##..........#...
............#...

0
1
1
2
5
10
23
32
-1

Sortie

0:
..#...........#.
#..#.........#..
#..#.........###
.#..............
................
................
................
................
................
................
................
................
................
##..........#...
##..........#...
............#...
1:
................
.###.........#.#
###..........##.
..............#.
................
................
................
................
................
................
................
................
................
##..............
##.........###..
................
2:
..#.............
#..#.........#..
#..#.........#.#
.#...........##.
................
................
................
................
................
................
................
................
................
##..........#...
##..........#...
............#...
4:
..#.............
#..#.........#..
#..#........#...
.#..........###.
................
................
................
................
................
................
................
................
................
##..........#...
##..........#...
............#...
9:
................
.###............
###.............
...........#.#..
...........##...
............#...
................
................
................
................
................
................
................
##..............
##.........###..
................
19:
................
.###............
###.............
................
................
..........#.....
........##......
.........##.....
................
................
................
................
................
##..............
##.........###..
................
42:
..#.............
#..#............
#..#............
.#..............
................
................
................
................
................
................
................
..##............
.....#..........
#...#.......#...
#.#.........#...
............#...
74:
..#.............
#..#............
#..#............
.#..............
................
................
................
................
................
................
................
................
................
............#...
............#...
............#...

Ultra : grilles quelconques

Important : Cette partie est avancée et ne vaut que 2 points. Ne la faire que si tout le reste fonctionne et est d’excellente qualité et si vous recherchez un défi supplémentaire.

La grille n’est plus fixée aux dimensions 16x16 mais peut être rectangulaire de taille quelconque. Ses dimensions sont déterminées lors de la lecture initiale en fonction de la longueur de la première ligne et du nombre de lignes (pour rappel, on reconnaît la dernière ligne car est suivi d’une ligne blanche).

Quelques détails supplémentaires:

  • la première ligne détermine la largeur de la grille, les autres lignes doivent donc avoir la même taille.
  • pour simplifier votre gestion de la mémoire, considérez que toute grille contient au plus 4096 cellules en tout (comme par exemple pour une grille 64x64 ou une grille 128x32).

Réalisation

La réalisation de ce programme se fera par groupes d’au plus deux personnes. Chaque membre de l’équipe devra maîtriser tous les aspects du programme.

Contraintes d’implémentation :

  • Votre programme doit fonctionner avec le fork de RARS de Jean Privat en mode 64 bits (voir site du cours).
  • Vous pouvez utiliser les appels systèmes RARS ou les fonctions équivalentes de libs.s pour les entrées-sorties et la terminaison du programme.
  • Vous devez organiser votre programme en utilisant des routines.

Évaluation

Aptitude fonctionnelle

  • 49% : 10 tests publics (4.9 points par test).

  • 49% : plusieurs tests privés évalués par le correcteur après la remise. Il est donc de votre responsabilité de vous assurer que votre programme fonctionne correctement au-delà des tests publics fournis.

  • 2% : partie ultra

Pour vous aider, le script de correction qui sera utilisé est disponible à https://gitlab.info.uqam.ca/inf2171/20241/tp2-corrige. Tous les tests publics sont disponibles à https://gitlab.info.uqam.ca/inf2171/20241/tp2-corrige/-/tree/master/tests?ref_type=heads.

Important : si le programme remis ne s’assemble pas (erreur de syntaxe, fichier corrompu, etc.) ou si aucun test ne passe avec l’outil (échec systématique), la note zéro sera automatiquement attribuée au TP, et ce, indépendamment de la qualité du code, du temps de développement passé ou des affichages de RARS sur l’ordinateur de l’étudiant.

Qualité et lisibilité du code source

Des points bonus et malus seront attribués en fonction de la qualité du code.

  • Indentation et aération.
  • Nommage adéquat des symboles.
  • Présence et pertinence des commentaires.
  • Organisation du code, simplicité, modularité.

Les critères sont plus détaillés dans le guide de style.

Modalités de remise et dates

  • Date de remise : dimanche 17 mars à 23h55.
  • La remise se fait via moodle.
    • Remettez un seul fichier appelé vie.s (pas d’archive, juste ce fichier)
    • Mettez les noms, prénoms et codes permanents des étudiants du groupe en commentaire au début du fichier.
    • Dans un groupe de deux étudiants, un seul étudiant doit remettre.
    • Seule la remise la plus récente est considérée. Vous pouvez remettre autant de fois que vous le voulez avant l’échéance.
  • Si vous ne voulez pas perdre de points, assurez-vous de respecter le guide de style