ลำดับความสำคัญไปทางขวา


12

งานของคุณคือควบคุมการจราจรบนทางแยก มีถนน 4 สายที่มาจากทิศเหนือทิศตะวันออกทิศใต้และทิศตะวันตก

อินพุตเป็นสตริงที่แสดงถึงการจราจรที่จะเกิดขึ้นในแต่ละถนน ตัวอย่างเช่นNNNWSระบุว่ามีทั้งหมด 5 คัน: สามคันทางทิศเหนือหนึ่งคันทางทิศตะวันตกและอีกหนึ่งทางทิศใต้ คำสั่งของตัวละครที่ไม่มีความสำคัญที่นี่เทียบเท่ากับNNNWSWNNSN

คุณต้องส่งออกลำดับที่รถควรไปโดยใช้ลำดับความสำคัญเป็นกฎที่ถูกต้อง: รถยนต์ที่มาจากทางทิศใต้จะต้องปล่อยให้รถยนต์ที่มาจากตะวันออกไปก่อนตะวันออกไปทางทิศเหนือทิศเหนือทิศตะวันตกและทิศตะวันตก ทางทิศใต้

ตัวอย่างเช่นเมื่อมีการป้อนข้อมูลNNNWSรถใต้ควรไปก่อนแล้วจึงไปทางทิศตะวันตกและตะวันตกเฉียงเหนือ 3 คัน SWNNNการส่งออกจึงควรจะเป็น

มีบางกรณี indecidable เป็นตัวอย่างNSหรือNNWSE: stuckคุณควรแล้วออกสตริง

กรณีทดสอบ

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

3
ทั้งสองอย่างนั้นดูลำบากกว่านี้เพราะพวกเขาคำนึงถึงเส้นทางขาออกด้วยเช่นกัน
Martin Ender

3
stuckฉันจะแนะนำให้ใช้พฤติกรรมที่ไม่ได้กำหนดแทนการพิมพ์
Erik the Outgolfer

4
@Erik เมื่อจัดการกับความปลอดภัยทางถนนพฤติกรรมที่ไม่ได้กำหนดไม่สามารถยอมรับได้ :-)
Arnaud

2
ที่เกี่ยวข้อง ที่เกี่ยวข้อง
ลดขนาด

2
เป็นสตริงว่างเปล่าที่เป็นไปได้ในการป้อนข้อมูล? ถ้าเป็นเช่นนั้นผลลัพธ์ควรเป็นอย่างไร และทำไมถึงNSติดอยู่? เพราะทั้งคู่NSและSNจะเป็นทางออกหรือไม่?
Ton Hospel

คำตอบ:


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 Bytes โดย @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 เกินไป)
Ismael Miguel

@IsmaelMiguel ขอขอบคุณสำหรับการอธิบายที่ยอดเยี่ยมนี้
JörgHü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

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 อ๊ะ สิ่งที่เกิดขึ้นคือเบราว์เซอร์ห่อรหัส ณ จุดนั้นและฉันคิดว่ามีบรรทัดใหม่พุ่งเข้ามาขออภัยเกี่ยวกับเรื่องนั้น
Neil

ไม่มีปัญหาเพียงแค่แจ้งให้คุณทราบ
Cyoce
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.