ย้ายลูกศรไปตามรูปร่าง


28

sandboxed

รับชุดของปิดไม่ทับซ้อนกันรูปทรง 2d (คั่นด้วยช่องว่างอย่างน้อยหนึ่งแม้กระทั่งบนเส้นทแยงมุม) ที่มีลูกศรที่มุ่งเน้นต่อเนื่องในเดียวกันตามเข็มนาฬิกาหรือทวนเข็มนาฬิกาทิศทาง (แต่ละรูปร่างมีทิศทางของตัวเอง) และจำนวนบวกnย้ายลูกศรnทำตามขั้นตอนตามทิศทางที่กำหนด ลูกศรจะแสดง> v < ^ตามลำดับสำหรับทิศทางขวาลงซ้ายและขึ้น มีตัวละครอื่น ๆ-(แนวนอน), |(แนวตั้ง) และ+(มุม) เมื่อลูกศรอยู่ที่มุมหนึ่งมันจะรักษาทิศทางปัจจุบันและเปลี่ยนเฉพาะหลังจากเลี้ยว

จะมีส่วนที่เป็นเส้นตรง (หรือช่องว่าง) ระหว่างสองมุมใด ๆ (เช่น+-+แนวนอนและแนวตั้งที่คล้ายกัน) - กล่าวอีกนัยหนึ่งUคือห้ามการเลี้ยวที่คมชัด ส่วนระหว่างมุมทั้งแนวตั้งหรือแนวนอนและโค้งที่มุมอยู่เสมอ 90 องศา

การป้อนข้อมูล:

  • จำนวนเต็มบวก - n- จำนวนขั้นตอน
  • การเป็นตัวแทน ASCII ของรูปทรง - มันอาจเป็นสตริงหลายรายการของสตริงรายการของตัวละครและอื่น ๆ

เอาท์พุท:

รูปทรงเดียวกันกับลูกศรทั้งหมดเปลี่ยนnขั้นตอนในทิศทางโดยรวมของแต่ละเส้น

กรณีทดสอบ:

1

การป้อนข้อมูล:

n = 1

 +----->->            
 |       |            
 |       v---+        
 |           |        
 +---<-------+      

เอาท์พุท:

 +------>+
 |       v
 |       +>--+
 |           |
 +--<--------+

2

การป้อนข้อมูล:

n = 2

 +-----+ +---+        
 |     | |   |        
 +-->--+ |   v  
         |   | 
 +--->---+   |        
 |           |         
 +------<<---+       

เอาท์พุท:

 +-----+ +---+
 |     | |   |
 +---->+ |   |
         |   | 
 +----->-+   v
 |           |     
 +----<<-----+        

3

การป้อนข้อมูล:

n = 3

 +---+   +---+   +-------+      
 |   |   |   v   |       |      
 ^   |   |   |   +-<-+   |      
 |   |   ^   |       |   v      
 |   +---+   +-->----+   |      
 |                       |      
 |   +-------+   +---+   |      
 |   |       |   v   |   |      
 +---+       +---+   +---+      

เอาท์พุท:

 +>--+   ^---+   +-------+
 |   |   |   |   ^       |
 |   |   |   |   +---+   |
 |   |   |   |       |   |
 |   +---+   v----->-+   |
 |                       |
 |   +-------+   +---+   v 
 |   |       |   |   |   |
 +---+       +-<-+   +---+  

4

การป้อนข้อมูล:

n = 1

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

เอาท์พุท:

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

5

อินพุต

n = 4

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

เอาท์พุท:

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

6

การป้อนข้อมูล:

n = 1

^->
^ v
<<v

เอาท์พุท:

^>+
^ v
<<v

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


รูปทรงทั้งสองสามารถสัมผัสมุมของพวกเขาในแนวทแยงมุมหรือรูปร่างที่สัมผัสได้เช่นนั้น?
xnor

4
"เนื่องจากชุดของรูปทรง 2d ที่ไม่มีการเหลื่อมซ้อนปิด ... กับลูกศรที่มุ่งเน้นอย่างต่อเนื่องในทิศทางตามเข็มนาฬิกาหรือทวนเข็มนาฬิกาเดียวกัน" เสียงสำหรับฉันเหมือนทุกรูปร่างนั้นมุ่งเน้นไปในทิศทางเดียวกันในขณะที่จากกรณีทดสอบดูเหมือนว่า ลูกศรมีความสอดคล้องภายในรูปร่างเท่านั้น
xnor

3
@xnor ขอบคุณสำหรับความคิดเห็นของคุณ! - ไม่อนุญาตให้ใช้รูปทรงสัมผัสกันในแนวทแยง - รูปร่างแต่ละเส้นมีทิศทางของตัวเอง ฉันจะอัปเดตคำอธิบาย
Galen Ivanov

2
สามารถป้อนข้อมูลโดยไม่มีช่องว่างระหว่างกำแพงได้หรือไม่? เช่นลองออนไลน์! . ฉันรู้ว่าคุณพูดว่า "คั่นด้วยช่องว่างอย่างน้อยหนึ่งช่องว่าง" แต่ฉันไม่แน่ใจว่ามันใช้กับลูปอิสระหรือใช้กับลูปเดี่ยวเช่นกัน
โยนาห์

1
@Jonah ไม่เป็นไปไม่ได้:There will always be a straight segment (or a space) between any two corners (like +-+ for the horizontal and similar for the vertical) - in other words the sharp U turns are forbidden.
Galen Ivanov

คำตอบ:


14

JavaScript (ES6),  210 ... 182  180 ไบต์

(m)(n)ม.

m=>g=n=>n?g(n-1,m=m.map((r,y)=>r.map((c,x)=>(i=0,h=$=>~$?(m[Y=y+($-2)%2]||0)[X=x+~-$%2]>h?"-|+"[n+=`;m[${Y}][${X}]=S[${$}]`,i?2:$&1]:h($^++i):c)((S="<^>v").indexOf(c)))),eval(n)):m

ลองออนไลน์!

อย่างไร?

คุณสามารถไปที่ลิงค์นี้เพื่อดูแหล่งที่จัดรูปแบบแล้ว

เสื้อคลุม

ก.n-1n=0

วิธีการอัพเดต

เราไม่สามารถย้ายลูกศรแต่ละครั้งอย่างปลอดภัยเพราะเราจะเสี่ยงต่อการเขียนทับลูกศรที่ไม่ได้อัปเดตกับลูกศรที่อัปเดต แต่ก่อนอื่นเราจะลบลูกศรทั้งหมดและคำนวณตำแหน่งใหม่ของพวกเขา เราใช้ตำแหน่งใหม่ในครั้งที่สอง

n

n

"1;m[0][7]=S[2];m[1][8]=S[3];m[2][9]=S[2];m[4][3]=S[0]"

n

eval(n)ตำแหน่งใหม่จะถูกนำมาใช้โดยเพียงแค่การทำ

คำสั่ง

d$

10+23

dxdY

 d | dx = (d - 1) % 2 | dy = (d - 2) % 2
---+------------------+------------------
 0 |        -1        |         0
 1 |         0        |        -1
 2 |        +1        |         0
 3 |         0        |        +1

ลูกเตะมุม

ชั่วโมงddxor1dxor3

+-|d

ชั่วโมง$ชั่วโมง"$""$""$"

เวอร์ชันภาพเคลื่อนไหว


ขอบคุณสำหรับคำอธิบาย!
Galen Ivanov

8

K (ngn / k) , 183 161 157 ไบต์

{A:"^>v<";D,:-D:(-1 0;!2);s:(#x;#*x);c:~^x;r:" -+|"c*+/'3'0,c,0;$[#p:+s\&~^t:A?,/x;;:r];q:q@'*'&'~^x ./:/:q:+p+/:D@4!(t^0N)+/:0 1 3;s#@[,/r;s/+q;:;A@D?q-p]}/

ลองออนไลน์!

{ }/เมื่อเรียกด้วย int ซ้ายหาเรื่อง n สิ่งนี้จะใช้ฟังก์ชันใน{ }n ครั้งกับหาเรื่องด้านขวา

A:"^>v<" ลูกศร

D,:-D:(-1 0;!2) ∆y, ∆x สำหรับ 4 ทิศทางสำคัญ

s:(#x;#*x) รูปร่างของอินพุต: ความสูงความกว้าง

c:~^x countours - boolean matrix แสดงตำแหน่งที่ไม่มีช่องว่าง

r:" -+|"c*+/'3'0,c,0สร้างเมทริกซ์ตัวละครใหม่โดยใช้ countour แต่ไม่มีลูกศรโดยนับตัวเอง + บน + ล่างสำหรับแต่ละเซลล์ในcและแทนที่ 1-> -, 2-> +, 3->|

t:A?,/xประเภทของลูกศร: 0 1 2 3 สำหรับ^>v<เซลล์อื่น ๆ ทั้งหมดจะถูกแทนด้วย0N(null)

p:+s\&~^t พิกัดของลูกศร

$[#p ;;:r] หากไม่มีลูกศรให้ส่งคืน r

q:+p+/:D@4!(t^0N)+/:0 1 3 ตำแหน่งใหม่ 3 ตำแหน่งที่เป็นไปได้สำหรับลูกศรแต่ละลูก - ถ้ามันเดินหน้าต่อไปถ้ามันเลี้ยวซ้ายและถ้ามันเลี้ยวขวา

q:q@'*'&'~^x ./:/:q สำหรับลูกศรแต่ละตัวเลือกตัวเลือกแรกที่ตกลงบนเคา

@[,/r;s/+q;:;A@D?q-p]แผ่แบนrและวางลูกศรลงที่ตำแหน่งใหม่ของพวกเขาและทิศทางใหม่ของพวกเขา

s# เปลี่ยนรูปร่างให้เป็นรูปร่างดั้งเดิม


2
คุณเร็วมาก! ฉันหวังว่าคุณจะอธิบายรหัสหลังจากเล่นกอล์ฟเสร็จ
Galen Ivanov

ขอบคุณสำหรับคำอธิบาย!
Galen Ivanov

4

ถ่านขนาด 105 ไบต์

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ≔>^<vζPθFθ¿№ζι«⊞υ⟦⌕ζιⅉⅈ⟧§+|-↨EKV›κ ²»ιFυ«J⊟ι⊟ι≔⊟ιιFIη«≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ιM✳⊗黧ζι

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด รวมถึง 22 ไบต์ที่ใช้เพื่อหลีกเลี่ยงรูปแบบอินพุตที่ยุ่งยาก คำอธิบาย:

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ

ใส่รูปทรงและจำนวนขั้นตอนที่สะดวก

≔>^<vζ

อักขระทิศทางถูกใช้หลายครั้งดังนั้นสตริงจะถูกแคชที่นี่ ดัชนีของอักขระทิศทางในสายอักขระนี้เรียกว่าทิศทาง

Pθ

พิมพ์รูปทรงดั้งเดิมโดยไม่ต้องเลื่อนเคอร์เซอร์

Fθ

วนรอบตัวละครในรูปร่าง

¿№ζι«

หากตัวละครปัจจุบันเป็นตัวอักษรทิศทาง ...

⊞υ⟦⌕ζιⅉⅈ⟧

... จากนั้นบันทึกทิศทางและตำแหน่งในรายการ ...

§+|-↨EKV›κ ²

... และแทนที่อักขระด้วยอักขระบรรทัดที่เหมาะสม

»ι

มิฉะนั้นจะส่งออกอักขระและย้ายไปยังอักขระถัดไป

Fυ«

วนซ้ำตำแหน่งที่บันทึกไว้

J⊟ι⊟ι

ข้ามไปยังตำแหน่งที่บันทึกไว้

≔⊟ιι

แยกทิศทางที่บันทึกไว้

FIη«

วนซ้ำตามจำนวนขั้นตอนที่เหมาะสม

≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ι

ค้นหาทิศทางของขั้นตอนต่อไปซึ่งเป็นทิศทางที่ไม่ย้อนกลับหรือว่างเปล่า

M✳⊗ι

ก้าวไปในทิศทางนั้น (ดัชนีทิศทางถ่านสำหรับMoveคำสั่งนั้นมีมูลค่าสองเท่าของทิศทางของฉัน)

»§ζι

พิมพ์ตัวอักษรทิศทางที่เหมาะสม


ขอบคุณสำหรับคำอธิบาย!
Galen Ivanov

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