El objetivo de este desafío es escribir un programa o función que devuelva la menor cantidad de golpes necesarios para completar un curso determinado.
Entrada
- El diseño del curso se puede aprobar de la forma y el formato que prefiera. (leída desde la consola, aprobada como parámetro de entrada, leída desde un archivo o cualquier otro, cadena de varias líneas, matriz de cadenas, matriz de caracteres / bytes bidimensionales).
- La posición inicial de la pelota y el hoyo también se pueden pasar como entrada, no es necesario analizarla desde la entrada. En los casos de prueba, se incluyen en el curso para asegurarse de que no haya confusión sobre la posición real.
- Puede reasignar los caracteres de entrada a otra cosa, siempre que sean reconocibles como caracteres distintos (por ejemplo, caracteres ASCII imprimibles).
Salida
- El programa debe devolver la puntuación más baja posible (la menor cantidad de golpes necesarios para alcanzar el hoyo) para cualquier curso aprobado como entrada en un formato sensible (cadena, entero, flotante o un haiku que describe el resultado)
- Si el curso es imposible de superar, devuelva
-1
(o cualquier otro valor falso de su elección que no se devolvería para un curso imbatible).
Ejemplo:
En este ejemplo, las posiciones se anotan en base a 0, X / Y, de izquierda a derecha, de arriba hacia abajo, pero puede usar cualquier formato que desee ya que el resultado es completamente independiente del formato de todos modos.
Entrada:
###########
# ....#
# ...#
# ~ . #
# ~~~ . #
# ~~~~ #
# ~~~~ #
# ~~~~ o #
# ~~~~ #
#@~~~~ #
###########
Ball (Start-Position): 1/9
Hole (End-Position): 8/7
Salida:
8
Reglas y campos
El curso puede consistir en los siguientes campos:
'@'
Ball - El comienzo del curso.'o'
Hoyo - El objetivo del curso'#'
Muro : la bola se detendrá cuando golpee un muro'~'
Agua : debe evitarse'.'
Arena : la pelota se detendrá en la arena inmediatamente' '
Hielo : la bola continuará deslizándose hasta que golpee algo
Las reglas y restricciones básicas del juego:
- La pelota no puede moverse en diagonal, solo izquierda, derecha, arriba y abajo.
- La pelota no se detendrá frente al agua, solo frente a las paredes, en la arena y en el hoyo.
- Los disparos al agua son inválidos / imposibles
- La pelota se quedará en el hoyo, no se saltará sobre ella como si fuera hielo
- El curso es siempre rectangular.
- El curso siempre está bordeado por agua o paredes (no se requieren verificaciones de límites).
- Siempre hay exactamente una bola y un hoyo.
- No todos los cursos son posibles de superar.
- Puede haber múltiples rutas que den como resultado la misma puntuación (la más baja).
Lagunas y condición ganadora
- Las lagunas estándar están prohibidas
- Los programas deben terminar
- No puedes inventar reglas adicionales (golpear la pelota con tanta fuerza que salta sobre el agua, rebota en una pared, salta sobre campos de arena, curvas alrededor de las esquinas, etc.)
- Este es el código de golf , por lo que gana la solución con la menor cantidad de caracteres.
- Las soluciones deben poder manejar todos los casos de prueba proporcionados; si esto es imposible debido a restricciones del idioma utilizado, especifíquelo en su respuesta.
Casos de prueba
Curso # 1 (2 golpes)
####
# @#
#o~#
####
Curso # 2 (no posible)
#####
#@ #
# o #
# #
#####
Curso # 3 (3 golpes)
~~~
~@~
~.~
~ ~
~ ~
~ ~
~ ~
~.~
~o~
~~~
Curso # 4 (2 golpes)
#########
#~~~~~~~#
#~~~@~~~#
## . ##
#~ ~ ~ ~#
#~. o .~#
#~~~ ~~~#
#~~~~~~~#
#########
Curso # 5 (no posible)
~~~~~~~
~... ~
~.@.~.~
~... ~
~ ~ ~.~
~ . .o~
~~~~~~~
Respuestas:
JavaScript (ES6), 174 bytes
Toma entrada en la sintaxis de
curling curling([x, y])(a)
, donde x e y son las coordenadas indexadas a 0 de la posición inicial y a [] es una matriz de enteros, con0
= hielo,1
= pared,2
= arena,3
= agujero y4
= aguaDevuelve
0
si no hay solución.Pruébalo en línea!
Comentado
fuente
Python 3 , 273 bytes
Pruébalo en línea!
-41 bytes gracias a ovs
-1 byte gracias a Jonathan Frech
fuente
if k+1
serif-~k
?C #,
461418bytesEsta es solo una implementación de referencia no competitiva para (con suerte) revivir este desafío:
Golfed por Kevin Cruijssen
Sin golf
Pruébalo en línea
fuente
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). Además, ¿podría agregar un enlace TIO con código de prueba?