O objetivo deste desafio é escrever um programa ou função que retorne a menor quantidade de greves necessárias para concluir um determinado curso.
Entrada
- O layout do curso pode ser aprovado da maneira e formato adequados que você preferir. (leitura do console, transmitida como parâmetro de entrada, leitura de um arquivo ou de qualquer outra sequência multilinha, matriz de strings, matriz bidimensional de caracteres / bytes).
- A posição inicial da bola e do buraco também podem ser passados como entrada, não precisa ser analisada a partir da entrada. Nos casos de teste, eles são incluídos no curso para garantir que não haja confusão sobre a posição real.
- Você pode remapear os caracteres de entrada para outra coisa, desde que ainda sejam reconhecíveis como caracteres distintos (por exemplo, caracteres ASCII imprimíveis).
Saída
- O programa deve retornar a menor pontuação possível (menor quantidade de golpes necessários para alcançar o buraco) para qualquer curso aprovado como entrada em um formato sensato (string, número inteiro, float ou haiku que descreve o resultado)
- Se for impossível vencer o percurso, retorne
-1
(ou qualquer outro valor falso de sua escolha que não seja retornado para um percurso vencível).
Exemplo:
Neste exemplo, as posições são notadas com base em 0, X / Y, da esquerda para a direita, de cima para baixo - mas você pode usar qualquer formato que desejar, pois o resultado é totalmente independente do formato.
Entrada:
###########
# ....#
# ...#
# ~ . #
# ~~~ . #
# ~~~~ #
# ~~~~ #
# ~~~~ o #
# ~~~~ #
#@~~~~ #
###########
Ball (Start-Position): 1/9
Hole (End-Position): 8/7
Saída:
8
Regras e campos
O curso pode consistir nos seguintes campos:
'@'
Ball - O início do curso'o'
Hole - O objetivo do percurso'#'
Parede - A bola pára quando bate em uma parede'~'
Água - deve ser evitado'.'
Areia - A bola para na areia imediatamente' '
Ice - Ball continuará a deslizar até atingir algo
As regras e restrições básicas do jogo:
- A bola não pode se mover na diagonal, apenas esquerda, direita, para cima e para baixo.
- A bola não para na frente da água, apenas na frente das paredes, na areia e no buraco.
- Tiros na água são inválidos / impossíveis
- A bola ficará no buraco, não a pulará como faria no gelo
- O percurso é sempre retangular.
- O percurso é sempre delimitado por água ou paredes (não são necessárias verificações de limites).
- Sempre há exatamente uma bola e um buraco.
- Nem todos os cursos são possíveis de vencer.
- Pode haver vários caminhos que resultam na mesma pontuação (mais baixa).
Lacunas e condições vencedoras
- As brechas padrão são proibidas
- Os programas devem terminar
- Você não pode criar regras adicionais (bater na bola com tanta força que pula sobre a água, bate em uma parede, pula sobre campos de areia, curvas nos cantos etc.)
- Isso é código-golfe , então a solução com a menor quantidade de caracteres vence.
- As soluções devem poder lidar com todos os casos de teste fornecidos, se isso for impossível devido a restrições do idioma usado, especifique isso em sua resposta.
Casos de teste
Curso # 1 (2 advertências)
####
# @#
#o~#
####
Curso # 2 (não é possível)
#####
#@ #
# o #
# #
#####
Curso # 3 (3 advertências)
~~~
~@~
~.~
~ ~
~ ~
~ ~
~ ~
~.~
~o~
~~~
Curso # 4 (2 advertências)
#########
#~~~~~~~#
#~~~@~~~#
## . ##
#~ ~ ~ ~#
#~. o .~#
#~~~ ~~~#
#~~~~~~~#
#########
Curso # 5 (não é possível)
~~~~~~~
~... ~
~.@.~.~
~... ~
~ ~ ~.~
~ . .o~
~~~~~~~
Respostas:
JavaScript (ES6), 174 bytes
Toma entrada em
enrolandosintaxe currying([x, y])(a)
, onde x e y são as coordenadas 0-indexados da posição de partida e uma [] representa uma matriz de números inteiros, com0
= gelo,1
= parede,2
= areia,3
= furo e4
= águaRetorna
0
se não houver solução.Experimente online!
Comentado
fonte
Python 3 , 273 bytes
Experimente online!
-41 bytes graças a ovs
-1 byte graças a Jonathan Frech
fonte
if k+1
serif-~k
?C #,
461418 bytesEsta é apenas uma implementação de referência não competitiva para (espero) reviver este desafio:
Golfed por Kevin Cruijssen
Ungolfed
Experimente online
fonte
int P(string[]C){int w=C[0].Length,i=0,l=c.Length;var c=string.Join("",C);var h=new int[l];for(var n=new List<int>();i<l;n.Add(i++))h[i]=c[i]!='@'?int.MaxValue:0;for(i=1;;i++){var t=n;n=new List<int>();foreach(int x in t){foreach(int d in new[]{-1,1,-w,w}){for(int j=x+d;c[j]==' ';j+=d);if(c[j]=='#'&h[j-d]>s){h[j-d]=s;n.Add(j-d);}if(c[j]=='.'&h[j]>s){h[j]=s;n.Add(j);}if(c[j]=='o')return s;}}if(n.Count<1)return -1;}}
(418 bytes). Além disso, você poderia adicionar um link TIO com código de teste?