La tâche
Écrivez un programme ou une fonction qui prend une structure d'intersection de trafic et génère la séquence dans laquelle les véhicules passeront.
La sortie doit contenir au maximum quatre lignes au format suivant #. x->y\n
, où #
est un numéro de numéro de séquence, suivi du point .
, x
et y
sont des personnages ["N", "E", "S", "W"]
. Ils doivent être séparés par des caractères ->
. Si vous ne renvoyez pas un tableau de chaînes, chaque ligne doit se terminer par un \n
(nouveau caractère de ligne) ou équivalent à votre système.
L'entrée doit prendre la forme suivante:
- Partie 1: quatre caractères, chacun ayant la route de destination pour les routes sources dans l'ordre N, E, S, W (dans le sens des aiguilles d'une montre). Les caractères autorisés sont
N
,S
,W
,E
ou. L'espace signifie qu'il n'y a pas de véhicule sur une route particulière. Par exemple, une chaîne
S WE
signifie que N véhicule souhaite aller vers le Sud, l'espace signifie qu'il n'y a pas de véhicule E,W
signifie que S souhaite aller vers l'Ouest,E
signifie que l'Ouest souhaite aller vers l'Est. - Partie 2 - un espace ou une seule lettre signifiant lequel est du véhicule d'urgence.
- Partie 3 - deux caractères déterminant quelles routes sont prioritaires (p. Ex.
NE
Signifie que le nord et l'est ont tous deux des priorités plus élevées que le sud et l'ouest). Si c'est plus facile pour vous, vous pouvez emprunter des routes moins prioritaires (dans ce casSW
).
Dans une situation sans solution , vous êtes autorisé à retourner une chaîne d' une ligne qui est clair pour l'utilisateur, comme unsolvable
, no solution
et similaire. Les utilisateurs de JavaScript peuvent prendre une undefined
constante intégrée .
Il s'agit d'un code-golf, donc la réponse la plus courte en octets l'emporte.
Les règles de circulation
Veuillez noter que certaines règles peuvent ne pas suivre les règles de circulation de votre pays. Certains d'entre eux ont été simplifiés pour faciliter le défi. N'utilisez pas cette question comme guide pour un système de circulation réel.
- Pour le défi, vous êtes autorisé à utiliser uniquement le trafic à droite.
- L'intersection de la circulation se compose exactement de quatre routes qui se rejoignent en un point. Ils sont marqués
N
(comme pour « Nord »),S
,W
,E
. Ces lettres doivent être utilisées à la place dex
ety
dans l'exemple de sortie ci-dessus.
- Sur chaque route, il y a au plus un véhicule. Il n'est pas garanti qu'il y ait un véhicule sur chaque route. Chaque véhicule peut conduire dans n'importe laquelle des quatre directions, c.-à-d. tourner à gauche, tourner à droite, aller tout droit ou faire demi-tour .
- Si les trajectoires de deux véhicules ne se croisent pas (elles n'entrent pas en collision), elles peuvent aller au même moment. Les chemins ne se heurtent pas, si deux véhicules (la liste n'est peut-être pas complète, mais c'est intentionnel, juste pour vous donner un indice):
- viennent de directions opposées et les deux vont tout droit, ou au moins l'un d'eux tourne à droite,
- viennent de directions opposées et les deux tournent à gauche,
- viennent de directions opposées et l'un d'eux tourne dans n'importe quelle direction ou fait demi-tour, tandis que l'autre fait demi-tour,
- proviennent de directions orthogonales, celle de gauche tourne à droite et l'autre ne fait pas demi-tour
Quelques exemples de chemins non en collision ci-dessous. Veuillez noter que sur le troisième dessin, tout chemin de N entrerait en collision avec le chemin de E, même si N fait demi-tour.
- Si deux chemins entrent en collision, il est nécessaire d'utiliser d'autres règles. Si deux véhicules sont sur la même route prioritaire (voir ci - dessous), le droit de passage est donnée au véhicule:
- vient de la route du côté droit, si elles viennent de directions orthogonales
- tourne à droite si l'autre tourne à gauche
- va tout droit ou tourne à droite si l'autre fait demi-tour.
Dans les deux exemples ci-dessous, le véhicule E a priorité sur le véhicule S.
Dans l'exemple ci-dessous va d'abord W, puis N, puis E et enfin va S.
Dans ce cas particulier, la sortie de votre programme doit être:
1. W->S
2. N->S
3. E->S
4. S->S
Tous les conducteurs utilisent des clignotants et savent où tous les autres veulent aller (pour simplifier, nous supposons qu'il est possible de faire la distinction entre le virage à gauche et le demi-tour).
Parfois, les routes reçoivent des signaux prioritaires, qui sont plus importants que les règles ci-dessus. Une route avec une priorité plus élevée a un panneau de priorité ( image du panneau de priorité ). Si la route prioritaire ne va pas tout droit, des panneaux supplémentaires sont également utilisés, comme celui-ci . Les routes de priorité inférieure ont un panneau de rendement ou un panneau d'arrêt (ils sont équivalents). Aucune ou exactement deux routes différentes auront une priorité plus élevée. L'utilisateur de votre programme doit pouvoir saisir les routes qui ont des priorités plus élevées (ou plus basses).
- Un véhicule qui vient de la route avec une priorité plus élevée a la priorité sur un véhicule qui vient d'une route de priorité inférieure, même s'il est sur son côté gauche.
- Si les trajectoires de deux véhicules venant des routes avec la même priorité entrent en collision, les règles ci-dessus à droite sont actives.
Dans l'exemple ci-dessous, les routes S et W ont des panneaux de priorité, ce qui signifie que les véhicules sur N et E doivent leur donner le chemin. Le véhicule S a la priorité sur le véhicule W, car il est sur son côté droit, donc va en premier. Vient ensuite W, car il est sur la route de priorité supérieure à E. Le véhicule N a la priorité sur E, car il est sur son côté droit. Comme le dernier va E.
Dans ce cas particulier, la sortie de votre programme doit être:
1. S->W
2. W->N
3. N->S
4. E->W
- Il est possible qu'un véhicule (et pas plus) soit un véhicule d'urgence , qui ait la priorité indépendamment de la direction dans laquelle il vient ou va, et quel signe il a (il va toujours en premier). Le programme devrait permettre à l'utilisateur d'entrer, quel véhicule est un véhicule d'urgence. Considérant que sur le dernier exemple N est un véhicule d'urgence, N va d'abord, puis S, W et comme le dernier E.
Pour ce cas particulier avec un véhicule d'urgence à N, la sortie de votre programme devrait être:
1. N->S
2. S->W
3. W->N
4. E->W
- Si deux véhicules sont autorisés à partir en même temps (leurs trajectoires ne se heurtent pas et n'ont pas à céder la place à d'autres véhicules), votre programme devrait le savoir et les renvoyer comme ayant le même numéro de séquence
Dans l'exemple ci-dessous, les chemins de N et E ainsi que E et S ou W et E ne se heurtent pas. Parce que S doit céder la place à N et W céder la place à S, S ne peut pas aller simultanément avec E, etc. Le N et E le peuvent. Donc, au début, N et E vont ensemble, puis S et W en dernier.
La sortie appropriée de votre programme devrait être:
1. N->W
1. E->E
2. S->W
3. W->N
Vous êtes libre de choisir l'ordre des lignes
1
(N->W / E->E
équivaut àE->E / N->W
)
- Parfois, le trafic peut conduire à une situation insoluble, qui ne permet à aucun véhicule de partir. Dans la vraie vie, le problème est résolu lorsqu'un des conducteurs démissionne volontairement de son emprise. Ici, votre programme devrait sortir
unsolvable
etc., comme mentionné dans la première partie de la question.Voici un exemple de situation insoluble. E doit céder la place à W, W doit céder la place à S et S doit céder la place à E.
Réponses:
Q, 645 octets
COMMENTAIRES
En définitive, ce n'est pas du code court (ni simple). Il peut être (sévèrement) compacté, mais il est laissé au lecteur comme exercice (j'ai consacré trop de temps à ce problème).
J'ai inclus une solution commentée sur plusieurs lignes, mais je suppose que les sauts de ligne sont à 1 octet et rejettent les commentaires (de / à la fin de la ligne) pour compter la taille
La principale difficulté est de bien comprendre toutes les règles. L'optimisation précoce de la longueur du code est incompatible avec le développement d'une solution à un problème complexe. Ni l'approche ascendante ni descendante ne résiste bien au code illisible.
Enfin, j'ai développé une table de décission (matrice de conflits) à 16 lignes et 16 colonnes (pour chaque direction combinée à chaque virage possible). Les valeurs des éléments sont 0 (compatibilité), 1 (préférence pour la ligne) ou 2 (préférence pour la colonne). Il satisfait tous les tests, je ne suis pas sûr que toutes les situations possibles soient bien couvertes
Le fichier source doit avoir l'extension k. Démarrez l'interpréteur interactif (gratuit pour une utilisation non commerciale, kx.com) et évaluez à l'invite (comme indiqué dans le paragraphe «test»)
TESTER
EXPLICATION
La structure de base est la «matrice de priorité»
Signification (par exemple)
m[NW][SE]
a 0 valeur (les deux mouvements sont compatibles -concurrent-)m[EW][SN]
a 1 valeur (EW a priorité sur SN) NOTE.- d'autres facteurs de priorité peuvent modifier cette phrase (véhicules d'urgence, route prioritaire, ..)m[NE][SE]
a 2 valeurs (SE a priorité sur NE) NOTE.- d'autres facteurs de priorité peuvent modifier cette phrase (véhicules d'urgence, route prioritaire, ..)La matrice peut être construite à l'aide de quatre types de sous-matrice (4x4)
La matrice est complétée par une fonction qui attribue une priorité à chaque mouvement. Cette fonction tient compte des véhicules d'urgence, des routes prioritaires, des directions orthogonales, du type de virage et des véhicules «venant de la droite»
Nous trions les mouvements par priorité et appliquons des valeurs matricielles. La sous-matrice résultante inclut les conflits et la priorité de chaque mouvement.
la source