Eu costumava resolver quebra-cabeças de código como você, mas depois peguei uma flecha no joelho


18

Ser atingido no joelho com flechas parece ser a lesão de escolha no momento. Como tal, proponho o seguinte desafio de golfe.

Você tem um aventureiro que se parece com isso:

  O
 /|\
/ | \
  |
  |
 / \
/   \

Dado um arquivo de texto que contém um arco (desenhado como um }símbolo), um conjunto de paredes (desenhado como #símbolos) e um aventureiro, escreva o menor código que calcula o ângulo e a velocidade inicial em que você deve disparar uma flecha para acertar ele no joelho.

Suponha o seguinte:

  • Cada caractere no arquivo tem 0,5 x 0,5 metros.
  • A flecha é disparada do centro da }, ou seja, um deslocamento de0.25m, 0.25m
  • Gravidade é 10ms^-2
  • Seta pesa 0.1kg
  • Seta é um ponto, ou seja, colisões só ocorrem quando a coordenada da seta entra em um dos blocos.
  • A velocidade inicial máxima é 50m/s
  • O ângulo pode estar entre 0 (reto) e 180 (reto)
  • Bater em qualquer parte da perna do aventureiro é considerado um golpe no joelho.
  • Uma parede ( #personagem) ocupa um bloco inteiro de 0,5mx 0,5m.
  • A seta pode passar sobre o "topo" do arquivo, mas não há nada para impedir que a entrada comece com um limite de #caracteres.
  • Você não pode penetrar nas paredes com flechas.
  • Atingir qualquer outra parte do aventureiro não é permitido!
  • Você deve exibir um erro se for impossível acertá-lo no joelho.

Exemplo de entrada:

                                 #                        
}                                                     O   
                        #                            /|\  
                                                    / | \ 
            #                                         |   
                            #                         |   
                                                     / \  
                                                    /   \  

Sinta-se à vontade para fazer perguntas se precisar :)


1
A seta pode "passar" pela área representada pelo arquivo de texto?
JB

2
Quantas pessoas você conhece com mais de 3m de altura? : P
Peter Taylor

@JB - Sim, mas não há nada para interromper a entrada, começando com uma grande linha de #############...
Polynomial 12/12

2
@PeterTaylor - Todo mundo sabe que as pessoas nos jogos de RPG são desproporcionalmente enormes;) #
Polynomial Polinomial

2
O peso da flecha é redundante, com certeza?
Paulo R

Respostas:


11

Python, 599 caracteres

import os,sys
from math import*
I=os.read(0,999)
O=[]
h=v=0
for i in I:
 if'#'==i:O+=[(h,v,h+1,v+1),(h+1,v,h,v+1)]
 if'O'==i:O+=[(h,v+1,h-2,v+3)];T=(h,v+5,h-2,v+7)
 if'}'==i:e=h+.5;c=v+.5
 h+=1
 if'\n'==i:v+=1;h=0

def X(K,L):
 A,B,C=K;p=L[0];q=L[2]-p;r=L[1];s=L[3]-r;A,B,C=A*q*q,2*A*p*q+B*q-s,A*p*p+B*p+C-r;d=B*B-4*A*C
 return 0 if d<0 else any(0<x<1 for x in[(sqrt(d)-B)/2/A,(-sqrt(d)-B)/2/A])

R=range(1,999)
for v in R:
 for z in R:
  z*=pi/999;d=v*sin(z)/10;b=-v*cos(z)/10
  K=20/d/d,b/d-40*e/d/d,c+20*e*e/d/d-b*e/d
  if X(K,T)and not any(X(K,x)for x in O):print v/2,z;sys.exit(0)
print'ERROR'

A X(K,L)rotina utiliza uma parábola K=(a,b,c)representando y = ax ^ 2 + bx + c e um segmento de linha L=(a,b,c,d)representando o segmento entre (a, b) e (c, d) . Os obstáculos ( O) e o alvo ( T) são representados como segmentos de linha. Todas as distâncias são dimensionadas por um fator de 2.

A entrada de exemplo fornece a seguinte trajetória (por padrão, a velocidade mínima):

  --                             #          --            
--                                            -       O   
                        #                      -     /|\  
                                                -   / | \ 
            #                                    -    |   
                            #                     -   |   
                                                   - / \  
                                                    -   \  

você pode reverter Rpara obter o caminho da velocidade máxima:

                                 #                        
-------------                                         O   
             -----------#                            /|\  
                        --------                    / | \ 
            #                   -------               |   
                            #          -----          |   
                                            -----    / \  
                                                 -----  \  

Bom trabalho. A única reclamação é que o limite de tamanho de entrada é 999 bytes. Poderia facilmente ser mais, considerando o tamanho potencial desses desenhos ASCII. 9999 seria mais sensato, ao custo de apenas 1 caractere. (embora nesse ponto que você pode muito bem fazer 8**5para obter 64KB)
polinomial

Com certeza, você poderá salvar esse personagem atribuindo w=v+1e substituindo as 3 instâncias de v+1with w. Eu não codifico muito Python, portanto, posso estar errado.
Polynomial
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.