Prioridad a la derecha

12

Su tarea es regular el tráfico en una encrucijada. Hay 4 caminos que vienen del norte, este, sur y oeste.

La entrada es una cadena que representa el tráfico próximo en cada carretera. Por ejemplo, NNNWSindica que hay un total de 5 automóviles: tres en el norte, uno en el oeste y uno en el sur. El orden de los caracteres no tiene importancia aquí, NNNWSes equivalente a WNNSN.

Debe mostrar el orden en el que deben ir los autos, utilizando la prioridad a la regla correcta: los autos que vienen del sur deben dejar que los autos que vienen del este vayan primero, el este da paso al norte, el norte da paso al oeste y el oeste da paso a sur.

Por ejemplo, con la entrada NNNWS, el automóvil del sur debe ir primero, luego el automóvil del oeste, luego los 3 automóviles del norte. La salida debería ser así SWNNN.

Hay algunos casos indecidibles, por ejemplo, NSo NNWSE: debería generar la cadena stuck.

Casos de prueba

N => N
NW => WN
NWS => SWN
SNW => SWN
SSSSS => SSSSS
ENNNNES => NNNNEES
NS => stuck
NNWSE => stuck
Arnaud
fuente
3
Ambos parecen mucho más difíciles porque también tienen en cuenta las instrucciones salientes.
Martin Ender
3
Recomendaría usar un comportamiento indefinido en lugar de imprimir stuck.
Erik the Outgolfer
44
@Erik cuando se trata de seguridad vial, no se puede aceptar un comportamiento indefinido :-)
Arnaud
2
Relacionados . Relacionados .
Fatalize
2
¿Es posible la cadena vacía como entrada? Si es así, ¿cuál debería ser el resultado? ¿Y por qué está NSatascado? ¿Porque ambos NSy SNserían una solución?
Ton Hospel

Respuestas:

2

Perl, 65 bytes

Incluye +2 para -lp

Dar entrada en STDIN. Asume que la cadena vacía no es una entrada válida

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

Si no le importa la ausencia de una nueva línea después de stuckque pueda soltar la lopción

Ton Hospel
fuente
2

PHP, 267 bytes

use el nuevo operador de nave espacial y use -5 Bytes por @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);

Descompostura

# 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
Jörg Hülsermann
fuente
1
En lugar de function c($x,$y){global$t,$p;return$p($t,$x)<=>$p($t,$y);}$a=str_split($i);usort($a,c);, puede usar $a=str_split($i);usort($a,function($x,$y)use($t,$p){return$p($t,$x)<=>$p($t,$y);});y guardar 5 bytes. El operador de la nave espacial realmente ayudó con este tipo de clasificación. Para que entiendas lo que hice, moví la función a usort(), convirtiéndola en una función anónima. Entonces, en lugar de global(NUNCA lo use), lo he usado function(...)use($t,$p){...}. La use(...)sintaxis le permite pasar variables al cuerpo de la función anónima (también acepta referencias).
Ismael Miguel
@IsmaelMiguel Gracias por esta maravillosa explicación.
Jörg Hülsermann
De nada. Realmente me encantan las use()funciones anónimas. Debes usarlo y abusar de él.
Ismael Miguel
1

Lote, 216 bytes

@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%%%

Puerto simple de mi respuesta de JavaScript. Toma entrada en STDIN en mayúsculas o minúsculas.

Neil
fuente
1

JavaScript (ES6), 108 107 106 104 bytes

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

Acumula una máscara de bits de las direcciones que se aproximan a los automóviles y extrae la parte adecuada de la cadena de prioridad.

Neil
fuente
Uncaught SyntaxError: Invalid regular expression: missing /
Cyoce
@Cyoce Whoops. Lo que sucedió fue que el navegador envolvió el código en ese punto y pensé que se había introducido una nueva línea. Lo siento.
Neil
no hay problema, solo dejándote saber.
Cyoce