Prolog, 284 Bytes
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,_,_).
Dies ist eine ziemlich einfache Aussage des Algorithmus und ziemlich ineffizient (nicht alle Testfälle liefen in angemessener Zeit, obwohl die meisten dies taten). Es funktioniert durch Generieren aller möglichen Längen für die Ausgabe von 1 aufwärts ( n); Erzeugen aller möglichen Sequenzen von links / vorwärts / rechts dieser Länge, die mit der Eingabe übereinstimmen (implementiert in e; der neue Pfad wird aufgerufen X); Suchen Sie dann nach dem ersten gültigen Pfad ( cder vdie Auswirkungen von Links- und Rechtskurven auf die x- und y-Deltas behandelt). Die Rücklauflänge ist die erste Ausgabe inL. (+2 Strafe, wenn Sie verhindern möchten, dass die Funktion andere mögliche Ausgaben für die Länge zurückgibt, wenn Sie zurückverfolgen; es ist nie ganz klar, wie die eigenwilligen Funktionsrückgaben von Prolog gezählt werden sollten.)
Hier gibt es nicht viel Golf-Tricks, aber es gibt einige. nwurde mit einem Constraint-Solver implementiert, da dadurch mehr Leerzeichen entfernt werden können, ohne den Parser zu verwirren. Dies kann die Verwendung von GNU Prolog erfordern, da Sie sich nicht sicher sind. (Ich konnte nicht das Gleiche tun, cda es mit negativen Zahlen umgehen muss.) Die Implementierung von eist erheblich weniger effizient als nötig, da eine Liste auf mehrere Arten abgeglichen wird. Das effizientere e([],[]).wäre sechs Bytes länger (es würde das S=X;Entfernen von Zeile 2 ermöglichen, aber das ist nur ein Gewinn von vier im Vergleich zu einem Verlust von zehn). Damit ich Koordinaten und Richtungen als Ganzes oder nur als Teil X/Yabgleichen kann , stelle ich sie als (dh als nicht bewertete AST, die angepasst werden kann) dar, sodass ich die Infix-Notation verwenden kann.
Prolog, 256 Bytes, zu ineffizient, um einfach getestet zu werden
Da dies Prolog ist, sind natürlich viele der Funktionen reversibel, z. B. ckönnen sie verwendet werden, um alle Pfade vom Ursprung zu einem bestimmten Koordinatenpaar zu generieren. Darüber hinaus cerzeugt natürlich vom kürzesten zum längsten. Dies bedeutet, dass wir, anstatt explizit nach einer Mindestlänge zu fragen, einfach alle Pfadec generieren können, die irgendwohin führen , und dann nach dem ersten suchen können, der mit der Eingabe übereinstimmt:
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).
Dies hat eine exponentielle Leistung (O (3 n ), wobei n die Ausgabe ist). Ich habe es jedoch geschafft, es bei einigen der kleineren Tests zu überprüfen (es dauert ungefähr 7 Sekunden, um 14 auszugeben, und ungefähr 20, um 15 auf meinem Computer auszugeben).