Ah não! Nemo, nosso pequeno peixe-palhaço está perdido neste oceano ASCII e seu pai Marlin está tentando encontrá-lo.
Sua tarefa é levar Marlin a Nemo com segurança. Mas cuidado, temos um frenesi de Bruce à solta, então é melhor evitá-lo a todo custo!
Detalhes
Você recebe uma grade oceânica ASCII retangular contendo apenas alfabetos em minúsculas a-z
. Este oceano terá nemo
, marlin
e bruce
dentro dele, na forma de um poliomaino contínuo, sempre começando da célula superior na primeira coluna do poliomaino. Assim, por exemplo, de todos os tetrominos possíveis, os válidos estão listados no trecho abaixo
Mas formulários como estes são inválidos e não estarão presentes na entrada:
omen
ne
mo
nem
o
o
m
en
nem
o
n
eo
m
Por fim, sua tarefa é encontrar um caminho do marlin
bloco de poliomino para o nemo
bloco de poliomino, certificando-se de que qualquer célula em seu caminho não seja adjacente ao bruce
bloco de poliomino. Sua saída deve substituir todos os alfabetos que não fazem parte do marlin
bloco, nemo
bloco e o caminho que os conecta com um caractere do intervalo ASCII imprimível (incluindo espaço) que não seja minúsculo a-z
.
Exemplo
Se o oceano de entrada for o seguinte:
oxknvvolacycxg
xmliuzsxpdzkpw
warukpyhcldlgu
tucpzymenmoyhk
qnvtbsalyfrlyn
cicjrucejhiaeb
bzqfnfwqtrzqbp
ywvjanjdtzcoyh
xsjeyemojwtyhi
mcefvugvqabqtt
oihfadeihvzakk
pjuicqduvnwscv
(com os 3 poliomanos sendo:
...n..........
.mli..........
.ar...........
..............
....b.........
....ruce......
..............
.....n........
.....emo......
..............
..............
..............
)
Em seguida, uma solução válida pode se parecer com:
...n..........
.mli..........
.ar...........
.u............
.n............
.i............
.z............
.wvjan........
.....emo......
..............
..............
..............
O snippet abaixo contém mais alguns exemplos:
Notas
- A grade sempre será um retângulo perfeito e conterá apenas um bloco de poliomino de
nemo
,marlin
ebruce
. - Seu caminho não deve passar por
bruce
nenhuma das quatro células adjacentes (para cima, para baixo, esquerda e direita) de nenhuma célula dobruce
bloco. - É sempre garantido que haverá pelo menos um caminho válido de
marlin
paranemo
. - Não há necessidade de um caminho mais curto aqui, então enlouqueça!
- Mesmo que você não precise encontrar o caminho mais curto, qualquer célula do caminho (caminho que não inclua marlin ou nemo) não pode ser adjacente a mais de duas outras células no caminho.
- O caminho não deve passar pelos
marlin
ounemo
azulejos, pois confundiria os peixinhos na escolha de uma direção. - Como de costume, você pode escrever um programa ou função, recebendo entrada via STDIN (ou equivalente mais próximo), argumento da linha de comando ou parâmetro de função e produzindo saída via STDOUT (ou equivalente mais próximo), valor de retorno ou parâmetro de função (saída).
- Se a entrada de várias linhas não for possível, você poderá assumir que a grade é unida pelo
|
caractere em vez de\n
. Você também pode receber a entrada como uma matriz de linhas da grade.
Este é o código golf, pelo que ganha a menor entrada em bytes.
fonte
k
acima dol
marlin fosse visível? (fazendo com que o caminho desde o terminal N em Marlin para nemo)Respostas:
Matlab 560
560 bytes ao remover todos os espaços desnecessários, todos os pontos e vírgulas e todos os comentários. Poderia jogar muito mais, mas estou cansado agora (talvez amanhã ...) Boa noite a todos.
PS: Eu assumi que o caminho deve ter uma conexão de 4 vizinhanças ('+').
Função de chamada: (novas linhas não são necessárias)
Resultado:
Como funciona
Extraindo nomes
A primeira parte é extrair os nomes
nemo
, por exemplo , o que é feito pela funçãoq()
. A função primeiro marca tudo como 0, depois a primeira letra do nome como1
, depois a segunda letra como2
se houvesse um1
na vizinhança, depois a terceira e assim por diante. Depois disso, no caso denemo
haver apenas um4
. A partir disso, vamos para trás até encontrarmos1
novamente e, em seguida, excluímos todos os outros números que eram maiores que isso, de modo que obtemos uma boa máscara em que as letrasnemo
estão mascaradas. Fazemos isso para todos os três nomes e podemos prosseguir para encontrar um caminho.Encontrando o caminho
Começamos nas posições de Marlins e enviamos uma onda de choque através da 'imagem' do buraco, passo a passo. Em cada etapa, aumentamos o contador de distâncias e marcamos os 'pixels' sob a frente da onda com a distância atual. (Como geralmente é feito com algoritmos de caminho mais curto.) Essa frente de onda obviamente fica bloqueada pela área de Bruce, portanto flui ao seu redor. Esta etapa é repetida até que um limite superior seja atingido. Esse limite superior (reconhecidamente muito flexível) agora é a circunferência da 'imagem' (os caminhos mais curtos serão bem mais curtos em qualquer caso). No caso de teste, é algo parecido com isto:
Agora comece com
nemo
pixels e diminua o contador de distâncias em cada etapa e adicione um vizinho com a próxima distância mais baixa (de acordo com o mapa de distância que calculamos anteriormente) ao nosso caminho.fonte
Python 2-658
Muito, muito ineficiente no tempo e na memória. A função para identificar os padrões é a função recursiva S, e a função para encontrar os caminhos é o C, que é basicamente uma implementação A * terrivelmente ineficiente.
Para testar, use este (muito ligeiramente) menos golfe (que calcula o caminho uma vez para cada bloco)
fonte