밥 보먼!


13

밥 보먼

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

직무

당신의 임무는 목표물 타격 또는 누락 밥의 ASCII 예술 사진을 렌더링하는 것입니다. 계산의 경우 :

  • 프로그램은 arrow_x,angle,velocity,distance원하는 순서대로 쉼표로 구분 된 입력으로 수신 됩니다.
  • 하나의 ASCII 문자는 1m입니다.
  • 마지막 줄의 첫 번째 문자는 좌표 (0,0)를 가지므로지면 (으로 렌더링 #)은에 y=0있습니다.
  • 밥은 항상 땅에 서 있고 그의 y위치는 변하지 않습니다.
  • 최대 값이 없습니다 y. 그러나 화살표 정점은 렌더링 된 그림에 맞아야합니다.
  • 모든 입력은 십진 정수로 제공됩니다.
  • 계산 중에 화살표가 점이라고 가정합니다.
  • 화살표 원점은 >슈팅 밥 의 화살표 머리 입니다 (위 참조). 따라서 arrow_x계산해야합니다 arrow_y. 출력에서 Bob의 왼쪽 발은 x좌표 와 일치해야합니다 . 총격 사건 밥의.
  • distance(가)이다 x대상의 좌표 . (예 : 대상의 중간).
  • 모든 측정은 각각 미터와도 단위로 제공됩니다.
  • 주의 : 촬영 Bob은 절대 렌더링되지 않으며 계산에만 사용됩니다! 두 개의 유효한 출력 보드에 대해서는 아래를 참조하십시오
  • 표적을 명중한다는 것은 화살 경로가 가장 왼쪽에있는 두 표적 벽 중 하나를 가로 지르는 것을 의미합니다 ( |) (이것은 (거리 -1,3) 또는 (거리 1,4)입니다. 벽에 부딪히지 않고 X. 목표는 항상 같은 높이이며 x 위치 만 바뀔 수 있습니다.) 하늘에서 대상으로 떨어지는 코너 타격이나 화살은 포함되지 않습니다.
  • 표준 접지 g가 적용됩니다 (9.81m / s ^ 2).
  • distance+1 필드의 끝입니다. 그 후 모든 것이 누락되어 화살표를 렌더링해서는 안됩니다.
  • 화살표가 다른 방식으로 대상에 닿으면 distance-1화살표를 렌더링해서는 안됩니다.

미스

이것은 Bob이 누락 된 렌더링의 예입니다 (화살표는 34m에서지면으로 들어가고, 각도는 45 °이며, 공기에서 시간은 10 초입니다. 물리적으로 "정확한"결과를 계산하는 일반적인 공식).

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

히트

다음은 Bob 스코어링의 렌더링 예입니다 (화살표가 대상에 입력 함 (= 경로와 교차)).

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

  • arrow_x7 arrow_y은 항상 3입니다.
  • angle이다 30°또는 0.523598776라디안.
  • velocity입니다 13m/s.
  • distance 20입니다.

따라서 목표물을 맞추려면 화살표가 (19,3)또는 을 교차해야 (19,4)합니다. 다른 모든 것은 그리울 것입니다. 이 경우, 화살표는 접지 (수단은 입력 할 y것이다 <1.0AT) 12.9358m = ~13m1.149s.


한계 및 점수

  • 이것은 이므로 가장 짧은 솔루션이 승리합니다. 보너스는 없습니다.
  • 귀하의 프로그램 (에서와 같이 작동하지 형식으로 입력을 수용해야합니다)이 위에서 설명한, 추가 입력은 허용되지 않습니다.
  • 잘못된 / 무의미한 / 불가능한 입력을 처리 할 필요가 없습니다.
  • 귀하의 언어에 대한 가장 짧은 합리적인 출력 (std, file 등)으로 인쇄하십시오.
  • 공백 공백에 신경 쓰지 않습니다.
  • 팁 : 출력 너비는입니다 distance+2. 높이는입니다 apex+1.

5
주어진 출력을 생성하는 데 사용 된 입력을 추가 할 수 있습니까?
Blue

3
왜 함수를 게시 할 수 없습니까?
Loovjo

2
@Mhmd 당신은 작업에 명시된대로 그를 그려야합니다. The left foot of Bob in the output has to match the x coord. of the shooting Bob.See below for the two valid output-Bobs
mınxomaτ

1
그리고 GCSE보다 물리학을 더 이상 이수하 지 않은 (또는 방금 잊어 버린) 사람들을 위해
Blue

2
@muddyfish 그냥 궤적 방정식에 대한 구글.
mınxomaτ

답변:


2

루비, 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

언 골프

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

방법

주요 방정식은 다음과 같습니다.

궤적 방정식

참고 : https://en.wikipedia.org/wiki/Trajectory_of_a_projectile 에서 가져온 이미지

어디,

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

내가하고있는 일은 0에서 (거리 -1)까지 숫자를 반복하고 모든 반복에서 화살표가지면 (또는 대상)에 닿는 지 확인하는 것입니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.