Harto de experimentar con pequeños animales domésticos , el ganador del premio Nobel Erwin Schrödinger ha decidido encontrar el láser más cercano y dispararlo a las cosas. Porque ... ¡ciencia!
Descripción
Se le darán dos puntos por los que pasa el láser y el tamaño de un rayo láser, y debe determinar a dónde debe haber ido el rayo láser, dónde podría haber ido y dónde no .
El rayo láser puede ser horizontal, vertical o diagonal. Para un rayo láser de tamaño 1, se ven así respectivamente:
# #
# #
##### # #
# #
# #
El rayo láser diagonal también se puede voltear. Los rayos láser de tamaño 2 se ven así:
### ##
##### ### ###
##### ### ###
##### ### ###
### ##
En general, para obtener un rayo láser de tamaño (n), simplemente tome el rayo láser de tamaño (n-1) y agregue un rayo láser de tamaño (1) en ambos lados. Como ejemplo final, aquí están todos los rayos láser posibles de tamaño 3, que se muestran en el mismo "tablero":
###.....#####.....##
####....#####....###
#####...#####...####
.#####..#####..#####
..#####.#####.#####.
...###############..
....#############...
.....###########....
####################
####################
####################
####################
####################
.....###########....
....#############...
...###############..
..#####.#####.#####.
.#####..#####..#####
#####...#####...####
####....#####....###
Este "tablero" siempre tendrá dimensiones de 20x20 (en caracteres).
Entrada
Su programa recibirá cinco enteros como entrada. Son, en orden, x 1 , y 1 , x 2 , y 2 , y el tamaño del rayo láser. Deben tomarse exactamente en ese orden. Si lo desea, puede tomar los pares ordenados (x, y) como una matriz, tupla, lista u otro tipo de datos incorporado que almacena dos valores.
Los dos puntos dados como entrada estarán dentro del tablero, y se garantiza que serán distintos (es decir, los dos puntos nunca serán los mismos). El tamaño del rayo láser está vinculado a 1 ≤ size < 20
. Siempre habrá al menos un posible rayo láser que atraviese ambos puntos.
Salida
Su programa debe generar una cuadrícula de 20x20 de los siguientes caracteres:
#
si cada posible rayo láser que pasa por los dos puntos también pasa por este punto..
si no hay un rayo láser que pase por los dos puntos y este punto.?
si algunos, pero no todos, los posibles rayos láser pasan por este punto.X
si este es uno de los dos puntos de entrada originales (esto anula el#
).
Casos de prueba
7, 7, 11, 3, 1
..............#.....
.............#......
............#.......
...........X........
..........#.........
.........#..........
........#...........
.......X............
......#.............
.....#..............
....#...............
...#................
..#.................
.#..................
#...................
....................
....................
....................
....................
....................
18, 18, 1, 1, 2
#??.................
?X??................
??#??...............
.??#??..............
..??#??.............
...??#??............
....??#??...........
.....??#??..........
......??#??.........
.......??#??........
........??#??.......
.........??#??......
..........??#??.....
...........??#??....
............??#??...
.............??#??..
..............??#??.
...............??#??
................??X?
.................??#
10, 10, 11, 10, 3
?????..????????..???
??????.????????.????
????????????????????
????????????????????
.???????????????????
..??????????????????
????????????????????
????????????????????
????????????????????
????????????????????
??????????XX????????
????????????????????
????????????????????
????????????????????
????????????????????
..??????????????????
.???????????????????
????????????????????
????????????????????
??????.????????.????
3, 3, 8, 10, 4
??????????..........
??????????..........
??????????..........
???X??????..........
???##?????..........
???###????..........
????###????.........
.????###????........
..????###????.......
..?????##?????......
..??????X??????.....
..??????????????....
..???????????????...
..????????????????..
..?????????????????.
..??????????????????
..??????????????????
..????????.?????????
..????????..????????
..????????...???????
Los casos de prueba se generaron con el siguiente script de Ruby, ubicado dentro de un Fragmento de pila para conservar el espacio vertical.
Reglas
Su programa debe poder resolver cada uno de los casos de prueba en menos de 30 segundos (en una máquina razonable). Esto es más una comprobación de cordura, ya que mi programa de prueba Ruby resolvió todos los casos de prueba casi instantáneamente.
Este es el código de golf , por lo que gana la solución más corta.
2 * size - 1
. El tamaño 1 es 1 píxel, el tamaño 2 es 3 píxeles, el tamaño 3 es 5 píxeles (ver ejemplo anterior), el tamaño 4 es 7 píxeles.