Notwenが重力をシミュレートするのを手伝ってください!


9

Notwenは、高い高度から均一な重力場で投げられた物体の運動学を研究したいと考えていますが、残念ながら、彼は落下中に十分に高い場所に行って物体を観察する技術的な可能性を持っていません。しかし、科学の進歩を望んでいないので、Notwenが重力シミュレータを構築するのを手伝いましょう!

物理的背景

均一な重力場で高さ(初期速度なし)から落下したオブジェクトは、抗力や風などの大気の影響を無視して、時間とともに速度を上げて地面に向かって加速します。時間の単位でのこの速度の「変化率」は、重力加速度と呼ばれます。地球の表面近くでは、これはにほぼ等しくなりますが、この課題ではという値を使用します、つまり、1秒でオブジェクトの速度が約増加します。倍数である高さを持つことを検討してくださいhG 9.8 m個g9.8ms210ms210msh100m100Δの時間K=VKTK+1そして、その高さをそれぞれメートルの長さの等間隔に分割することを想像してみてください。Notwenは、オブジェクトがこれらの各間隔を通過するのにかかる時間を測定する必要があるため、これも計算することを目的としています。現代の運動: - -スキップ専門的でいることを教えてくれる のすべての値に対して私達の場合には、初期であります私たちの開始時速度間隔との持続時間であるで開始索引付け、基準の時間間隔(と100

Δhk=vktk+12gtk2
ΔhkΔh=100mkvkkthtkkth0v0=0Vk個のVK=)。が次の式を持っていることもわかっています 数値的には、および最初の方程式にプラグインしてを解くと、 オブジェクトは最初の間隔(走行ので)に、第二間隔()で等を(ペーストビンより多くの値を含む)。vk
vk=2g(Δh0+Δh1++Δhk1)=2gkΔh
vk=2000kmstk
(*)tk=25(k+1k)s
k=04.4721sk=11.8524s

チャレンジ

入力:オブジェクトがスローされる高さ:正の整数倍、または間隔の数(したがって、またはは意味します) –どちらを使用するかはあなた次第です。h100h N=h1007007h=700m

出力:高さから落下した落下オブジェクトのASCIIアートアニメーション(詳細は以下を参照)。h

出力フレームの構造は次のようにする必要があります。

  • N「地面」に先行する改行。少なくとも1つの非空白文字(例:)で表され@ます。地面のキャラクターの少なくとも1人は、オブジェクトが落ちる垂直線上になければなりません。
  • X地面に選択したもの以外の、オブジェクトを表す別の非空白文字(例:)。
  • 必要に応じて、垂直線または本の線で作成された壁を表す各線の先頭の文字。壁とオブジェクトの間のスペースと同様に、フレーム間で一貫している限り、前後のスペースの量は問題ありません。有効なフレームの例には1があります(または): Nh = 700 m N = 7h=700mN=7
    | X                                       >
    |                             @           >   A
    |                                         >
    |        or            or           or    > 
    |               O                         >
    |                                         >
    |                                         >
    @@@             ^           -----            &&&
    

オブジェクトは最初のフレームの最初の行から開始する必要があります。その後、後に出力がフラッシュされ、プログラムは同じ垂直方向に2番目のフレームの次の行にオブジェクトを表示します。その後、後、出力が再度フラッシュされ、オブジェクトが同じ垂直に表示されますが、オブジェクトが地面の真上のラインに到達するまで、3番目のフレームの次のラインに表示されます。例:t04.47st11.85s

アニメーションの例

ルール

  • 出力は、インタラクティブな(フラッシュ可能な)コンソールに書き込まれるテキスト、GIF、フレームごとの個別のファイル、またはその他の適切な出力手法である必要があります。
  • 各フレームは最後のフレームを完全に上書きし、同じ場所になければなりません。
  • コンパイラー/インタープリターがテキストを出力するのに必要な時間はごくわずかであり、平方根の計算に許容される最小精度は小数点以下2桁であると想定できます。
  • これらの抜け穴はデフォルトで禁止されていることに注意しながら、任意の標準的な方法で入力を取得し、出力を提供できます。これはなので、選択した言語で管理できる最小バイト数でタスクを完了するようにしてください。

1:私はあなたのソリューションに最も適したものを許可したいので、有効なフレームを構成するものについて寛大であり、私はチャレンジに余分なものを追加しようとはしていません。何か不明な点があれば、コメント欄で質問してください。

回答:


3

JavaScript(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

合計が正しければ、アニメーション期間はで、残りはCSS cubic-bezierが行います。20N


2

チャコール、28バイト

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

オンラインでお試しください!リンクはコードの詳細バージョンです。注:末尾のスペース。TIOで遅延を観察できますが、アニメーションを見ることができないため、出力からそれを想像する必要があります。取りN、入力として。説明:

Nθ

入力N

↓θ⁴

壁と地面を印刷して、出力の形状が一定になるようにします。

Fθ«

各間隔でループします。

J²ιPX

X適切な高さに配置します。

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

現在のキャンバスの内容を出力し、適切な時間待機します(最も近いミリ秒に切り捨てられます)。

 

Xスペースで上書きします。


2

Perl 6、81バイト

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

「オンラインで試してみてください!」ですが、TIOはアニメーションを処理できません。

説明

私は少し異なるアプローチを選択しました(確かにわかりませんが、それはより良い方法だと思います)。OPの式で与えられた時間スリープする代わりに、「10ミリ秒ごと」(±によって引き起こされるエラーsleep)の適切な状況を描画します。

kt=k/100h=100nnth=gt2/2

n=110012gt2=12g×106k24.905×106k2.
k=n4.905×106452×n.

nsay "\e[s{"\n"x$_}-"n

452n^452*.sqrt4.9×106k2o

自動切り捨てにより、Does The Right Thing™が実行され、100 mの落下が完了するたびに "o"が移動します。

結果のアニメーション


1

Haskell、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トリプルドットにならない」と「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)ないでしょうか?
Xcoder氏19

@ Don'tbeax-tripledotそして、キャラクター自体を把握できない場合'\33'でも、短くする必要があります。
Jonathan Frech

また、2*5**.5です20**.5
Jonathan Frech

@JonathanFrech 20の平方根が4.47に置き換えられました
mdahmoune

@mdahmouneまあ...その精度で十分なら、そうです。
Jonathan Frech

1

C#(.NET Core)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.