Farto de experimentar minúsculos animais domésticos , o premiado com o Nobel Erwin Schrödinger decidiu encontrar o laser mais próximo e atirar nele. Porque ... ciência!
Descrição
Você receberá dois pontos pelos quais o laser passa e o tamanho de um raio laser, além de determinar para onde o raio laser deve ter ido, poderia ter ido e não poderia ter ido.
O raio laser pode ser horizontal, vertical ou diagonal. Para um raio laser tamanho 1, eles se parecem com isso, respectivamente:
# #
# #
##### # #
# #
# #
O raio laser diagonal também pode ser invertido. Os raios laser tamanho 2 são assim:
### ##
##### ### ###
##### ### ###
##### ### ###
### ##
Em geral, para obter um raio laser de tamanho (n), basta pegar o raio laser de tamanho (n-1) e adicionar um raio laser de tamanho (1) nos dois lados. Como exemplo final, aqui estão todos os raios laser possíveis do tamanho 3, mostrados na mesma "placa":
###.....#####.....##
####....#####....###
#####...#####...####
.#####..#####..#####
..#####.#####.#####.
...###############..
....#############...
.....###########....
####################
####################
####################
####################
####################
.....###########....
....#############...
...###############..
..#####.#####.#####.
.#####..#####..#####
#####...#####...####
####....#####....###
Este "quadro" sempre terá dimensões de 20x20 (em caracteres).
Entrada
Seu programa receberá cinco números inteiros como entrada. Eles são, em ordem, x 1 , y 1 , x 2 , y 2 e o tamanho do feixe de laser. Eles devem ser tomados exatamente nessa ordem. Se desejar, você pode usar os pares ordenados (x, y) como uma matriz, tupla, lista ou outro tipo de dados interno que armazena dois valores.
Ambos os dois pontos dados como entrada estarão dentro do quadro e são garantidos para serem distintos (ou seja, os dois pontos nunca serão os mesmos). O tamanho do feixe de laser está vinculado 1 ≤ size < 20. Sempre haverá pelo menos um feixe de laser possível que passa pelos dois pontos.
Saída
Seu programa deve gerar uma grade 20x20 dos seguintes caracteres:
#se todo raio laser possível que passa pelos dois pontos também passa por esse ponto..se não houver raio laser que atravesse os dois pontos e este ponto.?se alguns, mas não todos, os possíveis raios laser passarem por esse ponto.Xse esse for um dos dois pontos de entrada originais (isso substitui o#).
Casos de teste
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??????.....
..??????????????....
..???????????????...
..????????????????..
..?????????????????.
..??????????????????
..??????????????????
..????????.?????????
..????????..????????
..????????...???????
Os casos de teste foram gerados com o seguinte script Ruby, localizado dentro de um snippet de pilha para economizar espaço vertical.
Regras
Seu programa deve ser capaz de resolver cada um dos casos de teste em menos de 30 segundos (em uma máquina razoável). Isso é mais uma verificação de integridade, pois meu programa Ruby de teste resolveu todos os casos de teste quase instantaneamente.
Isso é código-golfe , então a solução mais curta vence.
2 * size - 1. O tamanho 1 é 1 pixel, o tamanho 2 é 3 pixels, o tamanho 3 é 5 pixels (veja o exemplo acima), o tamanho 4 é 7 pixels.