L'obiettivo
Scrivi un programma o una funzione che prende una struttura di intersezione del traffico e genera la sequenza in cui passeranno i veicoli.
L'output dovrebbe contenere al massimo quattro linee con il seguente formato #. x->y\n, dove #è un numero di sequenza, seguiti dal puntino ., xe ysono caratteri ["N", "E", "S", "W"]. Dovrebbero essere separati da caratteri ->. Se non si restituisce una matrice di stringhe, ogni riga deve terminare con un \n(nuovo carattere di riga) o equivalente al proprio sistema.
L'input dovrebbe assumere la forma seguente:
- Parte 1: quattro personaggi, ognuno con la strada di destinazione per le strade di origine nell'ordine N, E, S, W (in senso orario). I caratteri consentiti sono
N,S,W,Eo. Lo spazio significa che non esiste alcun veicolo su una determinata strada. Ad esempio, stringaS WEsignifica che N veicolo vuole andare a sud, lo spazio significa che non c'è veicolo E,Wche S vuole andare ad ovest,Esignifica che Ovest vuole andare ad est. - Parte 2 - uno spazio o una singola lettera che significa quale è del veicolo di emergenza.
- Parte 3: due caratteri che determinano quali due strade hanno la priorità (ad es.
NESignifica che Nord e Est hanno entrambe priorità più alte rispetto a Sud e Ovest). Se è più facile per te, potresti prendere strade con priorità più bassa (in quel casoSW).
In una situazione irrisolvibile si è permesso di restituire una stringa di una riga che è chiaro per l'utente, come unsolvable, no solutione simili. Gli utenti JavaScript possono prendere la undefinedcostante integrata .
Questo è un codice-golf, quindi vince la risposta più breve in byte.
Le regole del traffico
Si noti che alcune delle regole potrebbero non seguire le regole del proprio Paese. Alcuni di essi sono stati semplificati per facilitare la sfida. Non utilizzare questa domanda come guida per il sistema di traffico reale.
- Per la sfida è consentito utilizzare solo il traffico sul lato destro.
- L'intersezione del traffico è costituita da esattamente quattro strade che si incontrano in un punto. Essi sono contrassegnati
N(come per "Nord"),S,W,E. Queste lettere dovrebbero essere usate al postoxeynell'esempio di output sopra.
- Su ogni strada c'è al massimo un veicolo. Non è garantito che ci sia un veicolo su ogni strada. Ogni veicolo può guidare in una delle quattro direzioni, ad es. girare a sinistra, svoltare a destra, proseguire dritto o fare un inversione di marcia .
- Se i percorsi di due veicoli non si intersecano (non si scontrano), possono andare nello stesso momento. I percorsi non si scontrano, se due veicoli (l'elenco potrebbe non essere completo, ma questo è intenzionale, solo per darti un indizio):
- provengono da direzioni opposte ed entrambi vanno dritti, o almeno uno di essi gira a destra,
- provengono da direzioni opposte ed entrambi girano a sinistra,
- provengono da direzioni opposte e una di esse gira in qualsiasi direzione o fa l'inversione a U, mentre l'altra fa l'inversione a U,
- provengono da direzioni ortogonali, l'una a sinistra gira a destra e l'altra non effettua l'inversione a U.
Di seguito alcuni esempi di non collisione dei percorsi. Si noti che al terzo disegno qualsiasi percorso di N si scontrerebbe con il percorso di E, anche se N fa un'inversione di marcia.
- Se due percorsi si scontrano, è necessario utilizzare altre regole. Se due veicoli si trovano sulla stessa strada prioritaria (vedi sotto), al veicolo viene dato il diritto di passaggio che:
- viene dalla strada sul lato destro, se provengono da direzioni ortogonali
- gira a destra se l'altra gira a sinistra
- va dritto o gira a destra se l'altro fa un'inversione a U.
In entrambi gli esempi di seguito, il veicolo E ha la precedenza sul veicolo S.
Nell'esempio che segue va prima W, poi N, quindi E e l'ultima va a S.
Per questo caso particolare l'output del tuo programma dovrebbe essere:
1. W->S
2. N->S
3. E->S
4. S->S
Tutti i conducenti usano gli indicatori di direzione e sanno dove vogliono andare tutti gli altri (per semplicità supponiamo che sia possibile distinguere tra la svolta a sinistra e la svolta a U).
A volte alle strade vengono assegnati segni di priorità, che sono più importanti delle regole di cui sopra. Una strada con priorità più alta ha un segno di priorità ( immagine del segno di priorità ). Se la strada prioritaria non procede dritta, vengono utilizzati anche segnali aggiuntivi, come questo . Le strade con priorità inferiore hanno un segnale di rendimento o un segnale di stop (sono equivalenti). Nessuna o esattamente due strade diverse avranno una priorità più alta. L'utente del tuo programma dovrebbe essere in grado di inserire quali strade hanno priorità più alte (o più basse).
- Un veicolo che viene dalla strada con priorità più alta ha la precedenza su un veicolo proveniente da una strada con priorità inferiore, anche se si trova sul lato sinistro.
- Se i percorsi di due veicoli provenienti dalle strade con la stessa priorità si scontrano, sono attive le regole sopra il lato destro.
Nell'esempio che segue le strade S e W hanno segni di priorità, il che significa che i veicoli su N ed E dovrebbero dare loro la strada. Il veicolo S ha la priorità sul veicolo W, perché si trova sul lato destro, quindi va per primo. Quindi va W, perché si trova sulla strada con priorità più alta di E. Il veicolo N ha la precedenza da E, perché si trova sul lato destro. Come l'ultimo va E.
Per questo caso particolare l'output del tuo programma dovrebbe essere:
1. S->W
2. W->N
3. N->S
4. E->W
- È possibile che un (e non più) veicolo sia un veicolo di emergenza , che ha la priorità indipendentemente dalla direzione da cui proviene o va e da quale segnale ha (va sempre per primo). Il programma dovrebbe consentire all'utente di inserire quale veicolo è un veicolo di emergenza. Considerando che sull'ultimo esempio N è un veicolo di emergenza, N va prima, poi S, W e come l'ultima E.
Per questo caso particolare con un veicolo di emergenza su N, l'output del tuo programma dovrebbe essere:
1. N->S
2. S->W
3. W->N
4. E->W
- Se due veicoli possono andare nello stesso momento (i loro percorsi non si scontrano e non devono lasciare il posto ad altri veicoli), il tuo programma dovrebbe scoprirlo e restituirli con lo stesso numero progressivo
Nell'esempio che segue i percorsi di N ed E nonché di E e S o W ed E non si scontrano. Poiché S deve lasciare il posto a N e W lasciare il posto a S, S non può andare contemporaneamente con E, ecc. N e E possono. Quindi all'inizio N ed E vanno insieme, poi va S e W come ultimo.
L'output corretto del programma dovrebbe essere:
1. N->W
1. E->E
2. S->W
3. W->N
Sei libero di scegliere l'ordine delle linee
1(N->W / E->Eè equivalente aE->E / N->W)
- A volte il traffico può portare a una situazione irrisolvibile, che non consente a nessun veicolo di andare. Nella vita reale si risolve quando uno dei conducenti si dimette volontariamente dalla sua precedenza. Qui, il tuo programma dovrebbe produrre
unsolvableecc., Come indicato nella prima parte della domanda.Di seguito è riportato un esempio di situazione irrisolvibile. E dovrebbe lasciare il posto a W, W dovrebbe lasciare il posto a S e S dovrebbe lasciare il posto a E.











