เวิร์มของ Golf Paterson


11

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

ภาพจากวิกิพีเดีย

ตัวอย่างเช่นพิจารณาหนอนด้วยกฎ:

  1. ถ้า 0, 1, 2, 4 และ 5 เป็นค่าว่างให้ย้ายไปในทิศทางที่ 2
  2. ถ้า 0, 1, 4 และ 5 เป็นค่าว่างและเติม 2 ให้ย้ายไปในทิศทาง 0
  3. หาก 0, 1 และ 5 เป็นค่าว่างและเติม 2 และ 4 ให้ย้ายในทิศทาง 0

ผลลัพธ์นี้ในเส้นทางต่อไปนี้ (จาก Wikipedia):

เส้นทางหนอน

หากเวิร์มพบว่าตัวเองอยู่ในสถานการณ์ที่สภาพแวดล้อมเต็มไปหมด

อินพุต

รายการตัวเลข หมายเลขที่ n ระบุว่าการตัดสินใจที่เวิร์มควรทำในสถานการณ์ใหม่ที่เกิดขึ้นนั้นต้องเผชิญกับการตัดสินใจที่ใด โปรดทราบว่าหากเต็ม แต่หนึ่งในสภาพแวดล้อมนั้นจะต้องย้ายไปในทิศทางเดียวที่ว่างเปล่า สิ่งนี้ไม่นับเป็นการ "ตัดสินใจ" และไม่ใช้จำนวน [2, 0, 0]เพื่อสร้างหนอนตัวอย่างที่แสดงข้างต้นการป้อนข้อมูลที่จะเป็น อินพุตรับประกันว่าจะสร้างเวิร์มที่จะหยุดการทำงานและไม่ย้อนเส้นทางของมันและอินพุตจะไม่สั้นเกินไป

เอาท์พุต

(1, 0)รายการการส่งออกของพิกัดบ่งชี้ที่หัวของหนอนจะเริ่มต้นที่ เราจะพิจารณาเลื่อนขึ้นและไปทางขวาเพื่อลดเฉพาะค่า y แต่เลื่อนขึ้นและไปทางซ้ายเพื่อลดค่า x และลดค่า y ตัวอย่างเช่นเอาต์พุตของพา ธ สำหรับอินพุตตัวอย่างคือ

(1, 0), (1, 1), (0, 0), (-1, -1), (0, -1), (0, 0), (0, 1), (-1, 0), (0, 0)

กรณีทดสอบ

คุณสามารถใช้ javascript snippet เพื่อทำการทดสอบได้เช่นกัน

[2,0,0]: (1,0),(1,1),(0,0),(-1,-1),(0,-1),(0,0),(0,1),(-1,0),(0,0)
[1,0,4,0,1,5]: (1,0),(2,1),(2,2),(1,2),(0,1),(0,0),(0,-1),(1,-1),(2,0),(2,1),(3,1),(4,2),(4,3),(3,3),(2,2),(1,1),(1,0),(2,0),(3,1),(3,0),(4,0),(5,1),(5,2),(4,2),(3,2),(2,1),(1,1),(0,0),(-1,0),(-2,-1),(-2,-2),(-1,-2),(0,-1),(1,0),(1,-1),(2,-1),(3,0),(4,1),(4,2),(5,3),(5,4),(4,4),(3,3),(3,4),(2,4),(1,3),(1,2),(1,1),(0,1),(-1,0),(-1,1),(-2,1),(-3,0),(-3,-1),(-2,-1),(-1,-1),(0,0)
[1,0,5,1]: (1,0),(2,1),(2,2),(1,2),(0,1),(0,0),(0,-1),(1,-1),(2,0),(2,1),(3,2),(3,3),(2,3),(1,2),(0,2),(-1,1),(-1,0),(0,0),(1,1),(1,2),(1,3),(0,3),(-1,2),(-1,1),(-2,0),(-2,-1),(-1,-1),(0,0)
[2,0,1,0]: (1,0),(1,1),(0,0),(-1,-1),(0,-1),(0,0),(-1,0),(-1,-1),(-1,-2),(0,-1),(1,0),(2,1),(1,1),(0,1),(0,0)

โปรแกรมที่ประกอบขึ้นอย่างเร่งรีบ (อาจเป็นบั๊กซี) ต่อไปนี้จะแสดงเวิร์ม:


2
กรณีทดสอบที่แนะนำ : p (นี่คือ[1,0,4,2,0,1,5])
Arnauld

เราสามารถรับอินพุตในลำดับย้อนกลับได้หรือไม่?
Arnauld

1
@Arnauld แน่ใจว่าดูเหมือนว่าตกลง
soktinpk

คำตอบ:


4

JavaScript (ES6),  261 250  249 ไบต์

[x,y]

a=>(G=[[[x=1]]],v=[0,1,1,0,-1,-1],F=y=>[[x,y],...v.every((_,i)=>k^=g(o+i)[q%3]<<i,k=63,g=o=>(r=G[Y=y-o%2*v[q=(o+3)%6]]=G[Y]||[])[X=x-o%2*v[-~q%6]]=r[X]||[])?F(y+v[g(o+=F[k]|=1/F[k]?0:k&~-k?a.pop():31-Math.clz32(k))[q%3]=1,o%6],x+=v[-~o%6]):[]])(o=0)

ลองออนไลน์!

นี่คือพอร์ตของตัวอย่างข้อมูล


4

K (ngn / k) , 115 ไบต์

D,:-D:2\6 3;f:{d::0;m::2/=6;X::(!6),x;{m::?m,p:2/^(+':x)?(2*h:*|x)+/:D 6!d+!6;$[(~p)|^c:X m?p;x;x,,h+D 6!d+:c]}/,1 0}

(ไม่นับส่วนการตั้งชื่อฟังก์ชั่น f: )

ลองออนไลน์!

D,:-D:2\6 3 สร้างทิศทางที่สำคัญทั้งหก (1 0;1 1;0 1;-1 0;-1 -1;0 -1)

d::0 เป็นทิศทางปัจจุบันใช้เป็นดัชนี mod 6 ใน D

m::2/=632 16 8 4 2 1สร้างหน่วยความจำหนอนเริ่มต้น บิตของแต่ละหมายเลขเข้ารหัสสภาพแวดล้อม (0 = เซกเมนต์ที่เยี่ยมชม 1 = ไม่ได้เข้าชม) ในขั้นต้นmมีเพียงสภาพแวดล้อมที่ไม่คลุมเครือ - ซึ่งมีทางออกเดียวให้บริการ

X::(!6),xเป็นกฎของหนอน เราเตรียมที่0 1 2 3 4 5จะจับคู่กับสภาพแวดล้อมที่ชัดเจนภายในmเพื่อให้ตรงกับสภาพแวดล้อมที่ชัดเจนใน

{... }/,1 0ใช้จนกระทั่งบรรจบกันฟังก์ชั่น{ }เริ่มต้นด้วยรายการ 1 องค์ประกอบที่มี1 0องค์ประกอบที่มี รายการจะมีคู่ของพิกัดที่หนอนเข้าชม

D 6!d+!6 พระคาร์ดินัลทั้งหกทิศทางเริ่มต้นจาก dและไปตามเข็มนาฬิกา

h:*|x สุดท้ายของการโต้แย้งคือตำแหน่งของหัวหนอน

(2*h:*|x)+/:D 6!d+!6คูณพิกัดของหัวด้วย 2 และเพิ่มทิศทางที่สำคัญ นี่คือวิธีของเราในการแสดงเซ็กเมนต์ระหว่างจุด

+':x เพิ่มคู่ของจุดเยี่ยมชมที่อยู่ติดกัน - สิ่งนี้ทำให้เราได้เป็นตัวแทนของกลุ่มระหว่างพวกเขา

^(...)? ... ค้นหาว่ากลุ่มใดที่อยู่รอบ ๆ ส่วนหัวยังไม่ได้เข้าชม

p:2/ เข้ารหัสไบนารีและกำหนดให้ p

m::?m,pผนวกไปmและเก็บที่แตกต่างกันคือผนวกpการmเฉพาะในกรณีที่pไม่ได้เกิดขึ้นในm

$[... ;... ;... ]ถ้าเป็นอย่างอื่น

c:X m?pพบว่าดัชนีของpในและใช้เป็นดัชนีในm Xผลลัพธ์การจัดทำดัชนีไม่อยู่ในขอบเขต0N("null")

$[(~p)|^c:X m?p;x;... ]ถ้าpเป็น 0 (ไม่มีเส้นทางทางออก) หรือcเป็น0Nดังนั้นให้ส่งคืนxซึ่งจะบังคับให้บรรจบกันและหยุดการวนซ้ำ

x,,h+D 6!d+:cมิฉะนั้นต่อท้ายหัวใหม่ไปxและทำซ้ำ

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