Notwen가 중력을 시뮬레이션하도록 도와주세요!


9

Notwen은 균일 한 중력장에서 큰 높이에서 던져진 신체의 운동학을 연구하고 싶지만 불행히도 충분히 높은 곳으로 가서 넘어지는 동안 물체를 관찰 할 기술적 가능성이 없습니다. 그러나 과학의 진보를보고 싶지 않은 사람은 ... Notwen이 중력 시뮬레이터를 만들도록 도와주세요!

물리적 배경

높이에서 떨어진 물체 h균일 한 중력장에서 ( 초기 속도없이 ) 항력이나 바람과 같은 대기 효과를 무시하면 속도가 올라가고 시간이 지남에 따라지면을 향해 올라갑니다. 단위 시간당 속도의 "변화율"을 중력 가속도 라고 합니다. 지구 표면 근처에서, 그것은 대략 와 같지만,이 도전을 위해 우리는 값을 사용할 것입니다 즉, 1 초 안에 물체의 속도가 약 합니다. 높이 를 의 배수로 가정 하고 높이를 동일한 간격으로 각각 으로 나누는 것을 상상하십시오.9.8미디엄에스210미디엄에스210미디엄에스h100미디엄100미터 길이. Notwen은 객체가 각각의 간격을 통과하는 데 걸리는 시간을 측정하려고하므로 이것이 우리의 계산 목표이기도합니다. 현대 운동학 - 건너 뛰는 교칙은 -라고 우리에게 이야기한다 : 의 모든 값에 대한 , 우리의 경우 처음이다 간격 이 시작될 때의 속도 와 는 시간 간격 의 지속 기간입니다 (참고로 색인은 에서 ). 또한 에는 다음과 같은 표현이 있습니다.

Δh케이=V케이케이+12케이2
Δh케이Δh=100미디엄케이V케이케이케이케이0V0=0V케이
vk=2g(Δh0+Δh1++Δhk1)=2gkΔh
수치 적으로, 와 제 식으로 밀봉하고 풀면 범 따라서 객체는 의 첫 번째 간격 ( ), 의 두 번째 간격 ( ) 등으로 합니다 ( 값이 더 큰 pastebin ).vk=2000kmstk
(*)tk=25(k+1k)s
k=04.4721sk=11.8524s

도전

입력 : 높이 개체 중 하나로서 발생되는 : 양의 정수 배수 , 또는 간격의 수 (따라서 하나 또는 것을 의미 ) – 어느 쪽이 당신에게 달려 있습니다.h100h N=h1007007h=700m

출력 : 높이에서 떨어진 떨어지는 물체의 ASCII 아트 애니메이션h (자세한 내용은 아래 참조).

출력 프레임의 구조는 다음과 같아야합니다.

  • N공백이 아닌 문자 (예 :)로 표시되는 "접지"앞에있는 줄 바꿈 @. 지면의 캐릭터 중 적어도 하나는 물체가 떨어지는 수직에 있어야합니다.
  • X지상을 위해 선택한 것 이외의 객체 (예 :)를 나타내는 다른 공백이 아닌 문자 .
  • 선택적으로 , 각 축의 시작 부분에 세로 축 또는 벽을 나타내는 문자N윤곽. 벽과 물체 사이의 공간뿐만 아니라 프레임 사이에 일관성이있는 한 모든 선행 및 후행 공간이 좋습니다. 유효한 프레임의 예는 1 (h=700m 또는 N=7) :
    | X                                       >
    |                             @           >   A
    |                                         >
    |        or            or           or    > 
    |               O                         >
    |                                         >
    |                                         >
    @@@             ^           -----            &&&
    

객체는 첫 번째 프레임의 첫 번째 줄에서 시작한 다음에 시작해야합니다. t04.47s출력은 플러시되어야하고 프로그램은 두 번째 프레임의 다음 줄에 같은 세로로 객체를 표시해야합니다. 그러고 나서t11.85s출력은 다시 플러시되어야하며 프로그램은 객체가지면 바로 위의 라인에 도달 할 때까지 동일한 수직으로 세 번째 프레임의 다음 라인에 객체를 표시해야합니다. 예:

애니메이션 예

규칙

  • 출력은 대화식 (플러시 가능) 콘솔에 작성된 텍스트, GIF, 각 프레임에 대한 별도의 파일 또는 기타 합리적인 출력 기술이어야합니다.
  • 각 프레임은 마지막 프레임을 완전히 덮어 쓰고 동일한 위치에 있어야합니다.
  • 컴파일러 / 인터프리터가 텍스트를 출력하는 데 필요한 시간은 무시할 수 있고 제곱근 계산에 허용되는 최소 정밀도는 소수점 이하 2 자리라고 가정 할 수 있습니다.
  • 이러한 허점 은 기본적으로 금지되어 있음을 유의하면서 모든 표준 방법을 통해 입력을 받고 출력을 제공 할 수 있습니다 . 이것은이므로 선택한 언어로 관리 할 수있는 최소 바이트로 작업을 완료하십시오 .

1 : 귀하의 솔루션에 가장 적합한 것을 허용하고 도전 과제에 불필요한 것을 추가하려고하지 않기 때문에 유효한 프레임을 구성하는 것에 대해 관대합니다. 확실치 않은 사항이 있으면 의견을 요청하십시오.

답변:


3

자바 스크립트 (ES7) + CSS + HTML, 340 바이트

f=n=>{o.style.height=n+'em';x.style.animationDuration=(n*20)**.5+'s';o.appendChild(x,x.remove())}
pre{position:relative;border:1px solid;height:5em;overflow:hidden}span{position:absolute;top:0;animation:x 10s cubic-bezier(0.33,0,0.67,0.33)both}@keyframes x{to{top:100%}}
<input type=number value=5 oninput=f(this.value)><pre id=o><span id=x>X

내가 합계를 얻었 으면 애니메이션 지속 시간은 20 그런 다음 CSS 큐빅 베 지어가 나머지를 수행합니다.


2

, 28 바이트

Nθ↓θ⁴Fθ«J²ιPXR⌊×φ×₂²⁰⁻₂⊕ι₂ι 

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 참고 : 후행 공간. TIO에서 지연을 관찰 할 수 있지만 애니메이션을 볼 수 없으므로 출력에서이를 상상해야합니다. 취하고 N입력한다. 설명:

Nθ

입력 N.

↓θ⁴

출력 형태가 일관되도록 벽과지면을 인쇄하십시오.

Fθ«

각 간격을 반복하십시오.

J²ιPX

배치 X적절한 높이.

R⌊×φ×₂²⁰⁻₂⊕ι₂ι

현재 캔버스 내용을 출력하고 적절한 시간 동안 기다립니다 (가장 가까운 밀리 초로 잘림).

 

X공백으로 덮어 씁니다 .


2

펄 6 , 81 바이트

{say "\e[s{"\n"x$_}-";map {say "\e[u{" \n"x 4.9e-6*$_²}o";sleep .01},^452*.sqrt}

"온라인으로 사용해보십시오!"그러나 TIO는 애니메이션을 처리 할 수 ​​없습니다.

설명

나는 조금 다른 접근 방식을 선택했습니다 (그리고 확실하지는 않지만 더 나은 방법이라고 생각합니다). OP의 수식으로 주어진 시간 동안 잠을 자지 않고 적절한 상황을 "10ms마다"(±에 의해 유발 된 ± 오류 sleep) 그립니다.

즉, 초당 100 개의 프레임이 있으므로 프레임 번호를 케이이어야합니다. =케이/100. 수직 거리를 100 미터 블록으로 나누기 때문에 높이를 다음과 같이 쓸 수 있습니다.h=100, 어디 입력으로 제공된 블록 수입니다. 시간이 여행 한 높이 ~에 의해 주어진다 h=2/2따라서 이동 한 블록 수는

=1100122=12×106케이24.905×106케이2.
렌더링해야 할 총 프레임 수를 얻기 위해이를 뒤집을 수 있습니다.
케이=4.905×106452×.

이것은 함수를 작성하기에 충분합니다. 렌더링 할 블록 수, 즉 하나의 인수가 필요합니다.. 먼저 say "\e[s{"\n"x$_}-". 저장 커서 라는 ANSI 이스케이프 시퀀스를 인쇄 한 다음 인쇄합니다.줄 바꿈과 그 후에 대시 (접지)와 줄 바꿈을 인쇄합니다. (이것은 Perl 6에서 큰 따옴표의 멋진 기능을 사용합니다. 중괄호 안에 코드를 작성하여 코드의 결과를 문자열로 인라인 할 수 있습니다.)

그 후, 우리는 0에서 0까지 시퀀스를 만듭니다. 452(자동으로 정수로 잘림)을 사용하여 ^452*.sqrt매핑합니다. 반복 할 때마다 Unsave Cursor ANSI 시퀀스 (마지막으로 저장된 위치에 커서를 놓음)를 인쇄하고4.9×106케이2문자열 "space + newline"(다시 자동으로 잘림)과 마지막으로 o객체를 나타냅니다. 그런 다음 10ms 동안 자고 헹구고 반복하십시오.

자동 자르기 때문에, 그것은 바로 The Thing ™을 수행하고 각각 100m의 낙하 후에 만 ​​"o"를 움직입니다.

결과 애니메이션


1

하스켈, 145 바이트

import Control.Concurrent
a!b=[a..b]>>"\n"
f h=mapM(\k->putStr("\27[2J"++1!k++'O':k!h++"-")>>threadDelay(round$4472135*(sqrt(k+1)-sqrt k)))[1..h]

ANSI 터미널에서 실행해야합니다. 입력은 간격 수입니다.

threadDelay의 매개 변수는 나노초 단위이므로 리터럴 4472135이보다 짧습니다 2*sqrt 5*10^6. 불행히도 46**4 = 4477456필요한 정밀도의 한계 내에 있지 않습니다.


1

파이썬 2 117 120 123 바이트

-3 바이트 "X-triple 도트가 아닙니다"및 "Jonathan Frech"

import time
h=input()
for k in range(h):print'\33[2J'+'\n'*k+'O'+'\n'*(h-k)+'^';time.sleep(2*5**.5*((k+1)**.5-k**.5))

온라인으로 사용해보십시오!

여기에 이미지 설명을 입력하십시오


1
나에게서 +1, 좋은 해결책! 실제 인쇄 할 수없는 문자를 사용하지 않고 몇 바이트를 절약하지 않겠습니까 chr(27)?
Mr. Xcoder

@ Don'tbeax-tripledot 그리고 캐릭터 자체를 놓치지 않으면 '\33'여전히 짧아야합니다.
Jonathan Frech

또한 2*5**.5입니다 20**.5.
Jonathan Frech

4.47로 대체 (20)의 @JonathanFrech 광장 루트
mdahmoune

@mdahmoune 음 ... 정확도가 충분하다면 그렇습니다.
Jonathan Frech

1

C # (. NET 코어) , 201 , 180 + 13 = 193 바이트

시스템 사용 필요; 13 바이트 추가

이상하게도 Console.Clear ()가 TIO에서 작동하지 않는 것 같습니다. 그러나 이것은 VS2017의 콘솔 ​​앱에서 완벽하게 실행됩니다.

편집 : 루프를 단축하기위한 무지의 구현 덕분에 불필요한 변수 할당을 지정하고 System.Threading을 사용하지 않아도됩니다. 진술서 (VS 복사에서 남음)와 근거가 필요하다는 것을 지적하십시오! 그라운드를 추가하여 지금까지 총 8 바이트의 골프를 쳤다. 타이 타이!

x=>{for(var j=x;j>0;System.Threading.Thread.Sleep((int)(4470*(Math.Sqrt(x-j+1)-Math.Sqrt(x-j--))))){Console.Clear();Console.Write("X".PadLeft(x-j+1,'\n').PadRight(x+1,'\n')+"-");}}

온라인으로 사용해보십시오!

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