Dado um quadro, escreva o programa ou função mais curto para exibir ou retornar quais personagens estão à vista do jogador. Um personagem está à vista se é possível traçar uma linha entre ele e o jogador, sem cruzar nenhum personagem que bloqueie a visão.
Entrada:
@
representa a posição do jogador. Haverá apenas um deles na entrada.- qualquer caractere que corresponda ao regex
[#A-Z]
bloqueia a visão. - qualquer personagem que corresponda
[ a-z]
permite visão. - não haverá caracteres inválidos
- você tem uma entrada retangular garantida
As linhas são definidas da seguinte maneira:
- definir vetor para ser uma magnitude e uma direção
- uma direção é uma de N, NE, E, SE, S, SW, W, NW
- uma magnitude é quantos caracteres nessa direção para contar
- deixe o vetor inicial ser chamado d 1 ; o segundo vetor será chamado d 2
- um de d 1 ou d 2 deve ter uma magnitude de
1
; o outro pode ter qualquer magnitude - A direção de d 1 deve estar adjacente à direção de d 2 (por exemplo: N e NE)
Uma linha é definida para ser todos os caracteres ao longo do caminho marcado aplicando d 1 , depois d 2 , d 1 , d 2 ....
Linha de amostra (dada pelos .
):
d 1 = (magnitude: 4, direção: E)
d 2 = (magnitude: 1, direção NE)
.....
.....
.....
@....
Resultado:
- cada caractere visível na posição correta
.
substitui o espaço. - Espaço para cada caractere não visível.
Entrada de amostra:
@
K
J
L
o
Saída correspondente:
@.........
....K.....
.J.....
..........
.. .L.....
.. . ....
... .. ...
... .. ..
... . .
.... ..
Entrada de amostra:
B###M# by
#Q # Zmpq
# # aaa
@ m #
# ##P#
# ####
# ####
#M ###
######
Saída correspondente:
.B #M
.# .. Z pq
.#.#.aaa..
@..m.#
#.##P#
.#
.#
M.
#
Entrada de amostra:
w
O l gg rT
QQL Ag #b
qqqqq XqQ
x V# f@aa
Y aaa
uU E l TaKK
e dd FF d opi
e d
Saída correspondente:
.......... .....
......... .....
O..l...gg..rT
...QQL......Ag..#b..
...qqqqq.........XqQ
#.f@aa......
Y........aaa.....
...uU..E..l.TaKK....
d..FF.d.op
.... .d. ...
Respostas:
GolfScript, 171 caracteres
A entrada deve ser fornecida no STDIN.
A saída para os exemplos dados acima é um pouco diferente. Eu verifiquei as respostas manualmente e acho que estão corretas.
Exemplo 1:
Exemplo 2:
Exemplo 3:
fonte
n+
o código.Ruby - 510 caracteres
Bastante um mamute; mas é a minha primeira tentativa de golfe.
A entrada é por arquivo especificado como argumento; Presumo que o arquivo de entrada seja composto por um bloco retangular de caracteres (portanto, espaços à direita incluídos) e que tenha uma nova linha à direita.
Esta versão faz uso extensivo
catch-throw
para sair de loops profundos; Possivelmente, posso melhorar as coisas com loops com verificação de limites.Código não ofuscado:
Editar
Ilmari Karonen observa na pergunta comenta que o algoritmo de visão fornecido não vê todos os quadrados, mesmo quando não há obstáculos. Aqui está uma demonstração disso, a (40,40) de distância do jogador.
fonte
XqQ
. Dito isto, sua resposta dada para 3 não corresponde à caixa de teste - ela tem pelo menos uma linha extra na parte superior e apenas um espaço entre aO
el
.