Приоритет справа

12

Ваша задача - регулировать движение на перекрестке. Есть 4 дороги, идущие с севера, востока, юга и запада.

Входные данные представляют собой строку, представляющую предстоящий трафик на каждой дороге. Например, NNNWSуказывает, что в общей сложности 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
Arnaud
источник
3
Оба из них кажутся намного сложнее, потому что они также учитывают исходящие направления.
Мартин Эндер
3
Я бы рекомендовал использовать неопределенное поведение вместо печати stuck.
Эрик Outgolfer
4
@ Эрик, когда речь идет о безопасности дорожного движения, неопределенное поведение не может быть принято :-)
Арно
2
Возможна ли пустая строка в качестве входных данных? Если так, каким должен быть результат? А почему NSзастрял? Потому что и так NSи SNбудет решением проблемы?
Тон Хоспел

Ответы:

2

Perl, 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 -5 байт от @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);

Сломать

# 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
Вместо этого 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);});и сохранить 5 байтов. Оператор космического корабля действительно помог с такой сортировкой. Чтобы вы поняли, что я сделал, я переместил функцию usort(), сделав ее анонимной функцией. Затем вместо global(НИКОГДА не используйте) я использовал function(...)use($t,$p){...}. use(...)Синтаксис позволяет передавать переменные в анонимной функции тела (она принимает recerences тоже).
Исмаэль Мигель
@IsmaelMiguel Спасибо за это замечательное объяснение.
Йорг Хюльсерманн
Пожалуйста. Я действительно люблю use()немного анонимных функций. Вы должны использовать и злоупотреблять этим.
Исмаэль Мигель
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

JavaScript (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