Priorità a destra


12

Il tuo compito è regolare il traffico su un incrocio. Ci sono 4 strade che provengono da nord, est, sud e ovest.

L'input è una stringa che rappresenta il traffico imminente su ciascuna strada. Ad esempio, NNNWSindica che ci sono 5 macchine in totale: tre a nord, una a ovest e una a sud. L'ordine dei personaggi non ha importanza qui, NNNWSè equivalente a WNNSN.

Devi emettere l'ordine in cui le auto dovrebbero andare, usando la priorità alla giusta regola: le auto che provengono da sud devono lasciare che le auto che arrivano da est vadano per prime, est che cede a nord, nord che cede a ovest e ovest che cede a Sud.

Ad esempio, con l'ingresso NNNWS, l'automobile del sud dovrebbe andare prima, poi l'automobile dell'ovest, quindi le 3 automobili del nord. L'output dovrebbe quindi essere SWNNN.

Ci sono alcuni casi indecidibili, ad esempio NSo NNWSE: dovresti quindi generare la stringa stuck.

Casi test

N => N
NW => WN
NWS => SWN
SNW => SWN
SSSSS => SSSSS
ENNNNES => NNNNEES
NS => stuck
NNWSE => stuck

3
Entrambi sembrano molto più difficili perché tengono conto anche delle indicazioni in uscita.
Martin Ender,

3
Consiglierei di usare un comportamento indefinito invece di stampare stuck.
Erik the Outgolfer,

4
@Erik quando si tratta di sicurezza stradale, un comportamento indefinito non può essere accettato :-)
Arnaud


2
La stringa vuota è possibile come input? In tal caso, quale dovrebbe essere il risultato? E perché è NSbloccato? Perché entrambi NSe SNsarebbe una soluzione?
Ton Hospel,

Risposte:


2

Perl, 65 byte

Include +2 per -lp

Dare input su STDIN. Presuppone che la stringa vuota non sia un input valido

#!/usr/bin/perl -lp
s%.%'+(y/NESW/ESWN/*s/N(.*)W/W$1N/,/N/^/S/)'x4%gere+0or$_=stuck

Se non ti dispiace l'assenza di una nuova riga dopo stuckaver lasciato cadere l' lopzione


2

PHP, 267 byte

usa il nuovo operatore astronave e usa -5 byte di @IsmaelMiguel

<?foreach($f=[E,S,W,N]as$l)$s.=+!($r=strstr)($i=$argv[1],$l);if(in_array($s,[0101,1010,0000]))die(stuck);$x=($p=strpos)($s,"1");$t=$r($j=join($f),$f[$x]).$r($j,$f[$x],1);$a=str_split($i);usort($a,function($x,$y)use($t,$p){return$p($t,$x)<=>$p($t,$y);});echo join($a);

Abbattersi

# Extended Version without notices
$s="";
foreach($f=["E","S","W","N"] as $l){$s.=+!strstr($i=$argv[1],$l);} #bool concat swap the false true values in string
if(in_array($s,["0101","1010","0000"])){die("stuck");} # NS WE NESW -> stuck = end program
$x=strpos($s,"1"); # find the first false value for an begin for the sort algorithm
$t=strstr($j=join($f),$f[$x]).strstr($j,$f[$x],1); # create the sort pattern
#sort algorithm example sort string = NESW-> N is not in the string
function c($x,$y){
    global $t;
    return strpos($t,$x)<=>strpos($t,$y); # e.g. comparison E<=>W =-1 , W<=>S=1, W<=>W =0
}
$a=str_split($i); # Input in an array
usort($a,"c"); #sort array
echo join($a);# output array as string

1
Invece di function c($x,$y){global$t,$p;return$p($t,$x)<=>$p($t,$y);}$a=str_split($i);usort($a,c);, è possibile utilizzare $a=str_split($i);usort($a,function($x,$y)use($t,$p){return$p($t,$x)<=>$p($t,$y);});e salvare 5 byte. L'operatore dell'astronave ha davvero aiutato con questo tipo di smistamento. Per farti capire cosa ho fatto, ho spostato la funzione in usort(), rendendola una funzione anonima. Quindi, invece di global(MAI usarlo), l'ho usato function(...)use($t,$p){...}. La use(...)sintassi consente di passare le variabili nel corpo della funzione anonima (accetta anche le recerenze).
Ismael Miguel,

@IsmaelMiguel Grazie per questa meravigliosa spiegazione.
Jörg Hülsermann,

Prego. Mi piace davvero un use()po 'le funzioni anonime. Dovresti usarlo e abusarlo.
Ismael Miguel,

1

Lotto, 216 byte

@echo off
set/pt=
set/an=2,e=4,s=8,w=16,r=0
:l
set/ar^|=%t:~0,1%
set t=%t:~1%
if not "%t%"=="" goto l
set/a"o=449778192>>r&3,l=1053417876>>r&3"
if %l%==0 (echo stuck)else set t=NESWNE&call echo %%t:~%o%,%l%%%

Porta semplice della mia risposta JavaScript. Riceve input su STDIN in maiuscolo o minuscolo.


1

JavaScript (ES6), 108 107 106 104 byte

s=>(r=t=`NESWNE`,s.replace(/./g,c=>r|=2<<t.search(c)),t.substr(449778192>>r&3,1053417876>>r&3)||`stuck`)

Accumula una maschera di bit di quali direzioni si avvicinano alle automobili ed estrae la parte appropriata della stringa di priorità.


Uncaught SyntaxError: Invalid regular expression: missing /
Cyoce,

@Cyoce Whoops. Quello che è successo è che il browser ha spostato il codice a quel punto e ho pensato che fosse arrivata una nuova riga. Mi dispiace.
Neil,

nessun problema, solo per farti sapere.
Cyoce,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.