Bob der Bogenschütze!

13

Bob der Bogenschütze

      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                                                                                   |
###########################################################################################

Aufgabe

Ihre Aufgabe ist es, ein ASCII-Kunstbild von Bob zu rendern, wie er das Ziel trifft oder verfehlt. Zur Berechnung:

  • Ihr Programm erhält eine arrow_x,angle,velocity,distancedurch Kommas getrennte Eingabe in beliebiger Reihenfolge.
  • Ein ASCII-Zeichen entspricht 1m.
  • Das erste Zeichen in der letzten Zeile hat die Koordinaten (0,0), so dass der Boden (gerendert als #) an ist y=0.
  • Bob steht immer am Boden, seine yPosition ändert sich nicht.
  • Es gibt keine max y. Die Spitze der Pfeile sollte jedoch in das gerenderte Bild passen.
  • Alle Eingaben erfolgen als Dezimalzahl.
  • Nehmen Sie während der Berechnung an, dass der Pfeil ein Punkt ist.
  • Der Pfeilursprung ist die Pfeilspitze >eines schießenden Bob (so). Also arrow_xmuss man rechnen arrow_y. Der linke Fuß von Bob in der Ausgabe muss mit der xKoordinate übereinstimmen . des Schießens Bob.
  • distanceist die xKoordinate des Zielfußes . (dh die Mitte des Ziels).
  • Alle Maße werden in Metern bzw. Grad angegeben.
  • Achtung: Der Shooter Bob wird nie gerendert, nur für Berechnungen verwendet! Siehe unten für die zwei gültigen Output-Bobs
  • |Wenn Sie auf das Ziel treffen, kreuzen die Pfeile eine der beiden linken Zielwände ( ) (Das ist entweder (Abstand-1,3) oder (Abstand-1,4). Wenn sich der Pfeil irgendwann innerhalb dieser 2 m² befindet, platzieren Sie ihn das X anstelle der Wand, auf die es trifft. Das Ziel ist immer gleich hoch und nur seine x-Position kann sich ändern.). Eckentreffer oder ein vom Himmel auf das Ziel fallender Pfeil zählen nicht.
  • Es gilt die Norm Erde g (9,81 m / s ^ 2).
  • distance+1 ist das Ende des Feldes, danach ist alles ein Fehlschuss und es darf kein Pfeil mehr gerendert werden.
  • Wenn der Pfeil das Ziel auf andere Weise trifft ( distance-1usw.), sollte kein Pfeil gerendert werden.

Fräulein

Dies ist ein Beispiel für eine fehlende Darstellung von Bob (Pfeil geht in 34 m Höhe in den Boden, Winkel ist 45 °, Zeit in Luft ist 10 s, Geschwindigkeit ist ~ 50 - aber es gibt viel mehr Eingabemöglichkeiten, um diese Ausgabe zu verursachen übliche Formeln zur Berechnung physikalisch "genauer" Ergebnisse.):

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

Schlagen

Dies ist ein Beispiel-Rendering der Bob-Wertung (Pfeil dringt in das Ziel ein (= kreuzt den Pfad)):

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

Beispiel

  • arrow_xist 7. arrow_yist immer 3.
  • angleist 30°oder 0.523598776Bogenmaß.
  • velocityist 13m/s.
  • distance ist 20.

Um das Ziel zu treffen, muss der Pfeil (19,3)oder kreuzen (19,4). Alles andere wird ein Fehlschlag sein. In diesem Fall wird geben Sie den Pfeil , um den Boden (Mittel ywird <1.0) an 12.9358m = ~13mnach 1.149s.


Limits & Scoring

  • Das ist , also gewinnt die kürzeste Lösung. Es gibt keine Boni.
  • Ihr Programm (wie in Funktion nicht ) muss Eingaben im oben beschriebenen Format akzeptieren, zusätzliche Eingaben sind nicht zulässig.
  • Sie müssen nicht mit falschen / sinnlosen / unmöglichen Eingaben umgehen.
  • Drucken Sie mit der kürzesten Ausgabe, die für Ihre Sprache zumutbar ist (Standard, Datei, ...).
  • Es ist mir egal, ob Leerzeichen nachgestellt werden.
  • Tipp: Die Ausgabebreite beträgt distance+2. Die Höhe ist apex+1.
mınxomaτ
quelle
5
Können Sie bitte die Eingabe hinzufügen, die zur Erzeugung der angegebenen Ausgabe verwendet wurde?
Blue
3
Warum kannst du keine Funktion posten?
Loovjo,
2
@Mhmd Du musst ihn zeichnen, wie in der Aufgabe angegeben. The left foot of Bob in the output has to match the x coord. of the shooting Bob.undSee below for the two valid output-Bobs
mınxomaτ
1
Und für diejenigen von uns, die die Physik nicht weiter als GCSE gebracht haben (oder nur vergessen haben?)
Blue
2
@muddyfish Google einfach nach den Flugbahngleichungen.
Mittwoch,

Antworten:

2

Ruby, 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

Ungolfed

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

Methode

Die Hauptgleichung lautet hier:

Flugbahngleichung

Hinweis: Bild aus https://en.wikipedia.org/wiki/Trajectory_of_a_projectile

Wo,

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

Was ich tue, ist, durch Zahlen von 0 bis (Abstand -1) zu schleifen und in jeder Iteration zu überprüfen, ob der Pfeil den Boden (oder das Ziel) trifft

Mhmd
quelle