Priorytet w prawo

12

Twoim zadaniem jest regulowanie ruchu na skrzyżowaniu. Istnieją 4 drogi prowadzące z północy, wschodu, południa i zachodu.

Dane wejściowe to ciąg reprezentujący nadchodzący ruch na każdej drodze. Na przykład NNNWSwskazuje, że jest w sumie 5 samochodów: trzy na północy, jeden na zachodzie i jeden na południu. Kolejność znaków nie ma tutaj znaczenia, NNNWSjest równoważna WNNSN.

Musisz podać kolejność, w jakiej samochody powinny jechać, stosując pierwszeństwo właściwej reguły: samochody jadące z południa muszą najpierw pozwolić samochodom jadącym ze wschodu jechać najpierw, wschód ustępuje północowi, północ ustępuje zachodowi, a zachód ustępuje południe.

Na przykład, z wejściem NNNWS, najpierw powinien jechać samochód południowy, potem samochód zachodni, a następnie 3 samochody północne. Wynik powinien zatem być SWNNN.

Istnieją pewne nierozstrzygalne przypadki, na przykład NSlub NNWSE: powinieneś następnie wypisać ciąg stuck.

Przypadki testowe

N => N
NW => WN
NWS => SWN
SNW => SWN
SSSSS => SSSSS
ENNNNES => NNNNEES
NS => stuck
NNWSE => stuck
Arnaud
źródło
3
Oba wydają się o wiele trudniejsze, ponieważ uwzględniają również wskazówki wychodzące.
Martin Ender
3
Polecam używanie niezdefiniowanego zachowania zamiast drukowania stuck.
Erik the Outgolfer
4
@Erik w przypadku bezpieczeństwa na drodze nie można zaakceptować niezdefiniowanego zachowania :-)
Arnaud
2
Związane . Związane .
Fatalize
2
Czy pusty ciąg jest możliwy jako dane wejściowe? Jeśli tak, jaki powinien być wynik? I dlaczego NSutknął? Ponieważ oba NSi SNbyłby rozwiązaniem?
Ton Hospel

Odpowiedzi:

2

Perl, 65 bajtów

Obejmuje +2 za -lp

Podaj dane na STDIN. Zakłada, że ​​pusty ciąg nie jest prawidłowym wejściem

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

Jeśli nie przeszkadza ci brak nowej linii po stuckupuszczeniu lopcji

Ton Hospel
źródło
2

PHP, 267 bajtów

użyj nowego operatora statku kosmicznego i wprowadź -5 Bajtów przez @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);

Awaria

# 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
źródło
1
Zamiast tego function c($x,$y){global$t,$p;return$p($t,$x)<=>$p($t,$y);}$a=str_split($i);usort($a,c);możesz użyć $a=str_split($i);usort($a,function($x,$y)use($t,$p){return$p($t,$x)<=>$p($t,$y);});i zapisać 5 bajtów. Operator statku kosmicznego naprawdę pomógł w tego rodzaju sortowaniu. Aby zrozumieć, co zrobiłem, przeniosłem funkcję na usort(), czyniąc ją funkcją anonimową. Następnie zamiast global(NIGDY nie używaj), użyłem function(...)use($t,$p){...}. use(...)Składnia pozwala przekazać zmienne do anonimowego ciała funkcji (jest zbyt akceptuje recerences).
Ismael Miguel
@ IsmaelMiguel Dziękujemy za to wspaniałe wyjaśnienie.
Jörg Hülsermann
Nie ma za co. Naprawdę uwielbiam use()nieco anonimowe funkcje. Powinieneś go używać i nadużywać.
Ismael Miguel
1

Partia, 216 bajtów

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

Prosty port mojej odpowiedzi JavaScript. Pobiera dane wejściowe STDIN wielkimi lub małymi literami.

Neil
źródło
1

JavaScript (ES6), 108 107 106 104 bajtów

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

Gromadzi maskę bitów, które kierunki zbliżają się do samochodów, i wyodrębnia odpowiednią część ciągu priorytetowego.

Neil
źródło
Uncaught SyntaxError: Invalid regular expression: missing /
Cyoce
@Cyoce Whoops. Stało się tak, że przeglądarka zapakowała kod w tym momencie i myślałem, że wkradł się nowy wiersz. Przepraszam za to.
Neil
nie ma problemu, po prostu daję ci znać.
Cyoce