Gestion de l'espace-temps par le Tardis (2/2)

Ah, enfin une mise à jour.

Ce défi est tiré de c0d1ngUP 2023

Le système de repérage des cordonnées spatiotemporelles du Tardis a été mis à jour depuis le vieillissant firmware 1.0.

Le principe reste le même, mais on dispose d'un peu plus d'instructions : PUSH, ADD, MUL, WRITE, NOP, POP, SWAP, CMPSWAP, MOVE qui opèrent sur une structure composée de deux piles ne contenant que des entiers compris entre 0 et 255. Un pointeur indique à chaque instant sur quelle pile on opère (le pointeur peut désigner l'une ou l'autre des deux piles).

  • l'instruction PUSH v, représentée par un carré de couleur rouge (v, 0, 0), permet de placer la valeur v, qui doit être comprise entre 1 et 255, au sommet de la pile.
  • l'instruction ADD, représentée par un carré de couleur bleu (0, 0, 230), permet de retirer les deux éléments en sommet de pile, de les additionner, puis de replacer le résultat en sommet de pile.
  • l'instruction MUL, représentée par un carré de couleur bleu (0, 0, 240), permet de retirer les deux éléments en sommet de pile, de les multiplier, puis de replacer le résultat en sommet de pile.
  • l'instruction WRITE, représentée par un carré de couleur gris clair (200, 200, 200), permet d'afficher la valeur située au sommet de la pile.
  • l'instruction NOP, représentée par un carré noir (0, 0, 0), ne fait rien.
  • l'instruction POP, représentée par un carré bleu (0, 0, 220), retire la valeur en sommet de pile.
  • l'instruction SWAP, représentée par un carré vert (0, 255, 0), bascule le pointeur de pile sur l'autre pile.
  • l'instruction CMPSWAP, représentée par un carré jaune (255, 255, 0), bascule le pointeur de pile sur l'autre pile à condition que le sommet de la pile actuelle soit pair, et ne fait rien dans le cas contraire.
  • l'instruction MOVE, représentée par un carré bleu (0, 0, 210), déplace au sommet de la pile actuelle, la valeur située au sommet de l'autre pile.

Toutes les opérations sont faites modulo 256.

Les carrés se lisent sur une image, de gauche à droite, puis de haut en bas, comme un livre européen.

Voici un exemple :

Les piles (on les appelle ici A et B) sont initialement vides, et le pointeur de pile est initialement sur A. Le programme précédent représente les instructions : PUSH 12, PUSH 134, CMPSWAP, PUSH 7, MOVE, ADD, WRITE, SWAP, MOVE, ADD, WRITE, NOP

  • après les 2 premières instructions, la pile A contient [12, 134] et la pile B est vide, le pointeur de pile est sur A ;
  • après CMPSWAP, puisque 134 est pair, le pointeur de pile passe sur la pile B ;
  • après PUSH 7, la pile B contient maintenant [7], la pile A contient toujours [12, 134], le pointeur est sur B ;
  • après MOVE, le sommet de la pile A passe sur la pile B, la pile A contient maintenant [12], la pile B contient [7, 134] ;
  • après ADD, la pile B contient [141] ;
  • l'instruction WRITE écrit 141 ;
  • avec SWAP, le pointeur de pile repasse sur A ;
  • MOVE déplace le sommet de la pile B sur A, B est maintenant vide, et A contient [12, 141] ;
  • après ADD, la pile A contient 153 ;
  • la valeur 153 est écrite.

Le programme précédent affiche donc 141 153.

Dans la version 2.0 du firmware, le programme ne doit pas simplement donner les instructions de l'année. Précisément, le programme doit écrire :

  • la direction par rapport à l'équateur (1 pour Nord, et 0 pour Sud) ;
  • la latitude, sous forme de 2 entiers positifs (degrés, minutes) ;
  • la direction par rapport au méridien de référence (1 pour Est et 0 pour Ouest) ;
  • puis la longitude, sous forme de 2 entiers positifs (degrés, minutes) ;
  • le jour ;
  • le mois ;
  • et enfin l'année, codée par deux entiers a et b (l'année vaudra (256 x a + b) - 10 000 comme dans la version 1.0 du firmware ;

Il y aura donc 10 entiers entre 0 et 255.

Par exemple, si le programme produit les nombres :

1 46 34 1 0 23 19 3 46 247, alors le Tardis devrait apparaître aux alentours de 46°34' (soit 46.57°) de latitude Nord (car on a un 1 au début), et 0°23' (soit 0.38°) de longitude Est (car le quatrième nombre est un 1), c'est à dire pas loin d'ici, si vous êtes en train de participer à c0d1ngUP. Et le Tardis devrait faire son apparition le 19 mars (19 3) 2023 (46 x 256 + 247 - 10 000). Restez sur le qui-vive...

Pour son prochain voyage, le Docteur a vraiment choisi des valeurs au hasard, et voici le programme qu'il compte fournir au Tardis :

Pour valider le défi, donnez la ville de destination et l'année (en chiffres). Dans l'exemple précédent (1 46 34 1 0 23 19 3 46 247), il aurait fallu indiquer Poitiers 2023. Ne donnez pas les coordonnées géographique ou l'horaire, simplement la ville et l'année.

Type de retour
une chaîne de caractères
Entrées du problème
Pas de données d'entrée
Vous devez être connecté.e pour proposer une réponse au défi
Vous devez être connecté.e pour accéder aux forums.