Introdução
A arena é uma planície pontilhada de arranha-céus, que seus inimigos usam para se esconder. Você e seus inimigos se atiram com lasers. Todos vocês carregam jet packs, permitindo o vôo.
Quais inimigos você pode acertar com seu laser e quais estão escondidos?
Problema
Primeiro, o tamanho de uma arena é dado por um número inteiro n
em uma única linha. As seguintes n
linhas contêm n
números inteiros por linha separados por um espaço. Cada número inteiro representa a altura do edifício nesse local. Cada edifício é um sólido retangular, 1 unidade por 1 unidade por unidades de altura.
Em seguida, a sua localização é dada em uma única linha de três números de ponto flutuante x
, y
, z
.
Finalmente, o número de inimigos é dado por um número inteiro m
em uma única linha. As m
linhas a seguir contêm três números de ponto flutuante por linha, separados por um espaço. Estes representam os x
, y
e z
coordenadas de um inimigo. O sistema de coordenadas é definido da seguinte maneira:
x
é medido da esquerda para a direita na entrada da cidadey
é medido de cima para baixoz
é medido a partir do zero
Para cada inimigo, se uma linha desobstruída puder ser traçada de você para esse inimigo, produza um número inteiro positivo . Caso contrário, imprima um número inteiro negativo . Separe as saídas com uma nova linha.
Entrada de amostra
Comentários, indicados por '#', estão presentes para ajudá-lo a ver rapidamente o que cada linha faz. Eles não estarão presentes na 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
Saída de amostra
Para a entrada de amostra acima, produzimos o seguinte:
-1
1
1
Suposições
- 0
n
<<100 - 0
m
<<100 - 0 <=
x
<=n
- 0 <=
y
<=n
- 0 <=
z
<n
- Os jogadores não estarão localizados dentro ou dentro de um canto, borda ou lateral de um edifício
- Sua linha de visão para um inimigo nunca será tangente ao canto, borda ou lateral de um edifício
- Um jogador não é uma obstrução
Respostas:
Perl,
301 296282Edit 2: Na verdade, competição ou não, não há razão para não jogar um pouco mais. Teste online .
Edit: Parênteses parados, regex mais simples para verificar se há um número inteiro diferente de zero.
Com novas linhas e recuo para facilitar a leitura:
Requer
5.14
por causa do argumento escalar (referência de matriz) parapop
.fonte
PE
conecta dois pontos no espaço 3D, "Player" (X1Y1Z1) e "Inimigo" (X2Y2Z2). Sua projeção no(XY)
plano cruza algumas das linhas de grade, isto é, números inteirosx = const
ouy = const
tais comoX1 < x < X2
orY1 < y < Y2
(assumindo aqui queX1 < X2
, por exemplo , mas não é importante). As coordenadasx y
dessas interseções podem ser facilmente encontradas e, portanto,z
coordenadas de um ponto naPE
linha também.x y
coordenada, sabemos a alturah
do edifício (em vez disso, a altura máxima de até 4 edifícios que compartilhamx y
pontos). O inimigo pode ser morto se (e somente se)h < z
para todos os "pontos de interseção" mencionados acima. A implementação é uma aritmética básica, além de vários truques com o Perl para fins de golfe. Decifrar os detalhes de como eu fiz isso há um mês agora levará algum tempo :-).@a
matriz nagrep
expressão devem aparecer na ordem em0,3,0,4,1,5,2
vez de3,0,3,1,4,2,5
- desculpe.Python 2.7 -
429420308308 caracteresPensei nesse desafio mais como um problema de matemática do que um problema de golfe de código, portanto, não seja muito duro comigo se eu perder algumas otimizações óbvias. De qualquer forma, aqui está o código:
Isso deve funcionar para casos de borda e canto (trocadilhos não intencionais) e é bastante sólido. Ouput para o exemplo fornecido:
E aqui está uma explicação "curta":
Eu acho que isso é cheio de falhas. Btw salvei caracteres no aninhamento (o primeiro nível é um espaço, a segunda guia, depois uma guia e um espaço ...). Espero que depois de toda essa resposta possa apontar o caminho para fazê-lo.
fonte
print 1-2*...
em vez deprint.5-...
) por isso não é tão grande de uma diferença que eu achoC - 2468
Não é um jogador de golfe, mas espero que seja um ponto de partida para implementações mais interessantes. A implementação de
intersect
é fortemente baseada em Adrian Boeing . Seu pseudo-código estava incompleto, mas sua explicação sobre a matemática era inestimável. A idéia básica é que você pegue uma linha do jogador até o alvo e prenda-a contra todas as paredes de cada prédio, atualizando o comprimento de cada parede. O comprimento restante é a parte dentro do edifício, portanto, se for zero, não haverá interseção.fonte