เราเตอร์โรเตอร์บนกริด


10

อินพุต

ข้อมูลของคุณมีสายเดียวแยกจากกันโดยการขึ้นบรรทัดใหม่เข้าไปใน2n+1เส้นของความยาวสำหรับจำนวนเต็มบาง2n+1 n ≥ 0จำนวนเต็มnไม่ได้เป็นส่วนหนึ่งของอินพุต คุณจะต้องคำนวณมันจากสตริง เส้นที่มีองค์ประกอบของ >^<v"ตัวละครทิศทาง" |หากการขึ้นบรรทัดใหม่ก่อให้เกิดปัญหาคุณสามารถแทนที่พวกเขาโดยท่อแนวตั้ง

รูปแบบการป้อนข้อมูลเป็นตารางสี่เหลี่ยมที่มีขนาด(2n+1)x(2n+1)และแต่ละเซลล์ของตารางจะถูกตีความว่าเป็นเราเตอร์โรเตอร์ซึ่งชี้ไปในทิศทางที่สำคัญอย่างใดอย่างหนึ่งในสี่ เราดำเนินการวางโทเค็นบนเราเตอร์ที่กึ่งกลางของตารางจากนั้นเราเตอร์จะย้ายไปรอบ ๆ ด้วยวิธีดังต่อไปนี้ เมื่อโทเค็นตกลงบนเราเตอร์เราเตอร์จะเปลี่ยน 90 องศาในทิศทางทวนเข็มนาฬิกาและย้ายโทเค็นหนึ่งขั้นในทิศทางใหม่ที่ชี้ไป หากพบกับเราเตอร์อื่นกระบวนการจะทำซ้ำ แต่ในที่สุดโทเค็นจะหลุดออกจากกริด

เอาท์พุต

เอาต์พุตของคุณคือการกำหนดค่าสุดท้ายของเราเตอร์ในรูปแบบเดียวกับอินพุต

ตัวอย่าง

เป็นตัวอย่างการป้อนข้อมูลพิจารณา3x3กริด

<^<
^><
>^v

ตำแหน่งที่เราเตอร์ส่วนกลางได้รับการเน้นเพื่อระบุโทเค็น (มันยากที่จะมองเห็น) เราเตอร์ส่วนกลางหมุนไปทางทิศเหนือแล้วย้ายโทเค็นไปที่เซลล์กลางของแถวบนสุด:

<^<
^^<
>^v

เราเตอร์นี้หมุนไปทางตะวันตกและส่งโทเค็นไปที่มุมซ้ายบน:

<<<
^^<
>^v

เราเตอร์ตรงมุมส่งโทเค็นทางทิศใต้ดังนั้นตอนนี้จึงอยู่ที่เซลล์ด้านซ้ายสุดของแถวกลาง:

v<<
^^<
>^v

เราเตอร์นั้นหมุนไปทางตะวันตกและส่งโทเค็นออกจากกริด

v<<
<^<
>^v

นี่คือการกำหนดค่ากริดสุดท้ายดังนั้นโปรแกรมของคุณควรเอาท์พุท โปรดทราบว่าในตัวอย่างที่มีความซับซ้อนมากขึ้นโทเค็นสามารถส่งผ่านเราเตอร์เดียวกันได้หลายครั้งก่อนที่จะตกลงจากกริด

กฎระเบียบ

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

กรณีทดสอบ

Input:
v
Output:
>

Input:
<^<
^><
>^v
Output:
v<<
<^<
>^v

Input:
>>^>>
v<vv<
>^>^<
^<>>^
vvv>>
Output:
>>^>>
>v>>v
^>>vv
^^>>>
v^<<^

Input:
<^^^^^^^^
<<^^^^^^>
<<<^^^^>>
<<<<^^>>>
<<<<^>>>>
<<<vv>>>>
<<vvvv>>>
<vvvvvv>>
vvvvvvvv>
Output:
>>>>>>>>v
^>>>>>>vv
^^>>>>vvv
^^^>>vvvv
<<<<<vvvv
^^^^<<vvv
^^^<<<<vv
^^<<<<<<v
^<<<<<<<<

อินสแตนซ์ที่สองของ "หมุนไปทางทิศตะวันออก" ควรพูดว่า "หมุนไปทางทิศตะวันตกหรือไม่"
Peter Taylor

@PeterTaylor จับได้ดี ฉันดูเหมือนจะสับสนทั้งสองเสมอ
Zgarb

สตริงอินพุตถูกยกเลิกด้วยการขึ้นบรรทัดใหม่หรือไม่?
edc65

@ edc65 คุณสามารถตัดสินใจได้ด้วยตัวเองเช่นกันสำหรับผลลัพธ์ แม้ว่าจะไม่มีการขึ้นบรรทัดใหม่ก่อนหน้านี้
Zgarb

คำตอบ:


3

CJam, 62 61 63 ไบต์

ลองออนไลน์

Nq_N#):D;+_,2/{:P"^<v>^

"_P4$=#:X)=t_,0PX[1DW*WDSP]=-e>e<}h;1>

ขยายและแสดงความคิดเห็น:

Nq              "Read the input grid";
_N#):D;         "Calculate the vertical delta (line length + 1)";
+               "Prepend a newline to the grid";
_,2/            "Calculate the initial position as the length of the grid
                 string divided by 2";
{               "Do...";
  :P"^<v>^

"
  _P4$=           "Get the character indexed by the position in the grid";
  #:X             "Map the character to an operation number:
                   '^'=>0, '<'=>1, 'v'=>2, '>'=>3, '^'=>4, '\n'=>5, '\n'=>6
                   (the unreachable duplicate mappings are important below)";
  )=t             "Set the character indexed by the position in the grid to
                   the result of mapping the operation number + 1 backwards";
  _,0PX[1DW*WDSP]="Map the operation number to a negated delta (this occurs
                   after rotating routers, which means that operation n should
                   act like the character corresponding to operation n + 1):
                   0=>1, 1=>-delta, 2=>-1, 3=>delta, 5=>position";
  -e>e<           "Subtract the negated delta from the position and clamp it to
                   [0, length of the grid string] (array indices are circular,
                   so the length of the grid string will act like the index 0
                   and point to the initial newline next iteration, which will
                   *really* set the position to 0)";
}h              "... while the position is not 0 (i.e. not at the initial
                 newline)";
;1>             "Clean up and remove the initial newline";

โซลูชันของฉันทำงานกับอินพุตเป็นสตริงแบบแบนดังนั้นจึงมีค่าตำแหน่งเดียวที่จะติดตามและแทบไม่มีการประมวลผลล่วงหน้า / หลังการประมวลผล มีการประมวลผลล่วงหน้าเพียง 2 ไบต์เพื่อเพิ่มบรรทัดใหม่ไปยังจุดเริ่มต้นของตารางและ 2 ไบต์ของการประมวลผลภายหลังเพื่อลบออกจากเอาต์พุต แต่ไบต์ 4 เหล่านี้คุ้มค่ากับราคาเพราะพวกเขาให้ฉันขึ้นบรรทัดใหม่และ "รัน" พวกเขาเหมือนเราเตอร์ แต่พวกเขา "หมุน" เป็นบรรทัดใหม่อีกอันและตั้งตำแหน่งเป็นศูนย์ และลูปหลักจะสิ้นสุดลงเมื่อตำแหน่งกลายเป็นศูนย์


ฉันจะปกครองว่าขึ้นบรรทัดใหม่ก่อนหน้านี้น่าเสียดายที่ต้องไป; อนุญาตเฉพาะลากต่อท้ายเท่านั้น
Zgarb

@Zgarb แก้ไข, +2 ไบต์
Runer112

ดูเหมือนว่าผลลัพธ์จากลิงก์ของคุณไม่ถูกต้อง
aditsu ออกเนื่องจาก SE เป็นความชั่วร้าย

@aditsu คุณถูกต้องแน่นอน ฉันไม่แน่ใจว่าสิ่งที่ฉันสัมผัสฉันสาบานว่ามันใช้งานได้ดี ฉันจะดูมัน
Runer112

@aditsu ปรากฎว่าการลบไม่ใช่การสลับ ขอบคุณที่ชี้ให้เห็นว่ามันเสียนั่นง่ายที่จะแก้ไข แต่ตอนนี้หนึ่งในความคิดเห็นแตะรหัส :(
Runer112

2

CJam, 90 69 ไบต์

q_,mqi):L_*Lm2/(:X;{_X_@="^<v>"_@#_[WL1LW*]=X+:X;)=tX)L%XW>XLL(*<**}g

มีขนาดใหญ่สำหรับตอนนี้ยังคงสามารถลดลงได้มาก

ลองออนไลน์ได้ที่นี่


1
คำสาปสกัดกั้นอีกครั้ง! ฉันเพิ่งจะโพสต์ด้วยโซลูชั่น CJam 70 ไบต์ แต่ดูเหมือนว่าจะต้องคิดใหม่ตอนนี้
Runer112

1

JavaScript (ES6) 121 120 127 129

ฟังก์ชั่นที่มีชื่อที่ได้รับสตริงเป็นพารามิเตอร์อินพุตและส่งกลับผลลัพธ์
สมมติว่าสายป้อนถูกยกเลิกด้วยการขึ้นบรรทัดใหม่

แก้ไขการแก้ไขข้อผิดพลาด. search () ทำงานได้ไม่ดีundefined

F=s=>(o=~s.search('\n'),s=[...s],
R=p=>~(u='^<v>'.indexOf(s[p]))?R(p+[-1,-o,1,o][u],s[p]='<v>^'[u]):s)(-~o*o/2-1)
.join('')

Ungolfedและอธิบาย

F=s=>{
  o = s.search('\n')+1; // offset to next row
  s = [...s]; // string to array
  R=p=>{ // recursive search functiom, parameter p is current position in grid
    u = '^<v>'.indexOf(s[p]); // find direction
    if (u<0) return s; // if no direction found, out of grid -> stop recursion
    s[p] = '<v>^'[u] // set new direction into the array cell 
    return R(p+[-1,o,1,-o][u]) // call recursive function with new position
  }
  return R((o-1)*o/2-1) // start recursive search with initial position at grid center
  .join('') // array to string
}

ทดสอบในคอนโซล Firefox / FireBug

s='<^^^^^^^^\n\
<<^^^^^^>\n\
<<<^^^^>>\n\
<<<<^^>>>\n\
<<<<^>>>>\n\
<<<vv>>>>\n\
<<vvvv>>>\n\
<vvvvvv>>\n\
vvvvvvvv>\n'
console.log(F(s))

เอาท์พุต

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