Introducción
La arena es una llanura salpicada de rascacielos, que tus enemigos usan para cubrirse. Tú y tus enemigos se disparan con láser. Todos ustedes llevan mochilas propulsoras, permitiendo el vuelo.
¿A qué enemigos puedes golpear con tu láser y cuáles se esconden?
Problema
Primero, el tamaño de una arena está dado por un número entero n
en una sola línea. Las siguientes n
líneas contienen n
enteros por línea separados por un espacio. Cada número entero representa la altura del edificio en esa ubicación. Cada edificio es un sólido rectangular, 1 unidad por 1 unidad por unidades de altura.
A continuación, su ubicación se da en una sola línea como tres números de punto flotante x
, y
, z
.
Finalmente, el número de enemigos viene dado por un número entero m
en una sola línea. Las siguientes m
líneas contienen tres números de coma flotante por línea separados por un espacio. Estos representan el x
, y
y las z
coordenadas de un enemigo. El sistema de coordenadas se define de la siguiente manera:
x
se mide de izquierda a derecha en la entrada de la ciudady
se mide de arriba a abajoz
se mide desde cero
Para cada enemigo, si se puede trazar una línea sin obstrucciones hacia ese enemigo, genera un número entero positivo . De lo contrario, genera un entero negativo . Salidas separadas con una nueva línea.
Entrada de muestra
Los comentarios, indicados con '#', están presentes para ayudarlo a ver rápidamente qué hace cada línea. No estarán presentes en la entrada real.
5 # Size of the map
0 0 0 0 0 # Buildings
0 0 0 0 0 # Buildings
4 4 4 4 4 # Buildings
0 0 0 0 0 # Buildings
0 0 0 0 0 # Buildings
2.5 0.0 4.0 # Your location
3 # Number of enemies
2.5 5.0 0.1 # Enemy location
2.5 5.0 5.0 # Enemy location
0.0 2.7 4.5 # Enemy location
Salida de muestra
Para la entrada de muestra anterior, mostramos lo siguiente:
-1
1
1
Supuestos
- 0
n
<<100 - 0
m
<<100 - 0 <=
x
<=n
- 0 <=
y
<=n
- 0 <=
z
<n
- Los jugadores no estarán ubicados dentro o dentro de una esquina, borde o costado de un edificio
- Su línea de visión hacia un enemigo nunca será tangente a la esquina, el borde o el costado de un edificio.
- Un jugador no es una obstrucción.
Respuestas:
Perl,
301 296282Edición 2: En realidad, competencia o no, no hay razón para no jugar un poco más. Pruébelo en línea .
Editar: Par de paréntesis desaparecidos, expresiones regulares más simples para verificar si hay un número entero distinto de cero.
Con nuevas líneas y sangría para facilitar la lectura:
Requiere
5.14
debido al argumento escalar (referencia de matriz) apop
.fuente
PE
conecta dos puntos en el espacio tridimensional, "Jugador" (X1Y1Z1) y "Enemigo" (X2Y2Z2). Su proyección en el(XY)
plano cruza algunas de las líneas de la cuadrícula, es decir, enterosx = const
oy = const
comoX1 < x < X2
oY1 < y < Y2
(suponiendo aquí queX1 < X2
, por ejemplo , pero no es importante). Las coordenadasx y
de estas intersecciones se pueden encontrar fácilmente y, por lo tanto, también lasz
coordenadas de un punto enPE
línea.x y
coordenada, conocemos la alturah
del edificio (más bien, la altura máxima de hasta 4 edificios que comparten elx y
punto). Se puede disparar al enemigo si (y solo si)h < z
para todos los "puntos de intersección" mencionados anteriormente. La implementación es una aritmética básica, así como varios trucos con Perl para jugar al golf. Descifrar los detalles de cómo lo hice hace un mes llevará algún tiempo ahora :-).@a
matriz engrep
expresión deberían aparecer en el orden0,3,0,4,1,5,2
lugar de3,0,3,1,4,2,5
- lo siento.Python 2.7 -
429420308308 caracteresPensé en este desafío más como un problema matemático que como un problema de código de golf, así que no seas demasiado duro conmigo si pierdo algunas optimizaciones obvias. De todos modos, aquí está el código:
Esto debería funcionar para casos extremos y de esquina (juego de palabras involuntario) y es bastante sólido. Ouput para el ejemplo proporcionado:
Y aquí hay una explicación "corta":
Supongo que esto está lleno de defectos. Por cierto, guardé caracteres al anidar (el primer nivel es un espacio, el segundo una pestaña, luego una pestaña y un espacio ...). Espero que después de todo esta respuesta pueda señalar la forma de hacerlo.
fuente
print 1-2*...
lugar deprint.5-...
) Así que no es una gran diferencia, supongoC - 2468
No se juega golf en absoluto, pero espero que sea un punto de partida para implementaciones más interesantes. La implementación de
intersect
se basa en gran medida de Adrian Boeing . Su pseudocódigo estaba incompleto, pero su explicación de las matemáticas era invaluable. La idea básica es tomar una línea desde el jugador hasta el objetivo y recortarla contra todas las paredes de cada edificio, actualizando la longitud de cada pared. La longitud restante es la porción dentro del edificio, por lo que si es cero, no hubo intersección.fuente