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,_,_).
Esta é uma declaração bastante direta do algoritmo e bastante ineficiente (nem todos os casos de teste foram executados em tempo razoável, embora a maioria o tenha feito). Ele funciona através da geração de todos os comprimentos possíveis para a saída de 1 para cima ( n); gerar todas as sequências possíveis de esquerda / frente / direita desse comprimento que são consistentes com a entrada (implementada em e; o novo caminho é chamado X); depois, verifique o primeiro caminho válido ( cque chama vpara lidar com os efeitos das curvas esquerda e direita nos deltas x e y). O comprimento de retorno é a primeira saída vista emL. (+2 de penalidade, se você quiser impedir que a função retorne outras saídas possíveis para o comprimento, se você voltar atrás; nunca fica claro como os retornos da função idiossincrática do Prolog devem ser contados.)
Não há muito em truques de golfe aqui, mas há alguns. nfoi implementado com um solucionador de restrições, pois permite que mais espaço em branco seja removido sem confundir o analisador; isso pode exigir que o GNU Prolog seja usado, não tenho certeza disso. (Eu não poderia fazer o mesmo, cpois ele precisa lidar com números negativos.) A implementação de eé consideravelmente menos eficiente do que precisa, através da correspondência de uma lista de várias maneiras; o mais eficiente e([],[]).seria seis bytes a mais (permitiria S=X;remover a linha 2, mas isso é apenas um ganho de quatro em comparação com uma perda de dez). Para permitir que eu combine coordenadas e direções como um todo, ou apenas uma parte, eu as represento como X/Y(ou seja, um AST não avaliado, que pode ser comparado), permitindo que eu use a notação infix.
Prolog, 256 bytes, muito ineficiente para testar facilmente
Obviamente, como esse é o Prolog, muitas das funções são reversíveis, por exemplo, cpodem ser usadas para gerar todos os caminhos da origem para um par de coordenadas específico. Além disso, cgera naturalmente do menor para o maior. Isso significa que, em vez de solicitar um comprimento mínimo explicitamente, podemos cgerar todos os caminhos que vão a qualquer lugar e procurar o primeiro que seja consistente com a entrada:
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).
Isso tem desempenho exponencial (O (3 n ), onde n é a saída). No entanto, consegui verificá-lo em alguns dos testes menores (demora cerca de 7 segundos para produzir 14 e 20 para produzir 15 no meu computador).