A tarefa
Escreva um programa ou função que adote uma estrutura de interseção de tráfego e produza a sequência na qual os veículos passarão.
A saída deve conter, no máximo, quatro linhas com o seguinte formato #. x->y\n
, em que #
é um número de número de sequência, seguindo-se a ponto .
, x
e y
são caracteres ["N", "E", "S", "W"]
. Eles devem ser separados por caracteres ->
. Se você não retornar uma matriz de cadeias, cada linha deverá terminar com um \n
(caractere de nova linha) ou equivalente ao seu sistema.
A entrada deve assumir o seguinte formato:
- Parte 1: quatro caracteres, cada um com a estrada de destino para as estradas de origem na ordem N, E, S, W (no sentido horário). Os caracteres são permitidos
N
,S
,W
,E
ou. Espaço significa que não há veículo em determinada estrada. Por exemplo, string
S WE
significa que N veículo deseja ir para o sul, espaço significa que não há veículo E,W
significa que S deseja ir para o oeste,E
significa que o oeste deseja ir para o leste. - Parte 2 - um espaço ou uma única letra que significa qual é o veículo de emergência.
- Parte 3 - dois caracteres que determinam quais duas estradas têm prioridade (por exemplo,
NE
significa que o norte e o leste têm prioridades mais altas que o sul e o oeste). Se for mais fácil para você, você pode pegar estradas de menor prioridade (nesse casoSW
).
Em uma situação insolúvel que estão autorizados a devolver uma cadeia de uma linha que é claro para o usuário, como unsolvable
, no solution
e similar. Os usuários de JavaScript podem ter uma undefined
constante interna.
Este é um código-golfe, então a resposta mais curta em bytes vence.
As regras de trânsito
Observe que algumas das regras podem não seguir as regras de tráfego do seu país. Alguns deles foram simplificados para facilitar o desafio. Não use esta pergunta como um guia para o sistema de tráfego da vida real.
- Para o desafio, você tem permissão para usar apenas o tráfego do lado direito.
- O cruzamento de tráfego consiste em exatamente quatro estradas que se encontram em um ponto. Eles são marcados
N
(como para "Norte"),S
,W
,E
. Essas letras devem ser usadas em vez dex
ey
no exemplo de saída acima.
- Em cada estrada, há no máximo um veículo. Não é garantido que exista um veículo em cada estrada. Cada veículo pode dirigir em qualquer uma das quatro direções, ou seja. vire à esquerda, vire à direita, siga em frente ou faça uma inversão de marcha .
- Se os caminhos de dois veículos não se cruzam (eles não colidem), eles podem seguir no mesmo momento. Os caminhos não colidem, se dois veículos (a lista pode não estar completa, mas isso é intencional, apenas para lhe dar uma pista):
- vêm de direções opostas e ambas seguem em frente, ou pelo menos uma delas vira à direita,
- vêm de direções opostas e ambos vire à esquerda,
- vêm de direções opostas e um deles gira em qualquer direção ou faz a inversão de marcha, enquanto o outro faz a inversão de marcha,
- provenientes de direções ortogonais, uma à esquerda está virando à direita e a outra não faz a inversão de marcha
Alguns exemplos de não colidir caminhos abaixo. Observe que, no terceiro desenho, qualquer caminho de N colidirá com o caminho de E, mesmo que N faça uma inversão de marcha.
- Se dois caminhos colidem, é necessário usar outras regras. Se dois veículos estiverem na mesma estrada prioritária (veja abaixo), o direito de passagem será concedido ao veículo que:
- é vem da estrada do lado direito, se vierem de direções ortogonais
- vira à direita se o outro vira à esquerda
- vai reto ou vira à direita se o outro fizer uma inversão de marcha.
Nos dois exemplos abaixo, o veículo E tem direito de passagem sobre o veículo S.
No exemplo abaixo, primeiro vai W, depois N, depois E e, por último, S.
Nesse caso em particular, a saída do seu programa deve ser:
1. W->S
2. N->S
3. E->S
4. S->S
Todos os motoristas usam indicadores de direção e sabem para onde todos os outros desejam ir (por simplicidade, assumimos que é possível distinguir entre a curva à esquerda e a inversão de marcha).
Às vezes, as estradas recebem sinais de prioridade, que são mais importantes que as regras acima. Uma estrada com prioridade mais alta tem um sinal de prioridade ( imagem do sinal de prioridade ). Se a estrada prioritária não for reta, também serão utilizados sinais adicionais, como este . As estradas com prioridade mais baixa têm um sinal de rendimento ou um sinal de parada (eles são equivalentes). Nenhuma ou exatamente duas estradas diferentes terão prioridade mais alta. O usuário do seu programa deve poder informar quais estradas têm prioridades mais altas (ou mais baixas).
- Um veículo que sai da estrada com maior prioridade tem o direito de passagem sobre um veículo proveniente da estrada de menor prioridade, mesmo que esteja do lado esquerdo.
- Se os caminhos de dois veículos vindos das estradas com a mesma prioridade colidirem, as regras acima do lado direito estarão ativas.
No exemplo abaixo, as estradas S e W têm sinais de prioridade, o que significa que os veículos em N e E devem dar o caminho. O veículo S tem prioridade sobre o veículo W, porque está do lado direito, o que acontece primeiro. Então vai W, porque está na estrada de maior prioridade que E. O veículo N tem uma saída de E, porque está do lado direito. Como o último vai E.
Nesse caso em particular, a saída do seu programa deve ser:
1. S->W
2. W->N
3. N->S
4. E->W
- É possível que um (e não mais) veículo seja um veículo de emergência , que tenha a prioridade, independentemente de qual direção ele vem ou vai, e que sinal tem (sempre o primeiro). O programa deve permitir que o usuário entre em qual veículo é um veículo de emergência. Considerando que no último exemplo N é um veículo de emergência, N vai primeiro, depois S, W e como o último E.
Para este caso específico com um veículo de emergência em N, a saída do seu programa deve ser:
1. N->S
2. S->W
3. W->N
4. E->W
- Se dois veículos puderem ir no mesmo momento (seus caminhos não colidem e não precisam dar lugar a outros veículos), seu programa deve descobrir isso e devolvê-los como tendo o mesmo número de sequência
No exemplo abaixo, os caminhos de N e E, bem como E e S ou W e E, não colidem. Como S tem que dar lugar a N e W dá lugar a S, S não pode ir simultaneamente com E etc. O N e E podem. Então, a princípio, N e E andam juntos, depois S e W como o último.
A saída adequada do seu programa deve ser:
1. N->W
1. E->E
2. S->W
3. W->N
Você é livre para escolher a ordem das linhas
1
(N->W / E->E
é equivalente aE->E / N->W
)
- Às vezes, o tráfego pode levar a uma situação insolúvel, que não permite que nenhum veículo saia. Na vida real, isso é resolvido quando um dos motoristas renuncia voluntariamente ao seu direito de passagem. Aqui, seu programa deve produzir
unsolvable
etc., como mencionado na primeira parte da pergunta.Abaixo está um exemplo de situação insolúvel. E deve dar lugar a W, W deve dar lugar a S e S deve dar lugar a E.