Anterior, 344 bytes
&v>>>#p_:63p:43g`\!+v>/*53g+\01g:2%2*1-\2/!*63g+\0\:v
40$ v++!\`g14:p35:\<^2\-1*2%2p10::%4+g00:\g36\g35-1_v
#11^$_83p73v >1+:41g`!#v_$,1+:43g`!#v_@>->2>+00p+141^_
<p1^ vp< ^,g+7g36:<<<<1+55p36:<<<< ^1?0^#7g36g35*
8&p|!++!%9#2g+7g10\*!-g38g10!-g37:g00!!*<>3^
443>:!#v_>>1-::3%1-:53g+00p\3/1-:63g+01p^
^>^>>$#<"#"53g63g7+p41g53g-43g63g-+!#^_
Experimente online!
Como o @flawr mencionado na resposta do MATLAB, isso pode levar algum tempo se o tamanho do campo for de qualquer tamanho não trivial. Na verdade, é muito fácil entrar em uma situação em que não vale a pena tentar esperar que termine, porque é bem provável que você espere até o fim dos tempos.
Para entender por que isso acontece, é útil visualizar o programa em execução em um dos muitos "depuradores visuais" do Befunge. Como dados e código são a mesma coisa no Befunge, você poderá visualizar o caminho à medida que muda com o tempo. Por exemplo, aqui está uma curta animação mostrando como pode ser uma parte de uma corrida em um caminho lento.
Uma vez que o algoritmo decide fazer aquela fatídica curva para a esquerda na parte inferior do limite do campo, ele essencialmente se condenou a uma vida inteira de perambulação sem objetivo. A partir desse ponto, ele deve seguir todos os caminhos possíveis naquela área cercada antes que possa recuar e tentar a curva à direita. E o número de caminhos em potencial nesses casos pode facilmente se tornar astronômico.
Conclusão: se parece que está demorando muito tempo, provavelmente é uma boa idéia abortar a execução e começar de novo.
Explicação
Este é basicamente um algoritmo recursivo, tentando todos os caminhos possíveis através do campo e, em seguida, desenrolando as etapas que já foram seguidas sempre que ele fica preso. Como o Befunge não tem o conceito de funções, uma função recursiva está fora de questão, mas podemos emular o processo rastreando o estado na pilha.
Isso funciona preenchendo a pilha com possíveis coordenadas que podemos seguir. Depois, puxamos um conjunto da pilha e verificamos se ele é adequado (ou seja, dentro do intervalo e não se sobrepõe a um caminho existente). Depois de termos um bom lugar, escrevemos um #
no campo de jogo nesse local e adicionamos esses detalhes à pilha, caso precisemos voltar mais tarde.
Em seguida, colocamos mais quatro conjuntos de coordenadas na pilha (em ordem aleatória), indicando os possíveis caminhos que podemos seguir a partir desse novo local e voltamos ao início do loop. Se nenhum dos caminhos possíveis for possível, chegaremos ao ponto da pilha em que salvamos o local da #
gravação, então desfazeremos essa etapa e continuaremos tentando coordenadas em potencial a partir de uma etapa anterior.
É assim que o código se parece com as várias partes do componente destacadas:
Leia a largura e a altura do campo e empurre as coordenadas de início junto com um 0
marcador de tipo para indicar um caminho potencial em vez de um local de retorno.
Verifique se há locais de retorno (indicados por um 1
marcador de tipo) que são revertidos com um p
comando simples , pois eles são armazenados no formato exato necessário para gravar um espaço no campo de jogo.
Verifique se as coordenadas ainda estão dentro do campo de jogo. Se estiverem fora do alcance, solte-os da pilha e retorne para tentar as próximas coordenadas em potencial.
Se estiverem dentro do intervalo, obtenha os dois próximos valores da pilha, que é o local da etapa anterior (necessária no teste a seguir).
Verifique se as coordenadas entrarão em contato com um segmento existente do caminho. A localização da etapa anterior é obviamente ignorada nessa verificação.
Se todos os testes forem bem-sucedidos, escreva um #
no campo de jogo e verifique se chegamos ao local de destino.
Se tivermos, escreva o caminho final e saia.
Caso contrário, salve as coordenadas na pilha com um 1
marcador de tipo para retroceder posteriormente.
Isso é interrompido com um cálculo de número aleatório que precisaremos em breve.
Envie quatro destinos em potencial que podem ser alcançados a partir do local atual. O número aleatório determina a ordem em que eles são enviados e, portanto, a ordem em que serão seguidos.
Volte ao início do loop principal e processe os próximos valores na pilha.