Giun Golf


11

Giun của Paterson là một loại máy tự động di động tồn tại trên một lưới tam giác vô hạn và, mỗi bước, chúng quay theo một hướng nào đó và di chuyển một đơn vị. Thuộc tính xác định của chúng là chúng không bao giờ có thể đi qua cùng một điểm hai lần và bất cứ khi nào chúng gặp cùng một môi trường xung quanh, chúng sẽ đưa ra quyết định tương tự. Một con sâu luôn "nhìn" từ góc nhìn của chính nó với cái đuôi nằm ở 3 và đầu của nó nằm ở trung tâm của hình lục giác này:

Hình ảnh từ wikipedia

Ví dụ, hãy xem xét sâu với các quy tắc:

  1. Nếu 0, 1, 2, 4 và 5 đều trống, hãy di chuyển theo hướng 2
  2. Nếu 0, 1, 4 và 5 trống và 2 được điền, hãy di chuyển theo hướng 0
  3. Nếu 0, 1 và 5 trống và 2 và 4 được điền, di chuyển theo hướng 0

Điều này dẫn đến đường dẫn sau (từ Wikipedia):

Con đường giun

Nếu sâu tìm thấy chính nó trong một tình huống mà tất cả môi trường xung quanh được lấp đầy, nó sẽ chấm dứt.

Đầu vào

Một danh sách các số. Số thứ n cho biết con sâu sẽ đưa ra quyết định gì cho tình huống mới thứ n mà nó gặp phải khi phải đưa ra quyết định. Lưu ý rằng nếu tất cả ngoại trừ một trong những môi trường xung quanh của nó được lấp đầy, nó phải di chuyển theo hướng duy nhất trống rỗng. Điều này không được tính là một "quyết định" và không tiêu thụ một con số. Để tạo sâu mẫu ví dụ được hiển thị ở trên, đầu vào sẽ là [2, 0, 0]. Đầu vào được đảm bảo để tạo ra một con sâu chấm dứt và không truy xuất đường dẫn của nó, và đầu vào sẽ không bao giờ quá ngắn.

Đầu ra

Xuất ra một danh sách các tọa độ cho biết vị trí của đầu sâu, bắt đầu từ (1, 0). Chúng tôi sẽ xem xét di chuyển lên và sang phải là chỉ giảm giá trị y, nhưng di chuyển lên và sang trái là giảm giá trị x và giảm giá trị y. Ví dụ: đầu ra của đường dẫn cho đầu vào ví dụ là

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

Các trường hợp thử nghiệm

Bạn cũng có thể sử dụng đoạn mã javascript để chạy thử nghiệm.

[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)

Chương trình được lắp ráp vội vàng (có thể là lỗi) sẽ hiển thị các con sâu:



Chúng ta có thể lấy đầu vào theo thứ tự ngược lại?
Arnauld

1
@Arnauld chắc chắn là có vẻ ổn
soktinpk

Câu trả lời:


4

JavaScript (ES6),  261 250  249 byte

Đưa danh sách đầu vào theo thứ tự ngược lại. Trả về danh sách các cặp .[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)

Hãy thử trực tuyến!

Đây thực chất là một cổng của đoạn mã demo.


4

K (ngn / k) , 115 byte

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}

(không tính phần đặt tên hàm f:)

Hãy thử trực tuyến!

D,:-D:2\6 3 tạo ra sáu hướng hồng y (1 0;1 1;0 1;-1 0;-1 -1;0 -1)

d::0 là hướng hiện tại, được sử dụng làm chỉ số mod 6 trong D

m::2/=6tạo bộ nhớ sâu ban đầu 32 16 8 4 2 1. các bit của mỗi số mã hóa môi trường xung quanh (0 = phân đoạn đã truy cập; 1 = không mong muốn). ban đầu mchỉ chứa môi trường xung quanh rõ ràng - những nơi có một lối thoát duy nhất.

X::(!6),xlà quy tắc của sâu. chúng tôi chuẩn bị 0 1 2 3 4 5để phù hợp với môi trường xung quanh rõ ràng trong m.

{... }/,1 0áp dụng cho đến khi hội tụ hàm { }bắt đầu bằng danh sách 1 phần tử có chứa 1 0. danh sách sẽ chứa các cặp tọa độ được sâu truy cập.

D 6!d+!6sáu hướng chính bắt đầu từ dvà đi xung quanh theo chiều kim đồng hồ

h:*|x cuối cùng của cuộc tranh luận, tức là vị trí của đầu sâu

(2*h:*|x)+/:D 6!d+!6nhân tọa độ của đầu với 2 và thêm các hướng hồng y. đây là cách của chúng tôi để thể hiện các phân đoạn giữa các điểm.

+':x thêm các cặp điểm truy cập liền kề - điều này cho chúng ta biểu diễn các phân đoạn giữa chúng

^(... )?... tìm xem những đoạn xung quanh của người đứng đầu chưa được truy cập

p:2/ mã hóa nhị phân và gán cho p

m::?m,pchắp thêm mvà giữ sự khác biệt, tức là chỉ nối pvào mnếu pkhông xảy ra trongm

$[... ;... ;... ]nếu-thì-khác

c:X m?ptìm chỉ mục ptrong mvà sử dụng nó như một chỉ mục trong X. kết quả lập chỉ mục ngoài giới hạn trong 0N("null")

$[(~p)|^c:X m?p;x;... ]nếu plà 0 (không có đường thoát) hoặc c0N, sau đó trả về xsẽ buộc hội tụ và dừng vòng lặp

x,,h+D 6!d+:ckhác nối đầu mới vào xvà lặp lại

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.