Prioritas ke kanan

12

Tugas Anda adalah mengatur lalu lintas di persimpangan jalan. Ada 4 jalan yang datang dari utara, timur, selatan dan barat.

Input adalah string yang mewakili lalu lintas yang akan datang di setiap jalan. Misalnya, NNNWSmenunjukkan ada total 5 mobil: tiga di utara, satu di barat dan satu di selatan. Urutan karakter tidak penting di sini, NNNWSsama dengan WNNSN.

Anda harus menampilkan urutan di mana mobil harus pergi, menggunakan prioritas ke aturan yang benar: mobil yang datang dari selatan harus membiarkan mobil yang datang dari timur pergi dulu, timur memberi jalan ke utara, utara memberi jalan ke barat dan barat memberi jalan ke Selatan.

Misalnya, dengan input NNNWS, mobil selatan harus pergi dulu, lalu mobil barat, lalu 3 mobil utara. Outputnya seharusnya demikian SWNNN.

Ada beberapa kasus yang tidak dapat ditentukan, misalnya NSatau NNWSE: Anda kemudian harus mengeluarkan string stuck.

Uji kasus

N => N
NW => WN
NWS => SWN
SNW => SWN
SSSSS => SSSSS
ENNNNES => NNNNEES
NS => stuck
NNWSE => stuck
Arnaud
sumber
3
Keduanya tampak jauh lebih sulit karena mereka juga memperhitungkan arah keluar.
Martin Ender
3
Saya akan merekomendasikan menggunakan perilaku yang tidak terdefinisi daripada mencetak stuck.
Erik the Outgolfer
4
@Erik ketika berhadapan dengan keselamatan jalan, perilaku yang tidak terdefinisi tidak dapat diterima :-)
Arnaud
2
Terkait . Terkait .
Fatalkan tanggal
2
Apakah string kosong mungkin sebagai input? Jika demikian, apa hasilnya? Dan mengapa NSmacet? Karena keduanya NSdan SNakan menjadi solusi?
Ton Hospel

Jawaban:

2

Perl, 65 byte

Termasuk +2 untuk -lp

Berikan masukan pada STDIN. Mengasumsikan string kosong bukan input yang valid

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

Jika Anda tidak keberatan dengan tidak adanya baris baru setelah stuckAnda dapat menjatuhkan lopsi

Ton Hospel
sumber
2

PHP, 267 Bytes

gunakan operator pesawat ruang angkasa baru dan usort -5 Bytes oleh @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);

Kerusakan

# 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
sumber
1
Alih-alih function c($x,$y){global$t,$p;return$p($t,$x)<=>$p($t,$y);}$a=str_split($i);usort($a,c);, Anda dapat menggunakan $a=str_split($i);usort($a,function($x,$y)use($t,$p){return$p($t,$x)<=>$p($t,$y);});dan menyimpan 5 byte. Operator pesawat ruang angkasa sangat membantu dengan penyortiran semacam ini. Agar Anda mengerti apa yang saya lakukan, saya memindahkan fungsi ke usort(), menjadikannya fungsi anonim. Kemudian, alih-alih global(TIDAK PERNAH menggunakannya), saya telah menggunakan function(...)use($t,$p){...}. The use(...)sintaks memungkinkan Anda untuk melewatkan variabel ke dalam anonim fungsi tubuh (ia menerima recerences juga).
Ismael Miguel
@IsmaelMiguel Terima kasih atas penjelasan yang luar biasa ini.
Jörg Hülsermann
Sama-sama. Saya sangat suka use()sedikit pada fungsi anonim. Anda harus menggunakan dan menyalahgunakannya.
Ismael Miguel
1

Batch, 216 byte

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

Port sederhana dari jawaban JavaScript saya. Mengambil input pada STDIN dalam huruf besar atau kecil.

Neil
sumber
1

JavaScript (ES6), 108 107 106 104 byte

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

Mengumpulkan bitmask yang arahnya mendekati mobil dan mengekstraksi bagian yang sesuai dari string prioritas.

Neil
sumber
Uncaught SyntaxError: Invalid regular expression: missing /
Cyoce
@Cyoce Whoops. Apa yang terjadi adalah bahwa browser membungkus kode pada saat itu dan saya pikir baris baru masuk. Maaf tentang itu.
Neil
tidak masalah, hanya memberi tahu Anda.
Cyoce