Prolog, 284 byte
e(S,[0|X]):-e(S,X).
e([A|S],[A|X]):-S=X;e(S,X).
v(X/Y,76,Y/Z):-Z is -X.
v(X/Y,82,Z/X):-Z is -Y.
v(D,0,D).
c([],0/0-0/1,[0/0]).
c([H|T],K/L-D/E,[K/L|C]):-c(T,I/J-X/Y,C),v(X/Y,H,D/E),K is I+X,L is J+Y,\+member(K/L,C).
n(X):-X=0;n(Y),X#=Y+1.
p(S,L):-n(L),length(X,L),e([0|S],X),c(X,_,_).
Đây là một tuyên bố khá đơn giản về thuật toán và khá kém hiệu quả (không phải tất cả các trường hợp thử nghiệm đều chạy trong thời gian hợp lý, mặc dù hầu hết đã làm). Nó hoạt động thông qua việc tạo ra tất cả các độ dài có thể cho đầu ra từ 1 trở lên ( n
); tạo ra tất cả các chuỗi có thể của trái / tiến / phải của độ dài đó phù hợp với đầu vào (được thực hiện trong e
; đường dẫn mới được gọi X
); sau đó kiểm tra đường dẫn đầu tiên như vậy có hợp lệ không ( c
, gọi vào v
để xử lý các tác động của rẽ trái và phải trên các đồng bằng x và y). Độ dài trả về là đầu ra đầu tiên nhìn thấy trongL
. .
Không có nhiều cách chơi golf ở đây, nhưng có một số. n
được thực hiện với một bộ giải ràng buộc vì nó cho phép loại bỏ nhiều khoảng trắng hơn mà không gây nhầm lẫn cho trình phân tích cú pháp; điều này có thể yêu cầu GNU Prolog được sử dụng, không chắc về điều đó. (Tôi không thể làm tương tự c
vì nó cần xử lý các số âm.) Việc thực hiện e
có hiệu quả thấp hơn đáng kể so với yêu cầu, thông qua việc khớp danh sách theo nhiều cách; hiệu quả hơn e([],[]).
sẽ dài hơn sáu byte (nó sẽ cho phép S=X;
loại bỏ dòng 2, nhưng đó chỉ là mức tăng bốn so với mất mười). Để cho phép tôi khớp toàn bộ tọa độ và chỉ đường, hoặc chỉ một phần, tôi đại diện cho chúng là X/Y
(tức là một AST không được đánh giá, có thể được khớp trên), cho phép tôi sử dụng ký hiệu infix.
Prolog, 256 byte, quá kém hiệu quả để dễ dàng kiểm tra
Tất nhiên, vì đây là Prolog, nhiều hàm có thể đảo ngược, ví dụ c
có thể được sử dụng để tạo tất cả các đường dẫn từ gốc đến một cặp tọa độ cụ thể. Ngoài ra, c
tự nhiên tạo ra từ ngắn nhất đến dài nhất. Điều này có nghĩa là thay vì yêu cầu độ dài tối thiểu một cách rõ ràng, chúng ta chỉ có c
thể tạo tất cả các đường dẫn đi bất cứ đâu , sau đó tìm đường dẫn đầu tiên phù hợp với đầu vào:
e(S,[0|X]):-e(S,X).
e([A|S],[A|X]):-S=X;e(S,X).
v(X/Y,76,Y/Z):-Z is -X.
v(X/Y,82,Z/X):-Z is -Y.
v(D,0,D).
c([],0/0-0/1,[0/0]).
c([H|T],K/L-D/E,[K/L|C]):-c(T,I/J-X/Y,C),v(X/Y,H,D/E),K is I+X,L is J+Y,\+member(K/L,C).
p(S,L):-c(X,_,_),length(X,L),e([0|S],X).
Điều này có hiệu suất theo cấp số nhân (O (3 n ), trong đó n là đầu ra). Tuy nhiên, tôi đã quản lý để xác minh nó trong một số thử nghiệm nhỏ hơn (mất khoảng 7 giây để xuất 14 và khoảng 20 đến đầu ra 15, trên máy tính của tôi).