O desafio
O menor código por contagem de caracteres para ajudar o Robot a encontrar o gatinho com o menor número de etapas possível.
Golfistas, este é um momento de crise - Kitten desapareceu e é trabalho do Robot encontrá-lo! O robô precisa alcançar o Kitten no caminho mais curto possível. No entanto, existem muitos obstáculos no caminho de Robot, e ele precisa que você programe uma solução para ele.
O Robot costumava ter um programa fazendo isso por ele, mas esse programa foi perdido e o Robot não tem backup :(.
O tempo de execução do robô não é o melhor, e o mínimo de caracteres que o robô precisa ler do código-fonte, o menor tempo gasto no processamento e isso significa que o Kitten será encontrado mais rapidamente!
A memória do robô contém um mapa da localização em que ele está atualmente, com a parte superior representando o norte, a parte inferior representando o sul, a direita representando o leste e a esquerda representando o oeste. O robô está sempre em uma sala retangular de tamanho desconhecido, cercada por paredes, representada por #
em seu mapa de radar. Áreas em que o robô pode entrar são representadas por um espaço .
O radar do robô também procura muitos obstáculos na sala e os marca em várias letras ASCII. O robô não pode atravessar esses obstáculos. O radar marcará Kitten como o caractere ASCII especial K
, enquanto a localização do robô é marcada com R
.
O sistema de navegação do robô funciona da seguinte maneira: ele pode entender uma dupla de direção e número de unidades de movimento para onde deve viajar - por exemplo, N 3
significa 'ir para o norte 3 unidades de movimento'. O mapa de radar do robô é feito de modo que uma unidade de movimento seja um caractere ASCII. O robô só pode ir em 4 direções e não pode viajar na diagonal.
Sua tarefa, valente protetor do Kitten, é ler o mapa do radar do Robot uma vez e emitir a menor quantidade de direções, com a menor distância de deslocamento da unidade de movimento. É garantido que o robô tenha pelo menos um caminho para o Kitten.
Para garantir que o Robot não perca tempo executando um programa com defeito que não ajudará o Robot a encontrar o Kitten, encorajo você, corajoso protetor do Kitten, a usar essa saída do programa anterior do Robot para garantir que não seja desperdiçado tempo em encontrar o Kitten!
Casos de teste
Input:
######################
# d 3 Kj #
# #
# R #
# q #
######################
Output:
E 13
N 2
Input:
######################
# d r 3 Kj #
# p p #
# T X #
# q s t #
# #
# R o d W #
# #
# g t U #
# #
######################
Output:
N 1
E 10
N 4
E 2
Input:
######################
# spdfmsdlwe9mw WEK3#
# we hi #
# rdf fsszr#
# sdfg gjkti #
# fc d g i #
# dfg sdd #
# g zfg #
# df df #
# xcf R#
######################
Output:
N 1
W 9
N 5
E 4
N 1
E 4
N 1
A contagem de códigos inclui entrada / saída (ou seja, programa completo).
fonte
Respostas:
C ++
1002899799charsNota requer o uso de C ++ 0x para eliminar o espaço entre>> nos modelos.
Ele encontra a rota com o número mínimo de curvas.
É
Dijkstra's Algorithm
para resolver o problema do caminho mais curto.Para distinguir entre várias rotas de tamanho igual, uma linha reta longa tem menos peso que várias linhas curtas (isso favorece rotas com menos curvas).
De uma forma mais legível:
fonte
Scala 2.8 (451 caracteres)
... mas não resolve laços em favor da menor quantidade de direções (embora encontre a menor quantidade de etapas).
Scala 2.8, 642 caracteres, resolve os vínculos corretamente;
Ele descobriu um caminho mais curto para o segundo exemplo que o fornecido no problema:
fonte
Python 2.6 (504 caracteres)
fonte
Python 2.6 (535 caracteres)
Descompacta para uma implementação A * severamente maltratada. Lê stdin. Procura soluções com distância total mínima. Rompe os laços preferindo um número mínimo de direções. Lista as mudanças para stdout. Encontra gatinhos.
Desembalado :
A fonte foi anti-golfe manualmente em alguns lugares para obter uma representação compactada menor. Por exemplo, um loop for sobre as direções da bússola foi desenrolado.
fonte
c ++ - 681 caracteres necessários
Ele primeiro substitui todos os obstáculos no mapa por em
#
s (e altera os valores deK
eR
, para deixar espaço no espaço para caracteres por caminhos muito longos. Depois, rabisca no mapa. Um processo iterativo marca todos os quadrados sucessivamente acessíveis até que é capaz de alcançar o gatinho de uma só vez. Depois disso, usa a mesma rotina de verificação de acessibilidade para encontrar uma sequência de posições que levam ao início em instruções mínimas. Essas instruções são carregadas em uma sequência por pré-pendência, para que imprima na ordem correta.Não pretendo jogar mais, pois não resolve adequadamente os laços e não pode ser facilmente adaptado para isso.
Falha em
produzindo
Versão mais ou menos legível:
fonte
Ruby - 539 caracteres
Isso pode melhorar bastante, mas funciona para as etapas mais curtas e para as direções.
fonte
Ruby - 648 caracteres
Outro que falha no teste de menor número de direções, pois não consigo pensar em nenhuma maneira fácil de incorporá-lo no A *.
fonte