오른쪽 우선


12

당신의 임무는 교차로에서 교통을 규제하는 것입니다. 북쪽, 동쪽, 남쪽 및 서쪽에서 오는 4 개의 도로가 있습니다.

입력은 각 도로에서 예정된 교통량을 나타내는 문자열입니다. 예를 들어, NNNWS북쪽에 3 대, 서쪽에 1 대, 남쪽에 1 대가 총 5 대가 있음을 나타냅니다. 문자의 순서는 여기에 더 중요성을 가지고 있지 NNNWS동일합니다 WNNSN.

올바른 규칙에 우선 순위를 사용하여 자동차가 이동해야하는 순서를 출력해야합니다. 남쪽.

예를 들어 입력 NNNWS을 사용하면 남쪽 차가 먼저 가고 서쪽 차가 나오고 북쪽 차가 3 대가됩니다. 따라서 출력은이어야합니다 SWNNN.

예를 들어 NS또는 다음과 같은 결정적인 경우가 있습니다 . NNWSE그런 다음 문자열을 출력해야합니다 stuck.

테스트 사례

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

3
둘 다 나가는 방향을 고려하기 때문에 훨씬 어려워 보입니다.
Martin Ender

3
인쇄 대신 정의되지 않은 동작을 사용하는 것이 좋습니다 stuck.
Outgolfer Erik

4
@Erik는 도로 안전을 다룰 때 정의되지 않은 행동을 받아 들일 수 없습니다 :-)
Arnaud


2
빈 문자열이 입력 가능합니까? 그렇다면 결과는 무엇입니까? 그리고 왜 NS붙어? 모두 있기 때문에 NSSN해결책이 될 것인가?
Ton Hospel

답변:


2

펄, 65 바이트

에 +2 포함 -lp

STDIN에 입력하십시오. 빈 문자열이 유효한 입력이 아니라고 가정

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

옵션을 stuck삭제 한 후 줄 바꿈이없는 것을 신경 쓰지 않으면l


2

PHP, 267 바이트

새로운 사용 우주선 연산자에 usort @IsmaelMiguel 의해 -5 바이트

<?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);

고장

# 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
대신 5 바이트를 function c($x,$y){global$t,$p;return$p($t,$x)<=>$p($t,$y);}$a=str_split($i);usort($a,c);사용 $a=str_split($i);usort($a,function($x,$y)use($t,$p){return$p($t,$x)<=>$p($t,$y);});하고 저장할 수 있습니다 . 우주선 운영자는 실제로 이런 종류의 정렬을 도왔습니다. 내가 한 일을 이해하기 위해 함수를로 이동하여 usort()익명 함수로 만들었습니다. 그런 다음 global(사용하지 마십시오 ) 대신을 사용했습니다 function(...)use($t,$p){...}. use(...)구문은 (너무 recerences을 받아) 익명 함수 본문에 변수를 전달 할 수 있습니다.
Ismael Miguel

@IsmaelMiguel이 훌륭한 설명 감사합니다.
Jörg Hülsermann

천만에요. 나는 use()익명 함수 의 비트를 정말 좋아합니다 . 당신은 그것을 사용하고 남용해야합니다.
Ismael Miguel

1

배치, 216 바이트

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

내 JavaScript 답변의 간단한 포트. 대문자 또는 소문자로 STDIN에 입력을받습니다.


1

자바 스크립트 (ES6) 108 107 106 104 바이트

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

방향이 자동차에 접근하는 비트 마스크를 누적하고 우선 순위 문자열의 적절한 부분을 추출합니다.


Uncaught SyntaxError: Invalid regular expression: missing /
Cyoce

@Cyoce Whoops. 무슨 일이 있었는지 브라우저가 그 시점에서 코드를 감 쌌고 줄 바꿈이 들어갔다고 생각했습니다. 죄송합니다.

문제 없습니다. 알려주세요.
Cyoce
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.