Challenge 3 : chaîne de montage

Un robot est placé devant une chaîne de montage. Devant lui défilent un par un des objets (au plus 40).

Sur chaque objet, il doit effectuer une action, en utilisant un outil bien précis parmi 4 outils possibles, numérotés de 0 à 3 :

0 : marteau 1 : tourne-vis 2 : pince 3 : scie

Le robot n'a cependant que deux bras et ne peut donc tenir que deux outils à la fois. Changer l'outil attaché à un bras prend du temps.

Écrivez un programme qui fait effectuer les actions successives au robot, en minimisant le nombre de fois où il doit changer l'outil d'un bras. Au départ, aucun des deux bras n'a d'outil.

Vous disposez des fonctions suivantes :

  • nbActionsRestantes() : retourne le nombre d'actions que doit encore effectuer le robot.
  • outilPourAction(numAction) : retourne le numéro de l'outil à utiliser pour l'action à effectuer dans numAction étapes. Ainsi, outilPourAction(0) retourne l'outil à utiliser à la prochaine action, quelque soit le nombre d'actions déjà effectuées.
  • changeOutil(numBras, numOutil) : remplace l'outil du bras numBras (0 ou 1) du robot, par l'outil numOutil.
  • actionneBras(numBras) : effectue une action avec le bras numBras (0 ou 1).

Dans l'exemple ci-dessous, il reste 10 actions à effectuer, la prochaine utilise la scie. Chaque action est représentée par le dessin de l'outil à utiliser.

Vous pouvez visualiser ci-dessus l'exécution du programme suivant, qui vous montre comment vous pouvez utiliser ces commandes :

   changeOutil(0, outilPourAction(0));
   actionneBras(0);
   changeOutil(1, outilPourAction(0));
   actionneBras(1);
   changeOutil(0, 0);
   actionneBras(0);
   changeOutil(1, 2);
   actionneBras(1);
   actionneBras(1);
   nbRestants = nbActionsRestantes();

Score

Votre programme sera exécuté sur plusieurs tests. Le premier sera l'exemple donné ci-dessus.

Pour chaque test :

  • Si votre programme n'effectue pas toutes les actions, vous aurez 0 point.
  • Si le robot fait le nombre minimum possible de changements d'outil, vous aurez 100 points.
  • Sinon, en partant de 100 points et sans passer en dessous de 40, vous perdrez 5 points pour chaque changement d'outil en trop par rapport à la meilleure solution.

Programmes d'exemple

Voici pour chaque langage le programme complet effectuant les commandes listées ci-dessus, et dont vous pouvez partir. Notez que votre programme peut afficher du texte.

#include "robot.h"

int main()
{
   changeOutil(0, outilPourAction(0));
   actionneBras(0);
   changeOutil(1, outilPourAction(0));
   actionneBras(1);
   changeOutil(0, 0);
   actionneBras(0);
   changeOutil(1, 2);
   actionneBras(1);
   actionneBras(1);
   int nbRestants = nbActionsRestantes();
   
   return 0;
}


#include "robot.h"

int main()
{
   changeOutil(0, outilPourAction(0));
   actionneBras(0);
   changeOutil(1, outilPourAction(0));
   actionneBras(1);
   changeOutil(0, 0);
   actionneBras(0);
   changeOutil(1, 2);
   actionneBras(1);
   actionneBras(1);
   int nbRestants = nbActionsRestantes();
   
   return 0;
}

open Robot;;

let _ =
   changeOutil 0 (outilPourAction 0);
   actionneBras 0;
   changeOutil 1 (outilPourAction 0);
   actionneBras 1;
   changeOutil 0 0;
   actionneBras 0;
   changeOutil 1 2;
   actionneBras 1;
   actionneBras 1;
   let _nbRestants = nbActionsRestantes() in
   ()

import static algorea.Robot.*;

class Main
{
   static public void main(String args[])
   {
      changeOutil(0, outilPourAction(0));
      actionneBras(0);
      changeOutil(1, outilPourAction(0));
      actionneBras(1);
      changeOutil(0, 0);
      actionneBras(0);
      changeOutil(1, 2);
      actionneBras(1);
      actionneBras(1);
      int nbRestants = nbActionsRestantes();
   }
}

void main()
{
   changeOutil(0, outilPourAction(0));
   actionneBras(0);
   changeOutil(1, outilPourAction(0));
   actionneBras(1);
   changeOutil(0, 0);
   actionneBras(0);
   changeOutil(1, 2);
   actionneBras(1);
   actionneBras(1);
   int nbRestants = nbActionsRestantes();
}

from robot import *

changeOutil(0, outilPourAction(0))
actionneBras(0)
changeOutil(1, outilPourAction(0))
actionneBras(1)
changeOutil(0, 0)
actionneBras(0)
changeOutil(1, 2)
actionneBras(1)
actionneBras(1)
nbRestants = nbActionsRestantes()



Source : http://www.france-ioi.org/