Bob el arquero!

13

Bob el arquero

      o         
    /( )\                                         This is Bob. 
     L L                                          Bob wants to be an archer.
#############

    .
   / \          <--- bow                          So he bought himself a
  (c -)->       <--- arrow                        nice longbow and is about
  ( )/          <--- highly focused Bob           shoot at a target.
  L L           
#############

___________________________________________________________________________________________
sky

                     Bob is a smart guy. He already knows what angle and
                     velocity his arrow has / will have. But only YOU know
                     the distance to the target, so Bob doesn't know if he
                     will hit or miss. This is where you have to help him.

     .                                                                                  +-+
    / \                                                                                 | |
   (c -)->                                                                              | |
   ( )/                                                                                 +++
   L L                                                                                   |
###########################################################################################

Tarea

Su tarea es representar una imagen artística ASCII de Bob golpeando o perdiendo el objetivo. Para el cálculo:

  • Su programa recibirá arrow_x,angle,velocity,distancecomo entrada separada por comas en el orden que desee.
  • Un carácter ASCII es igual 1m.
  • El primer carácter en la última línea tiene las coordenadas (0,0), por lo que el terreno (representado como #) está en y=0.
  • Bob siempre se para en el suelo, su yposición no cambia.
  • No hay max y. Sin embargo, el vértice de las flechas debe caber dentro de la imagen renderizada.
  • Toda la entrada se proporciona como un entero decimal.
  • Durante el cálculo, suponga que la flecha es un punto.
  • El origen de la flecha es la punta >de flecha de un Bob disparador (ver arriba). Entonces dado arrow_x, tienes que calcular arrow_y. El pie izquierdo de Bob en la salida tiene que coincidir con el xcoord. del tiroteo Bob.
  • distancees la xcoordenada del pie del objetivo . (es decir, el centro del objetivo).
  • Todas las medidas se suministran en metros y grados respectivamente.
  • Atención: ¡ el disparo Bob nunca se procesa, solo se usa para cálculos! Vea a continuación los dos Bobs de salida válidos
  • Golpear el objetivo significa que el camino de las flechas cruza cualquiera de las dos paredes del objetivo más a la izquierda ( |) (Eso es (distancia-1,3) o (distancia-1,4). Si en algún momento la flecha está dentro de esos 2m², coloque la X en lugar del muro que golpea. El objetivo siempre tiene la misma altura y solo su posición x puede cambiar). Los golpes de esquina o una flecha que cae del cielo sobre el objetivo no cuentan.
  • Se aplica tierra estándar g (9.81 m / s ^ 2).
  • distance+1 es el final del campo, después de eso, todo es un error y no se debe mostrar ninguna flecha.
  • Si la flecha alcanza el objetivo de cualquier otra manera ( distance-1etc.), no se debe representar ninguna flecha.

Perder

Este es un ejemplo de la falta de Bob (la flecha entra al suelo a 34 m, el ángulo es de 45 °, el tiempo en el aire es de 10 s, la velocidad es de ~ 50, pero hay muchas más entradas posibles para causar esta salida. Simplemente muestre que su programa usa fórmulas habituales para calcular resultados físicamente "precisos"):

                                                                                        +-+
                                                                                        | |
  c\                                                                                    | |
/( )                              v                                                     +++
 L L                              |                                                      |
###########################################################################################

Golpear

Este es un ejemplo de representación de la puntuación de Bob (la flecha entra en el objetivo (= cruza su camino)):

                                                                                        +-+
                                                                                     >--X |
 \c/                                                                                    | |
 ( )                                                                                    +++
 L L                                                                                     |
###########################################################################################

Ejemplo

  • arrow_xes 7. arrow_yes siempre 3.
  • anglees 30°o 0.523598776radianes.
  • velocityes 13m/s.
  • distance es 20.

Entonces, para alcanzar el objetivo, la flecha tiene que cruzar (19,3)o (19,4). Todo lo demás será una señorita. En este caso, la flecha entrará al suelo (los medios yestarán <1.0) 12.9358m = ~13mdespués 1.149s.


Límites y puntuación

  • Este es el , por lo que gana la solución más corta. No hay bonos
  • Su programa (como no funciona ) debe aceptar entradas en el formato descrito anteriormente, no se permiten entradas adicionales.
  • No tiene que manejar entradas incorrectas / sin sentido / imposibles.
  • Imprima a la salida razonable más corta para su idioma (estándar, archivo, ...).
  • No me importa arrastrar espacios en blanco.
  • Consejo: el ancho de salida es distance+2. La altura es apex+1.
mınxomaτ
fuente
55
¿Puedes agregar la entrada utilizada para generar la salida dada por favor?
Azul
3
¿Por qué no puedes publicar una función?
Loovjo
2
@Mhmd Tienes que dibujarlo, como se indica en la tarea. The left foot of Bob in the output has to match the x coord. of the shooting Bob.ySee below for the two valid output-Bobs
mınxomaτ
1
Y para aquellos de nosotros que no hemos llevado la física más allá de GCSE (¿o simplemente nos hemos olvidado?)
Azul
2
@muddyfish Solo busca en Google las ecuaciones de trayectoria.
mınxomaτ

Respuestas:

2

Rubí, 482

include Math
def f s,e,l
[s,' '*(l-s.size-e.size),e].join
end
alias p puts
X,o,V,d=$*[0].split(?,).map &:to_i
o*=PI/180
L=X+d
B='| |'
S=''
G=' L L'
p f S,'+-+',L
d.times{|x|y=3+x*tan(o)-(9.81*x**2)/(2*(V*cos(o))**2)
if x==d-1&&(3..5)===y
s='>--X |'
m=(3..4)===y
p f S,m ?B: s,L
p f ' \c/',m ?s: B,L
p f ' ( )',?+*3,L
p f G,'| ',L
elsif y<=1 || x==d-1
p f S,B,L
p f '  c\\',B,L
print f '/( )', y<1? 'V':' ',x
p f S,?+*3,L-x
print f G, y<1? '|':' ',x
p f S,'| ',L-x
break
end}
p ?#*L

Sin golf

include Math
def fill s,e,l
   [s,' '*(l-s.size-e.size),e].join
end
arrow_x,angle,velocity,distance = $*[0].split(',').map(&:to_i)
angle *= PI/180
length=arrow_x+distance
loss = '| |'
puts fill '','+-+',length
distance.times { |x|
  y = 3 + x*tan(angle) - (9.81*x**2)/(2*(velocity*cos(angle))**2)
  if x == distance-1 && (3..5)===y
    puts fill '',(3..4)===y ? '| |':'>--X |',length
    puts fill ' \c/',(3..4)===y ? '>--X |':'| |',length
    puts fill ' ( )','+++',length
    puts fill ' L L','| ',length
  elsif y<=1 || x==distance-1
    puts fill '',loss,length
    puts fill '  c\\',loss,length
    print fill '/( )', y<1? 'v': ' ', x
    puts fill '','+++',length-x
    print fill ' L L', y<1? '|': ' ', x
    puts fill '',' | ',length-x
    break
  end
}
puts ?#*length

Método

La ecuación principal aquí es:

ecuación de trayectoria

Nota: imagen tomada de https://en.wikipedia.org/wiki/Trajectory_of_a_projectile

Dónde,

y0: initial height (of arrow)  
Ө: the angle  
x: the position of the arrow  
g: gravity (9.81)
v: velocity

Lo que estoy haciendo es recorrer los números del 0 al (distancia -1) y en cada iteración verificar si la flecha toca el suelo (o el objetivo)

Mhmd
fuente