Introdução
Todo mundo sabe que a possibilidade de navegar com sucesso em um campo de asteróides é de aproximadamente 3.720 a 1. Mas, apesar do seu aviso, Han Solo ainda está disposto a tentar a sorte.
Temendo por sua vida artificial, você decide codificar, no dialeto peculiar do navio ( leia-se: sua linguagem preferida do Code Golf ), um programa de prevenção de asteróides que decidirá qual caminho seguir em um labirinto ASCII de campo de asteróides.
Entrada
O Millenium Falcon possui um programa de mapeamento de campo de asteróides, que fornece dados semelhantes a este:
| ##### ######### |
| ###### # ### # |
| # # # # #### # |
@ ## ####
|# # # ### ## |
|## ## #### # # |
|#### ##### # ## |
As linhas superiores ficam à esquerda do Falcon, as linhas inferiores à direita do Falcon e as colunas representam o que está na frente do navio.
- Cada
#
um é um obstáculo. - Cada espaço é um espaço vazio em que a nave pode voar.
- A entrada tem sempre 7 caracteres de altura. Este é o limite de largura do mapeamento de asteróides.
- A entrada tem sempre 32 caracteres (30 para o próprio campo e 2 para os limites de início e fim). Este é o limite de profundidade do mapeamento de asteróides. Barras verticais
|
marcam o início e o fim do mapeamento. @
é o falcão. Está sempre na linha do meio (quarta linha) e na primeira coluna da entrada.- O espaço deixado nas barras verticais na última coluna é o local em que o navio deve chegar. Está sempre na linha do meio (quarta linha) e na última coluna da entrada.
A entrada pode ser tomada como uma sequência de linhas múltiplas, uma matriz de seqüências de caracteres, a partir de STDIN ou parâmetros de função, ou lida de um arquivo.
Possíveis manobras
Você é perseguido por TIE-Fighters, portanto deve sempre seguir em frente. Existem, portanto, três maneiras pelas quais o navio pode voar em cada etapa:
-
frente/
Para a frente e vire à esquerda\
Avançar e virar à direita
Por exemplo, estes são caminhos válidos:
@---
--
/ \ /
@ -
-
/ \
/ \
@ \
Como você pode ver, sempre há exatamente um movimento por coluna. O Falcon é um pedaço de lixo, portanto não pode fazer curvas violentas. O que significa movimentos como /\
ou não\/
são permitidos . Deve haver pelo menos um avanço puro -
entre dois turnos opostos. Por outro lado, é possível girar em uma direção para várias etapas seguidas, como visto acima.
O Falcon trava se um movimento leva o navio a um ponto em que há um obstáculo. Por exemplo, esses movimentos levam a falhas:
@-#
@
\
#
#
/
@
Observe que isso não é um acidente:
@-#
\
-
Saída
Você deve gerar o mesmo campo de asteróide ASCII, com um caminho válido até o fim. O Falcon deve ser impresso no ponto final em vez do ponto inicial.
Por exemplo, uma saída válida para o exemplo de entrada fornecido anteriormente seria:
| ##### ######### |
| ###### #-------- ### # |
| # # #/ # ####\ # |
--------- ## \ #### ----@
|# # # ### \ ## / |
|## ## #### \ #/ # |
|#### ##### #-- ## |
Seu caminho só precisa não travar o falcão. Não precisa ser o caminho mais curto possível.
Você pode assumir que sempre haverá pelo menos um caminho possível para o fim.
Você pode enviar para STDOUT, em um arquivo ou equivalente, desde que o campo de asteróide seja impresso exatamente como está nesta postagem (por exemplo, a saída de uma lista de coordenadas para o caminho não é válida).
Casos de teste
Um campo normal de asteróides
| ##### ######### | | ###### # ### # | | # # # # #### # | @ ## #### |# # # ### ## | |## ## #### # # | |#### ##### # ## |
Saída possível
| ##### ######### | | ###### #-------- ### # | | # # #/ # ####\ # | --------- ## \ #### ----@ |# # # ### \ ## / | |## ## #### \ #/ # | |#### ##### #-- ## |
Campo de asteróide hiperregular
|# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # | @ # # # # # # # # # # # # # # |# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # |
Saída possível
|# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # | -# #-# #-# #-# #-# #-# #-# #--@ |#\#/#\#/#\#/#\#/#\#/#\#/#\#/# | | #-# #-# #-# #-# #-# #-# #-# #| |# # # # # # # # # # # # # # # |
Núcleo da estrela da morte
| # # # # | | # # # | | # # # # # | @ # # # # # | # # # # | | # # # # # | | # # # # |
Saída possível
| # # # -- # | | --- # # / #\ - | | / #\ # # / # \ /#\ | - # \ # #/ # - # ----@ | # \ # ---- # # | | # \#/ # # # | | # - # # # |
Trincheira da estrela da morte
|##############################| |##############################| |##############################| @ |##############################| |##############################| |##############################|
Saída
|##############################| |##############################| |##############################| ------------------------------@ |##############################| |##############################| |##############################|
Caverna de asteróides
|### ##########################| |## # ############### ## ######| |# ### ######## ### ## # #####| @ ###### ###### ### ## ### |######## ### ### ## #########| |########## # ### ## ##########| |########### #####|
Saída possível
|###-##########################| |##/#\############### ##-######| |#/###--######## ### ##/#\#####| -######\###### ### ##/###-----@ |########--### ### ##/#########| |##########\# ### ##/##########| |###########-------- #####|
Pontuação
O R2D2 está ocupado nadando em pântanos, então você terá que programar o controlador do Falcon sozinho, o que é tedioso. Portanto, o código mais curto vence .
-
no caminho a cada turno, que é definido como um movimento "para frente". Mas os movimentos reais são sempre duas diagonais à esquerda seguidas por duas diagonais à direita.Respostas:
JavaScript (ES6), 186
201Fragmento executável:
Esta função aceita uma única string com novas linhas. A função divide a string em uma matriz usando o
...
operador e obtém o índice de(x,y)
coordenadas por(33 * y) + x
.A função é executada recursivamente, testando diferentes movimentos possíveis para cada espaço. Quando encontra um obstáculo, retorna um valor falso e, quando atinge o espaço final da meta, retorna
true
. (No código golfado, issotrue
é criado por!console.log(...)
.)Observe que esse código não utiliza longas jogadas de giro à direita, mas as pontua com movimentos retos. Ou seja, ele faz a segunda opção abaixo, não a primeira:
Isso parece ser legal, já que
-
pode ocorrer antes ou depois de um turno, então por que não os dois ao mesmo tempo? Isso parece especialmente estranho no final, quando o movimento final é\
mas é exibido como@
:Meu truque desagradável favorito de golfe aqui é o abuso de argumento padrão
c=k=" "
. Os argumentos(i,l,c=" ")
diriam "use a string" "
parac
sef
não for fornecido um terceiro argumento". No entanto, ao fazerc=k=" "
isso, dizemos "sec
não for fornecido, armazene" "
na variável globalk
e, em seguida, armazene esse valorc
também". Como a recursão começa com apenas um argumento,k
é sempre inicializada na primeira chamada de função.Ligeiramente não-destruído:
fonte
" "
em uma variável) que diminuiu ainda mais minha pontuação.C (programa completo),
249247235 bytesEste é um programa completo que lê a entrada de um arquivo e gera o resultado no stdout. O nome do arquivo é passado como um parâmetro para o programa.
Ungolfed:
Saída:
fonte
-
seguido por um\
, mas o\
é encoberto pelo@
. (Meu programa faz a mesma coisa).Lisp comum, 303 bytes
Diverti-me muito com este desafio, é a primeira tarefa de codegolf que eu fiz. Basicamente, há uma função recursiva simples que tenta todos os movimentos viáveis até que a posição final seja atingida.
Golfed / Minified
Lê a entrada de um arquivo i no diretório de trabalho. Tenho certeza de que ainda há espaço para melhorias.
Código simples
Saída de amostra
fonte
ActionScript 3, 364 bytes
Eu divido isso em duas funções; uma para alterar a matriz em uma matriz de matrizes e uma recursiva para calcular a trajetória de vôo.
Versão não destruída em um programa com um campo de amostra de asteróide definido:
fonte