Bantu Notwen mensimulasikan gravitasi!


9

Notwen ingin mempelajari kinematika tubuh yang dilemparkan dari ketinggian besar di medan gravitasi seragam, tetapi sayangnya ia tidak memiliki kemungkinan teknis untuk pergi ke tempat yang cukup tinggi dan mengamati benda-benda saat jatuh. Tapi siapa yang tidak ingin melihat kemajuan dalam sains jadi ... Ayo bantu Notwen membangun simulator gravitasi!

Latar Belakang Fisik

Sebuah benda jatuh dari ketinggian ( tanpa kecepatan awal ) dalam medan gravitasi yang seragam, mengabaikan efek atmosfer seperti gaya hambat atau angin yang menambah kecepatan dan mempercepat menuju tanah seiring waktu. "Laju perubahan" kecepatan dalam satuan waktu ini disebut percepatan gravitasi . Di dekat permukaan Bumi, kira-kira sama dengan , tetapi untuk tujuan tantangan ini kita akan menggunakan nilai , yang berarti bahwa dalam satu detik, sebuah objek meningkatkan kecepatannya sekitar . Pertimbangkan memiliki ketinggian , yang merupakan kelipatanhg9.8ms210ms210msh100mdan bayangkan membagi tinggi itu menjadi interval yang sama, masing-masing panjangnya meter. Notwen ingin mengukur berapa lama waktu yang dibutuhkan objek untuk melewati masing-masing interval tersebut, jadi itulah yang ingin kami hitung juga. Kinematika modern - melewatkan teknis - memberi tahu kita bahwa: mana untuk semua nilai dalam kasus kami, adalah inisial kecepatan di awal interval dan adalah durasi interval waktu (untuk referensi, pengindeksan dimulai pada dengan100

Δhk=vktk+12gtk2
ΔhkΔh=100mkvkkthtkkth0v0=0). Kita juga tahu bahwa memiliki ekspresi berikut: Secara numerik, kita mendapatkan dan menghubungkan ke persamaan pertama dan penyelesaian untuk memberikan Jadi objek menempuh interval pertama ( k = 0 ) dalam 4,4721d , interval kedua ( k = 1 ) dalam 1,8524d dan seterusnya ( pastebin dengan lebih banyak nilai).vk
vk=2g(Δh0+Δh1++Δhk-1)=2gkΔh
vk=2000kmstk
(*)tk=25(k+1-k)s
k=04.4721sk=11.8524s

Tantangan

Input: Tinggi dari mana objek dilemparkan sebagai: kelipatan bilangan bulat positif , atau jumlah interval (sehingga atau berarti ) - yang mana terserah kamu.h100h N=h1007007h=700m

Output: Animasi seni ASCII dari objek yang jatuh, turun dari ketinggian (detail di bawah).h

Struktur kerangka output harus sebagai berikut:

  • N baris baru sebelum "ground", diwakili oleh setidaknya satu karakter non-spasi putih (misalnya @). Setidaknya salah satu karakter dari tanah harus terletak pada garis vertikal tempat benda itu jatuh.
  • Karakter non-spasi putih lain yang mewakili objek (misalnya X), selain yang Anda pilih untuk ground.
  • Secara opsional , karakter di awal setiap garis mewakili sumbu vertikal atau dinding yang dibuat pada garisJumlah ruang depan dan belakang baik-baik saja selama konsisten di antara bingkai, serta jumlah ruang antara dinding dan objek. Contoh frame yang valid termasuk 1 (untuk atau ): Nh=700mN=7
    | X                                       >
    |                             @           >   A
    |                                         >
    |        or            or           or    > 
    |               O                         >
    |                                         >
    |                                         >
    @@@             ^           -----            &&&
    

Objek harus dimulai pada baris pertama dari frame pertama, kemudian setelah output harus memerah dan program Anda harus menampilkan objek pada vertikal yang sama tetapi pada baris berikutnya di frame kedua; kemudian setelah , outputnya harus memerah lagi dan program Anda harus menampilkan objek pada vertikal yang sama tetapi pada baris berikutnya dalam bingkai ketiga dan seterusnya, hingga objek mencapai garis tepat di atas tanah. Contoh:t04.47st11.85s

Contoh Animasi

Aturan

  • Outputnya harus berupa teks yang ditulis ke konsol interaktif (flushable), GIF, file terpisah untuk setiap frame atau beberapa teknik output wajar lainnya.
  • Setiap frame harus sepenuhnya menimpa frame terakhir dan berada di lokasi yang sama.
  • Anda dapat mengasumsikan bahwa waktu yang diperlukan untuk kompiler / juru bahasa untuk menampilkan teks dapat diabaikan dan presisi minimum yang diijinkan untuk menghitung akar kuadrat adalah ke 2 tempat desimal.
  • Anda dapat mengambil input dan memberikan output melalui metode standar apa pun , sambil memperhatikan bahwa celah ini dilarang secara default. Ini adalah , jadi cobalah untuk menyelesaikan tugas dalam byte paling sedikit yang dapat Anda kelola dalam bahasa pilihan Anda.

1: Saya ringan tentang apa yang merupakan kerangka yang valid karena saya ingin membiarkan apa pun yang paling sesuai dengan solusi Anda dan saya tidak mencoba untuk menambahkan hal-hal yang berlebihan untuk tantangan. Jika ada yang tidak jelas, tanyakan di komentar.

Jawaban:


3

JavaScript (ES7) + CSS + HTML, 340 byte

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

20N


2

Arang , 28 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Catatan: ruang tambahan. Anda dapat mengamati penundaan pada TIO tetapi Anda tidak dapat menonton animasi sehingga Anda harus membayangkannya dari output. Dibawa Nsebagai input. Penjelasan:

Nθ

Masukan N.

↓θ⁴

Cetak dinding dan tanah, sehingga bentuk output konsisten.

Fθ«

Ulangi setiap interval.

J²ιPX

Tempatkan Xpada ketinggian yang sesuai.

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

Keluarkan konten kanvas saat ini dan tunggu jumlah waktu yang sesuai (terpotong ke milidetik terdekat).

 

Timpa Xdengan spasi.


2

Perl 6 , 81 byte

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

"Coba online!", Tetapi TIO tidak dapat menangani animasinya.

Penjelasan

Saya memilih pendekatan yang sedikit berbeda (dan saya pikir itu menjadi lebih baik, meskipun saya tidak tahu pasti). Alih-alih tidur untuk waktu yang diberikan oleh rumus dalam OP, saya hanya menggambar situasi yang sesuai "setiap 10 ms" (± kesalahan yang disebabkan oleh sleep).

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

n=110012gt2=12g×10-6k24.905×10-6k2.
k=n4.905×10-6452×n.

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

452n^452*.sqrt4.9×10-6k2o

Karena pemotongan otomatis, ia hanya Melakukan Hal yang Benar ™ dan menggerakkan "o" hanya setelah setiap 100 m jatuh penuh.

animasi yang dihasilkan


1

Haskell, 145 byte

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]

Perlu dijalankan di terminal ANSI. Input adalah jumlah interval.

threadDelayParameter dalam nanodetik, jadi literal 4472135lebih pendek dari 2*sqrt 5*10^6. Sayangnya 46**4 = 4477456tidak dalam batas presisi yang diperlukan.


1

Python 2 , 117 120 123 byte

-3 byte Berkat "Jangan menjadi titik x-triple" dan "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))

Cobalah online!

masukkan deskripsi gambar di sini


1
+1 dari saya, solusi bagus! Tidakkah menggunakan karakter sebenarnya yang tidak patut tidak menyimpan beberapa byte daripada chr(27)?
Tn. Xcoder

@ Don'tbeax-tripledot Dan jika seseorang tidak menguasai karakter itu sendiri, '\33'masih harus lebih pendek.
Jonathan Frech

Juga, 2*5**.5adalah 20**.5.
Jonathan Frech

@JonathanFrech Square root dari 20 digantikan oleh 4,47
mdahmoune

@mdahmoune Baiklah ... Jika akurasinya cukup baik, maka ya.
Jonathan Frech

1

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

Kebutuhan menggunakan Sistem; untuk 13 byte tambahan.

Anehnya, Console.Clear () sepertinya tidak bekerja untuk saya di TIO. Namun, ini berjalan dengan sempurna di aplikasi konsol di bawah VS2017.

EDIT: Terima kasih kepada Perwujudan Ketidaktahuan untuk memperpendek loop, menunjukkan saya menetapkan variabel yang tidak perlu dan tidak perlu menggunakan System.Threading; pernyataan (sisa dari penyalinan VS), dan menunjukkan bahwa tanah diperlukan! Total 8 byte golf sejauh ini dengan penambahan ground. 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')+"-");}}

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.