Prioridade à direita

12

Sua tarefa é regular o tráfego em uma encruzilhada. Existem 4 estradas vindas do norte, leste, sul e oeste.

A entrada é uma sequência que representa o tráfego próximo em cada estrada. Por exemplo, NNNWSindica que há um total de 5 carros: três no norte, um no oeste e um no sul. A ordem dos caracteres não tem importância aqui, NNNWSé equivalente a WNNSN.

Você deve emitir a ordem em que os carros devem seguir, usando a prioridade da regra correta: os carros vindos do sul devem deixar os carros vindos do leste irem primeiro, o leste dá lugar ao norte, o norte dá lugar ao oeste e o oeste dá lugar a sul.

Por exemplo, com a entrada NNNWS, o carro sul deve ir primeiro, depois o carro oeste, depois os 3 carros norte. A saída deve ser assim SWNNN.

Existem alguns casos indecidíveis, por exemplo NSou NNWSE: você deve então gerar a string stuck.

Casos de teste

N => N
NW => WN
NWS => SWN
SNW => SWN
SSSSS => SSSSS
ENNNNES => NNNNEES
NS => stuck
NNWSE => stuck
Arnaud
fonte
3
Ambos parecem muito mais difíceis porque também levam em consideração as instruções de saída.
Martin Ender
3
Eu recomendaria usar um comportamento indefinido em vez de imprimir stuck.
Erik the Outgolfer
4
@Erik ao lidar com a segurança rodoviária, um comportamento indefinido não pode ser aceite :-)
Arnaud
2
Relacionado . Relacionado .
Fatalize 30/09/16
2
A string vazia é possível como entrada? Em caso afirmativo, qual deve ser o resultado? E por que está NSpreso? Porque ambos NSe SNseria uma solução?
Ton Hospel

Respostas:

2

Perl, 65 bytes

Inclui +2 para -lp

Dê entrada no STDIN. Assume que a sequência vazia não é uma entrada válida

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

Se você não se importa com a ausência de uma nova linha depois de stucksoltar a lopção

Ton Hospel
fonte
2

PHP, 267 bytes

use o novo operador de nave espacial e 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);

Demolir

# 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
fonte
1
Em vez de function c($x,$y){global$t,$p;return$p($t,$x)<=>$p($t,$y);}$a=str_split($i);usort($a,c);, você pode usar $a=str_split($i);usort($a,function($x,$y)use($t,$p){return$p($t,$x)<=>$p($t,$y);});e salvar 5 bytes. O operador da nave espacial realmente ajudou com esse tipo de classificação. Para você entender o que eu fiz, mudei a função para dentro usort(), tornando-a anônima. Então, em vez de global(NUNCA use), eu usei function(...)use($t,$p){...}. A use(...)sintaxe permite que você passe variáveis ​​para o corpo da função anônima (também aceita recerências).
Ismael Miguel
@IsmaelMiguel Obrigado por esta maravilhosa explicação.
Jörg Hülsermann 02/10/16
Seja bem-vindo. Eu realmente amo o use()pouco em funções anônimas. Você deve usá-lo e abusar dele.
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%%%

Porta simples da minha resposta JavaScript. Coloca entrada em STDIN em maiúsculas ou minúsculas.

Neil
fonte
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 uma máscara de bits cujas direções se aproximam dos carros e extrai a parte apropriada da sequência de prioridade.

Neil
fonte
Uncaught SyntaxError: Invalid regular expression: missing /
Cyoce 30/09/16
@Cyoce Whoops. O que aconteceu foi que o navegador quebrou o código naquele momento e eu pensei que uma nova linha havia entrado. Desculpe por isso.
Neil
não há problema, apenas avisando.
Cyoce 30/09/16