Notwen yerçekimi simüle Yardım!


9

Notwen, tekdüze bir çekim alanında büyük yüksekliklerden atılan cisimlerin kinematiğini incelemek istiyor ancak maalesef yeterince yüksek yerlere gitme ve düşerken nesneleri gözlemleme gibi teknik bir olasılığı yok. Ama kim bilimdeki ilerlemeleri görmek istemez ki ... Notwen'e bir yerçekimi simülatörü oluşturmada yardım edelim!

Fiziksel Arkaplan

Bir cisim yükseklikten düştü h( başlangıç ​​hızı olmadan ) düzgün bir yerçekimi alanında, sürükleme veya rüzgar gibi atmosferik etkileri ihmal ederek hız kazanır ve zamanla yere doğru hızlanır. Bir birim zamandaki bu "değişim hızına" yerçekimi ivmesi denir . Dünya yüzeyinin yakınında, yaklaşık olarak eşittirg9.8ms2, ancak bu zorluğun amaçları için değeri 10ms2yani, bir saniye içinde bir cismin hızı yaklaşık 10ms. Yüksekliğe sahip olmayı düşününh, bunun katları 100m ve bu yüksekliği her biri eşit aralıklara böldüğünüzü hayal edin 100metre uzunluğunda. Notwen, nesnenin bu aralıkların her birine düşmesinin ne kadar sürdüğünü ölçmek ister, bu yüzden de hesaplamayı hedefliyoruz. Modern kinematik - atlama teknikleri - bize şunu söyler:

Δhk=vktk+12gtk2
nerede ΔhkΔh=100m tüm değerleri için k bizim durumumuzda, vk başlangıçtaki hız kth aralık ve tk süresi kth zaman aralığı (referans için indeksleme 0 ile v0=0). Ayrıca biliyoruz kivk aşağıdaki ifadeye sahiptir:
vk=2g(Δh0+Δh1++Δhk1)=2gkΔh
Sayısal olarak, vk=2000kms ve ilk denkleme takıp tk verir
(*)tk=25(k+1k)s
Böylece nesne ilk aralığı (k=0) içinde 4.4721s, ikinci aralık (k=1) içinde 1.8524svb. ( daha fazla değere sahip macun ).

Meydan okuma

Giriş: yükseklikh nesnenin ya şu şekilde atıldığı: 100, h veya aralık sayısıN=h100 (bu yüzden ya 700 veya 7 bunun anlamı h=700m) - hangisi size kalmış.

Çıktı: Düşen bir nesnenin ASCII sanat animasyonu, yükseklikten düştüh (detaylar aşağıda).

Bir çıktı çerçevesinin yapısı aşağıdaki gibi olmalıdır:

  • Nen az bir boşluk olmayan karakterle (örn. @) temsil edilen "yer" den önceki satırsonları . Yerin karakterlerinden en az biri, nesnenin düştüğü dikeyde olmalıdır.
  • Nesneyi (ör. X) Temsil eden , yer için seçtiğiniz karakterden başka bir boşluk olmayan karakter .
  • İsteğe bağlı olarak , her bir çizginin başlangıcında dikey ekseni veya yapılan duvarı temsil eden bir karakterNçizgiler. Herhangi bir miktarda ön ve arka boşluk, çerçeveler ile duvar ve nesne arasındaki herhangi bir boşluk tutarı tutarlı olduğu sürece iyidir. Geçerli çerçeve örnekleri arasında 1 (h=700m veya N=7):
    | X                                       >
    |                             @           >   A
    |                                         >
    |        or            or           or    > 
    |               O                         >
    |                                         >
    |                                         >
    @@@             ^           -----            &&&
    

Nesne ilk karenin ilk satırından başlamalı, sonra t04.47sçıktı temizlenmeli ve programınız nesneyi aynı dikeyde ancak ikinci karedeki bir sonraki satırda göstermelidir; ondan sonrat11.85sçıktı yeniden temizlenmeli ve programınız nesne aynı dikeyde, ancak üçüncü karedeki bir sonraki satırda vb. görüntülenmelidir, nesne zeminin hemen üzerindeki çizgiye ulaşıncaya kadar. Misal:

Animasyon Örneği

kurallar

  • Çıktı, etkileşimli (yıkanabilir) bir konsola, bir GIF'e, her bir kare için ayrı bir dosyaya veya başka bir makul çıktı tekniğine yazılmış bir metin olmalıdır.
  • Her kare son karenin tamamen üzerine yazılmalı ve aynı konumda olmalıdır.
  • Derleyicinin / yorumlayıcının metni çıkarması için gereken sürenin önemsiz olduğunu ve kare kökleri hesaplamak için izin verilen minimum hassasiyetin 2 ondalık basamak olduğunu varsayabilirsiniz.
  • Bu boşlukların not alınırken, herhangi bir standart yöntemle girdi alabilir ve çıktı sağlayabilirsiniz. varsayılan olarak yasak . Bu, bu nedenle görevi kendi dilinizde yönetebileceğiniz en az bayt cinsinden tamamlamayı deneyin .

1: Geçerli bir çerçeveyi neyin oluşturduğuna inanmıyorum çünkü çözümünüze en uygun olana izin vermek istiyorum ve bu mücadeleye gereksiz şeyler eklemeye çalışmıyorum. Net olmayan bir şey varsa, yorumlarda sorun.

Yanıtlar:


3

JavaScript (ES7) + CSS + HTML, 340 bayt

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

Toplamlarımı tam olarak aldıysam, animasyon süresi 20N ve sonra CSS kübik bezier gerisini halleder.


2

Odun kömürü , 28 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Not: sondaki boşluk. TIO'daki gecikmeyi gözlemleyebilirsiniz, ancak animasyonu izleyemezsiniz, böylece bunu çıktıdan hayal etmeniz gerekir. Alır Ngirdi olarak. Açıklama:

Nθ

Giriş N.

↓θ⁴

Çıktının şekli tutarlı olacak şekilde duvarı ve zemini yazdırın.

Fθ«

Her aralıkta döngü yapın.

J²ιPX

A'yı Xuygun yüksekliğe yerleştirin.

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

Geçerli tuval içeriğini çıktı olarak al ve uygun süre kadar bekle (en yakın milisaniyeye kesilmiş).

 

Üzerine Xbir boşluk bırakın .


2

Perl 6 , 81 bayt

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

"Çevrimiçi deneyin!", Ancak TIO animasyonu işleyemiyor.

açıklama

Biraz farklı bir yaklaşım seçtim (ve daha iyi olduğunu düşünüyorum, ancak kesin olarak bilmiyorum). OP'de formül tarafından verilen süreler için uyumak yerine, uygun durumu "her 10 ms'de" çiziyorum (± neden olduğu hatalar sleep).

Bu saniyede 100 kare olduğu anlamına gelir, bu nedenle kare numarasını k, olmalı t=k/100. Dikey mesafeyi 100 metre bloğa böldüğümüz için, yüksekliğih=100n, nerede nblok sayısıdır (girdi olarak verilir). Zamanda yolculuk edilen yükseklikt tarafından verildi h=gt2/2, bu yüzden seyahat edilen blok sayısı

n=110012gt2=12gx10-6k24,905x10-6k2.
Oluşturmamız gereken toplam kare sayısını elde etmek için tersine çevirebiliriz:
k=n4,905x10-6452xn.

Bu işlevi yazmak için yeterlidir. Bir argüman alır, oluşturulacak blok sayısı, yanin. İlk olarak, yapıyoruz say "\e[s{"\n"x$_}-". Bu , İmleç Kaydet adlı bir ANSI kaçış dizisi yazdırır, ardından yazdırırnve ardından bir çizgi (zemin) ve bir satırsonu yazdırır. (Bu, Perl 6'daki çift tırnakların harika özelliğini kullanır: herhangi bir kodun sonucunu, bu kodu kıvırcık parantez içine yazarak dizenin içine yerleştirebilirsiniz.)

Bundan sonra, 0'dan 452n(otomatik olarak tamsayıya kısaltılır) ile ^452*.sqrteşleştiririz. Her bir yinelemede, imleci en son kaydedildiği konuma getiren bir İmzalama İmleç ANSI dizisi yazdırıyoruz ,4.9x10-6k2"space + newline" (otomatik olarak bir kez daha kısaltılır) ve son oolarak nesneyi gösteren dizeler . Sonra 10 ms uyku, durulama ve tekrarlama.

Otomatik kesme nedeniyle, sadece The Right Thing ™ 'i yapar ve "o" yı sadece her 100 metrelik düşüşten sonra hareket ettirir.

sonuçta ortaya çıkan animasyon


1

Haskell, 145 bayt

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]

Bir ANSI terminalinde çalıştırılması gerekir. Giriş aralık sayısıdır.

threadDelayparametresi nanosaniye cinsindendir, bu nedenle değişmez 4472135değer daha kısadır 2*sqrt 5*10^6. Maalesef 46**4 = 4477456gereken hassasiyet sınırı dahilinde değil.


1

Piton 2 , 117 , 120 123 bayt

-3 bytes "x-triple dot olma" ve "Jonathan Frech" sayesinde

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

Çevrimiçi deneyin!

resim açıklamasını buraya girin


1
Benden +1, iyi çözüm! Yazdırılamaz gerçek karakteri kullanmak bayt yerine birkaç bayt kazandırmaz chr(27)mı?
Bay Xcoder

@ Don'tbeax-tripledot Ve eğer kişi karakterin kendisini yakalamazsa, '\33'yine de daha kısa olmalıdır.
Jonathan Frech

Ayrıca, 2*5**.5öyle 20**.5.
Jonathan Frech


@mdahmoune Şey ... Eğer bu doğruluk yeterince iyiyse, evet.
Jonathan Frech

1

C # (.NET Core) , 201 , 180 + 13 = 193 bayt

Sistem Gereksinimleri; 13 ek bayt için.

Garip bir şekilde, Console.Clear () benim için TIO üzerinde çalışmıyor gibi görünüyor. Ancak, bu VS2017 altındaki bir konsol uygulamasında mükemmel çalışır.

DÜZENLEME: Döngüyü kısaltmak, gereksiz değişken atamalarımı belirtmek ve System.Threading; ifadesi (VS kopyalamadan kalan) ve zeminin gerekli olduğuna işaret ediyor! Toplam 8 bayt, toprağın toplanmasıyla şimdiye kadar golf oynadı. Ty Ty!

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')+"-");}}

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.