Un tas de voitures sont alignées à un panneau d'arrêt à 4 voies en attente de continuer. Tout le monde est confus quant à savoir qui va ensuite, qui va dans quel sens, etc. Clairement sous-optimal.
Votre travail consiste à planifier le trafic au stop de manière optimale.
Vous recevez en entrée 4 chaînes de demandes de virage, une pour chacune des quatre directions cardinales. Chaque demande est soit L
pour gauche, S
pour droite ou R
pour droite.
LLSLRLS
SSSRRSRLLR
LLRLSR
RRRLLLL
La première rangée est l'alignement à l'entrée nord de l'intersection. La première voiture en ligne souhaite tourner à gauche (c'est-à-dire, sortie Est). Les lignes suivantes concernent les entrées entrantes Est, Sud et Ouest. La première voiture venant de l'Ouest souhaite donc sortir vers le Sud.
Le trafic se déplace en une série d'étapes. À chaque étape, vous devez choisir un sous-ensemble de voitures en tête de leurs lignes pour continuer. Les voitures choisies ne doivent pas interférer entre elles. Deux voitures interfèrent si elles sortent dans la même direction ou si elles doivent se croiser (compte tenu des règles de conduite à droite standard). Donc, deux voitures opposées qui souhaitent aller tout droit peuvent aller au même pas. Alors que 4 voitures souhaitent toutes tourner à droite. Deux voitures opposées peuvent tourner à gauche simultanément.
Votre travail consiste à planifier l'intersection en une série minimale d'étapes. Pour chaque étape, affichez une ligne avec la ou les directions de la boussole des voitures entrantes répertoriées. Pour l'exemple ci-dessus, la planification minimale est de 14 étapes. Un calendrier minimal est:
N [L from North]
E [S from East]
E [S from East]
E [S from East]
NESW [L from North, R from East, L from South, R from West]
NE [S from North]
EW [R from East]
NESW [L from North, R from East, L from South, R from West]
W [L from West]
EW [L from East, L from West]
NESW [R from North, L from East, R from South, L from West]
NES [L from North, R from East, L from West]
NS [S from North, S from South]
SW [R from South, L from West]
Votre programme devrait être capable de gérer 50 voitures sur chaque ligne en moins d'une minute. L'entrée des 4 chaînes et la sortie de la programmation peuvent être de n'importe quelle manière pratique pour votre langue.
Le programme le plus court gagne.
Un exemple plus large:
RRLLSSRLSLLSSLRSLR
RLSLRLSLSSRLRLRRLLSSRLR
RLSLRLRRLSSLSLLRLSSL
LLLRRRSSRSLRSSSSLLRRRR
qui nécessite un minimum de 38 tours. Une solution possible:
E
EW
E
ESW
S
NS
ES
NESW
NSW
ESW
ES
NSW
NS
NS
NW
EW
NSW
NS
EW
NES
EW
NSW
NE
E
NE
EW
E
E
EW
EW
EW
W
ESW
NSW
NSW
NS
NSW
NEW
Réponses:
Python, 1219 octets
Je n'ai pas passé beaucoup de temps / d'efforts à essayer de jouer au golf, mais je pourrais l'améliorer si d'autres réponses commencent à apparaître. J'utilise la recherche A * avec une heuristique admissible , garantissant l'optimalité. Je suis assez sûr (même si je n'ai pas pris la peine de confirmer) que l'heuristique est également cohérente , ce qui signifie qu'il s'agit de O (programmation dynamique).
Le programme lit en quatre lignes à partir de STDIN dans le format que vous avez spécifié et imprime le résultat sur STDOUT, également dans le format que vous avez spécifié.
Exemple d'utilisation:
la source