Пріоритет праворуч


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

3
І те й інше здається набагато складніше, оскільки вони також враховують вихідні вказівки.
Мартін Ендер

3
Я б рекомендував використовувати не визначене поведінку замість друку stuck.
Ерік Аутгольфер

4
@Erik, коли йдеться про безпеку дорожнього руху, не можна визнати невизначену поведінку :-)
Арно


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 байт

скористайтеся новим оператором космічного корабля та вставте -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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.