Надоело экспериментировать на крошечных домашних животных , лауреат Нобелевской премии Эрвин Шредингер решил найти ближайший лазер и вместо этого выстрелить в него. Потому что ... наука!
Описание
Вам дадут две точки, через которые проходит лазер, и размер лазерного луча, и вы должны определить, куда лазерный луч должен был уйти, мог бы уйти и не мог бы уйти.
Лазерный луч может быть горизонтальным, вертикальным или диагональным. Для лазерного луча размера 1 они выглядят следующим образом:
# #
# #
##### # #
# #
# #
Диагональный лазерный луч также можно перевернуть. Лазерные лучи размера 2 выглядят так:
### ##
##### ### ###
##### ### ###
##### ### ###
### ##
В общем, чтобы получить лазерный луч размера (n), просто возьмите лазерный луч размера (n-1) и добавьте лазерный луч размера (1) с обеих сторон. В качестве последнего примера, здесь представлены все возможные лазерные лучи размером 3, показанные на одной и той же «доске»:
###.....#####.....##
####....#####....###
#####...#####...####
.#####..#####..#####
..#####.#####.#####.
...###############..
....#############...
.....###########....
####################
####################
####################
####################
####################
.....###########....
....#############...
...###############..
..#####.#####.#####.
.#####..#####..#####
#####...#####...####
####....#####....###
Эта «доска» всегда будет иметь размеры 20х20 (в символах).
вход
Ваша программа получит пять целых чисел в качестве входных данных. Они по порядку: x 1 , y 1 , x 2 , y 2 и размер лазерного луча. Они должны быть приняты именно в таком порядке. При желании вы можете использовать упорядоченные пары (x, y) в качестве массива, кортежа, списка или другого встроенного типа данных, в котором хранятся два значения.
Обе эти две точки, указанные в качестве входных данных, будут находиться внутри доски, и они гарантированно будут отличаться (т.е. две точки никогда не будут одинаковыми). Размер лазерного луча связан с 1 ≤ size < 20
. Всегда будет хотя бы один возможный лазерный луч, который проходит через обе точки.
Выход
Ваша программа должна вывести сетку 20x20 следующих символов:
#
если каждый возможный лазерный луч, который проходит через две точки, также проходит через эту точку..
если нет лазерного луча, который проходит через две точки и эту точку.?
если некоторые, но не все из возможных лазерных лучей проходят через эту точку.X
если это одна из двух исходных точек ввода (это переопределяет#
).
Контрольные примеры
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??????.....
..??????????????....
..???????????????...
..????????????????..
..?????????????????.
..??????????????????
..??????????????????
..????????.?????????
..????????..????????
..????????...???????
Тестовые случаи были сгенерированы с помощью следующего сценария Ruby, расположенного внутри фрагмента стека для сохранения вертикального пространства.
правила
Ваша программа должна быть в состоянии решить каждый из тестовых случаев менее чем за 30 секунд (на приемлемой машине). Это скорее проверка работоспособности, так как моя тестовая программа Ruby решила все тесты практически мгновенно.
Это код-гольф , поэтому выигрывает самое короткое решение.
2 * size - 1
. Размер 1 - 1 пиксель, размер 2 - 3 пикселя, размер 3 - 5 пикселей (см. Пример выше), размер 4 - 7 пикселей.