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,_,_).
Ini adalah pernyataan algoritma yang cukup mudah, dan cukup tidak efisien (tidak semua kasus uji berjalan dalam waktu yang wajar, meskipun sebagian besar melakukannya). Ia bekerja melalui menghasilkan semua panjang yang mungkin untuk output dari 1 ke atas ( n
); menghasilkan semua urutan yang mungkin dari kiri / maju / kanan dengan panjang yang konsisten dengan input (diimplementasikan dalam e
; jalur baru disebut X
); kemudian memeriksa jalur pertama yang valid ( c
, yang memanggil v
untuk menangani efek belokan kiri dan kanan pada delta x dan y). Panjang kembali adalah output pertama yang terlihat diL
. (+2 penalti jika Anda ingin mencegah fungsi mengembalikan output lain yang mungkin untuk panjang jika Anda mundur ke dalamnya; itu tidak pernah cukup jelas bagaimana pengembalian fungsi istimewa Prolog harus dihitung.)
Tidak banyak cara trik golf di sini, tetapi ada beberapa. n
diimplementasikan dengan pemecah kendala karena memungkinkan lebih banyak ruang kosong untuk dihapus tanpa membingungkan parser; ini mungkin memerlukan GNU Prolog untuk digunakan, tidak yakin tentang itu. (Saya tidak bisa melakukan hal yang sama c
karena perlu menangani angka negatif.) Implementasi e
ini jauh lebih efisien daripada yang seharusnya, melalui pencocokan daftar dalam berbagai cara; semakin efisien e([],[]).
akan menjadi enam byte lebih lama (itu akan memungkinkan S=X;
jalur 2 dihapus, tetapi itu hanya keuntungan empat dibandingkan dengan kerugian sepuluh). Untuk memungkinkan saya mencocokkan koordinat dan arah secara keseluruhan, atau hanya sebagian, saya mewakili mereka sebagai X/Y
(yaitu AST yang tidak dievaluasi, yang dapat dicocokkan pada), memungkinkan saya untuk menggunakan notasi infiks.
Prolog, 256 byte, terlalu tidak efisien untuk dengan mudah diuji
Tentu saja, karena ini adalah Prolog, banyak fungsi yang dapat dibalik, misalnya c
dapat digunakan untuk menghasilkan semua jalur dari asal ke pasangan koordinat tertentu. Selain itu, c
secara alami menghasilkan dari terpendek ke terpanjang. Ini berarti bahwa alih-alih meminta panjang minimum secara eksplisit, kita bisa c
membuat semua jalur yang menuju ke mana saja , lalu mencari yang pertama yang konsisten dengan input:
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).
Ini memiliki kinerja eksponensial (O (3 n ), di mana n adalah output). Namun, saya berhasil memverifikasi pada beberapa tes yang lebih kecil (dibutuhkan sekitar 7 detik untuk output 14, dan sekitar 20 untuk output 15, di komputer saya).