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 ( c
que chama v
para 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. n
foi 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, c
pois 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, c
podem ser usadas para gerar todos os caminhos da origem para um par de coordenadas específico. Além disso, c
gera naturalmente do menor para o maior. Isso significa que, em vez de solicitar um comprimento mínimo explicitamente, podemos c
gerar 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).