Solía ​​resolver rompecabezas de golf de código como tú, pero luego tomé una flecha en la rodilla

18

Ser golpeado en la rodilla con flechas parece ser la lesión de elección en este momento. Como tal, propongo el siguiente desafío de golf.

Tienes un aventurero que se ve así:

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

Dado un archivo de texto que contiene un arco (dibujado como }símbolo), un conjunto de paredes (dibujado como #símbolos) y un aventurero, escriba el código más pequeño que calcule el ángulo y la velocidad inicial a la que debe disparar una flecha para golpear él en la rodilla.

Suponga lo siguiente:

  • Cada caracter en el archivo es 0.5 x 0.5 metros.
  • La flecha se dispara desde el centro del }, es decir, un desplazamiento de0.25m, 0.25m
  • La gravedad es 10ms^-2
  • La flecha pesa 0.1kg
  • La flecha es un punto, es decir, las colisiones solo ocurren cuando la coordenada de la flecha entra en uno de los bloques.
  • La velocidad inicial máxima es 50m/s
  • El ángulo puede estar entre 0 (hacia arriba) y 180 (hacia abajo)
  • Golpear cualquier parte de la pierna del aventurero se considera un golpe en la rodilla.
  • Un muro ( #personaje) ocupa un bloque completo de 0.5mx 0.5m.
  • La flecha puede viajar sobre la "parte superior" del archivo, pero no hay nada que impida que la entrada comience con un límite máximo de #caracteres.
  • No puedes penetrar paredes con flechas.
  • ¡Golpear cualquier otra parte del aventurero no está permitido!
  • Debería mostrar un error si es imposible golpearlo en la rodilla.

Entrada de ejemplo:

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

No dude en hacer preguntas si necesita :)

Polinomio
fuente
1
¿Puede la flecha viajar "sobre" el área representada por el archivo de texto?
JB
2
¿Cuántas personas conoces que miden más de 3 m? : P
Peter Taylor
@JB - Sí, pero no hay nada que detenga la entrada comenzando con una gran línea de #############...
Polynomial
2
@PeterTaylor: todo el mundo sabe que las personas en los juegos de rol son desproporcionadamente grandes;)
Polynomial
2
El peso de la flecha es redundante, ¿verdad?
Paul R

Respuestas:

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'

La X(K,L)rutina toma una parábola que K=(a,b,c)representa y = ax ^ 2 + bx + c y un segmento de línea que L=(a,b,c,d)representa el segmento entre (a, b) y (c, d) . Ambos obstáculos ( O) y el objetivo ( T) se representan como segmentos de línea. Todas las distancias se escalan por un factor de 2.

La entrada de ejemplo proporciona la siguiente trayectoria (por defecto, la velocidad mínima):

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

puede invertir Rpara obtener la ruta de velocidad máxima:

                                 #                        
-------------                                         O   
             -----------#                            /|\  
                        --------                    / | \ 
            #                   -------               |   
                            #          -----          |   
                                            -----    / \  
                                                 -----  \  
Keith Randall
fuente
Buen trabajo. La única queja es que el límite de tamaño de entrada es de 999 bytes. Fácilmente podría ser más, considerando el tamaño potencial de estos dibujos ASCII. 9999 sería más sensato, a costa de solo 1 personaje. (aunque en ese momento también podrías 8**5obtener 64kB)
Polynomial
Estoy bastante seguro de que podría guardar ese personaje asignando w=v+1y reemplazando las 3 instancias de v+1con w. Sin embargo, no codifico mucho Python, así que puedo estar equivocado.
Polinómico