Escreva um programa ou função que, dada uma sequência não vazia de curvas à direita ou à esquerda, produza o comprimento do caminho mais curto de auto-prevenção em uma treliça 2D com essas curvas.
A entrada deve ser tomada como uma string, com cada caractere sendo R
ou L
para uma curva à direita ou à esquerda, respectivamente.
A saída deve ser um número inteiro, o comprimento do caminho mais curto com as curvas especificadas.
Este é um gode golf - o menor código vence.
Exemplo
Dada a entrada
LLLLLLLLLLRRL
O caminho mais curto é o seguinte (começando em #
):
+-+-+-+-+-+-+
| |
+ . + +-+-+ +
| | | | |
+ +-+ + #-+ +
| | | |
+ +-+ +-+-+-+
| |
+-+-+ . . . .
E o comprimento total deste caminho é 29
(contando os -
s e |
s, a não +
s).
Casos de teste
L 2
RRRRRRRRRR 23
LRRLRLRRRRL 15
LLRRLRRRRLLL 17
LLRRRRRRLLLL 21
LLLLRLLRRLLRL 16
LRLRLRLLRLRRL 14
RLLRRRRLLRRLRL 17
RRRRLLRLLLRLRL 20
LLLLRRLRLRRRLRL 19
RRRLRRRLRRLRLRL 20
code-golf
path-finding
caixa de papelão
fonte
fonte
Respostas:
Prolog, 284 bytes
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 eme
; o novo caminho é chamadoX
); depois, verifique o primeiro caminho válido (c
que chamav
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 dee
é consideravelmente menos eficiente do que precisa, através da correspondência de uma lista de várias maneiras; o mais eficientee([],[]).
seria seis bytes a mais (permitiriaS=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 comoX/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, podemosc
gerar todos os caminhos que vão a qualquer lugar e procurar o primeiro que seja consistente com a entrada: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).
fonte
Pitão , 36 bytes
Experimente online!
Isso é bem lento, mas funciona e é rápido o suficiente para entradas curtas.
O programa funciona representando direções como unidades complexas (1, -1, i, -i) e aponta como números complexos. Primeiro, converto a lista de voltas em uma lista de direções, depois giro toda a lista de n etapas, filtre as que tiverem pelo menos uma etapa entre cada volta e converto as direções em uma lista de pontos visitados e verifique se essa lista está correta. único. Eu incremento n em um loop até conseguir.
Mapeie para números complexos:
Como
L
possui o ponto de código ASCII 76 e oR
ponto de código ASCII 82, isso mapeiaL
parai
eR
para-i
.Mapa para direções absolutas:
Forme listas de n etapas com pelo menos 1 etapa entre cada turno
Deve haver mais um movimento do que há curvas na entrada. Cada movimento está em uma direção diferente, portanto, a codificação do comprimento da execução deve ser maior que a entrada.
Mapa para os pontos visitados:
Filtrar sem interseção automática:
Encontrar o primeiro
T
onde isso for bem-sucedido:f
.fonte