ช่วย Notwen จำลองแรงโน้มถ่วง!


9

Notwen ต้องการศึกษาจลนศาสตร์ของร่างกายที่ถูกโยนออกมาจากที่สูงในเขตความโน้มถ่วงที่สม่ำเสมอ แต่น่าเสียดายที่เขาไม่มีความเป็นไปได้ทางเทคนิคที่จะไปยังที่สูงพอและสังเกตวัตถุในขณะที่ตกลงมา แต่ใครไม่ต้องการเห็นความก้าวหน้าทางวิทยาศาสตร์ดังนั้น ... มาช่วย Notwen สร้างเครื่องมือจำลองแรงโน้มถ่วง!

พื้นหลังทางกายภาพ

วัตถุตกจากที่สูง ชั่วโมง( ไม่มีความเร็วเริ่มต้น ) ในเขตความโน้มถ่วงสม่ำเสมอผลกระทบทางบรรยากาศเช่นการลากหรือลมจะเพิ่มความเร็วและความเร็วขึ้นสู่พื้นดินตามเวลา "อัตราการเปลี่ยนแปลง" ของความเร็วในหน่วยเวลานี้เรียกว่าการเร่งความเร็วด้วยแรงโน้มถ่วง ใกล้พื้นผิวโลกมันมีค่าเท่ากับแต่สำหรับจุดประสงค์ของการท้าทายนี้เราจะใช้ค่าซึ่งหมายความว่าในวินาทีเดียววัตถุเพิ่มความเร็วประมาณ{s} ลองพิจารณาความสูงซึ่งเป็นผลคูณของ100mแล้วจินตนาการถึงการหารความสูงนั้นเป็นระยะเท่ากันละ100ก.9.8ม.s210ms210msh100m100เมตรยาว Notwen ต้องการวัดระยะเวลาที่วัตถุจะตกในแต่ละช่วงเวลาดังนั้นนั่นคือสิ่งที่เรามุ่งหวังที่จะคำนวณเช่นกัน จลนศาสตร์สมัยใหม่- การกระโดดข้ามเทคนิค - บอกเราว่า: โดยที่สำหรับค่าทั้งหมดของในกรณีของเราเป็นค่าเริ่มต้น ความเร็วที่จุดเริ่มต้นของช่วงและคือช่วงเวลาของช่วงเวลาk ^ \ text {th} (สำหรับการอ้างอิงการทำดัชนีเริ่มต้นที่0ด้วยv_0 = 0 ) เรายังรู้ว่าv_kมีนิพจน์ดังต่อไปนี้:

Δhk=vktk+12gtk2
ΔhkΔh=100mkvkkthtkkth0v0=0vk
vk=2g(Δh0+Δh1++Δhk1)=2gkΔh
ตัวเลขเราได้vk=2000kmsและเสียบเข้ากับสมการแรกและแก้หาtkให้
(*)tk=25(k+1k)s
ดังนั้นวัตถุเดินทางช่วงแรก (k=0 ) ใน4.4721sช่วงเวลาที่สอง (k=1 ) ใน1.8524sและอื่น ๆ ( pastebin ที่มีค่ามากกว่า)

ความท้าทาย

อินพุต:ความสูงจากวัตถุที่ถูกโยนเช่น: จำนวนเต็มบวกจำนวน ,หรือจำนวนช่วงเวลา (เช่นหรือจะหมายถึง ) - อันไหนขึ้นอยู่กับคุณh100h N=h1007007h=700m

เอาต์พุต:ภาพเคลื่อนไหว ASCII ศิลปะของวัตถุที่ตกลงมาลดลงจากความสูง (รายละเอียดด้านล่าง)h

โครงสร้างของเฟรมเอาต์พุตต้องเป็นดังนี้:

  • Nบรรทัดใหม่ก่อนหน้า "กราวด์" ซึ่งมีอักขระที่ไม่ใช่ช่องว่างอย่างน้อยหนึ่งตัว (เช่น@) อย่างน้อยหนึ่งตัวละครของพื้นดินจะต้องอยู่ในแนวดิ่งที่วัตถุนั้นตกลงมา
  • อักขระที่ไม่ใช่ช่องว่างอื่นที่แสดงถึงวัตถุ (เช่นX) นอกเหนือจากอักขระที่คุณเลือกสำหรับพื้น
  • เป็นตัวเลือกอักขระที่จุดเริ่มต้นของแต่ละบรรทัดที่แสดงถึงแกนตั้งหรือผนังที่ทำบนเส้นจำนวนช่องว่างนำหน้าและต่อท้ายจะปรับได้ตราบใดที่มีความสอดคล้องกันระหว่างเฟรมรวมถึงจำนวนช่องว่างระหว่างผนังและวัตถุ ตัวอย่างของเฟรมที่ถูกต้องประกอบด้วย1 (สำหรับหรือ ): Nh=700mN=7
    | X                                       >
    |                             @           >   A
    |                                         >
    |        or            or           or    > 
    |               O                         >
    |                                         >
    |                                         >
    @@@             ^           -----            &&&
    

วัตถุต้องเริ่มต้นที่บรรทัดแรกของเฟรมแรกจากนั้นหลังจากเอาต์พุตควรถูกล้างออกและโปรแกรมของคุณควรแสดงวัตถุในแนวตั้งเดียวกัน แต่อยู่ในบรรทัดถัดไปในเฟรมที่สอง จากนั้นหลังจากผลลัพธ์ควรถูกล้างอีกครั้งและโปรแกรมของคุณควรแสดงวัตถุในแนวตั้งเดียวกัน แต่ในบรรทัดถัดไปในกรอบที่สามเป็นต้นไปจนกว่าวัตถุจะถึงเส้นที่อยู่เหนือพื้นดิน ตัวอย่าง:t04.47st11.85s

ตัวอย่างภาพเคลื่อนไหว

กฎระเบียบ

  • เอาต์พุตควรเป็นข้อความที่เขียนไปยังคอนโซลแบบโต้ตอบ (flushable), 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

หากฉันได้เงินก้อนโตแล้วระยะเวลาของภาพเคลื่อนไหวก็คือ 20ยังไม่มีข้อความ จากนั้น CSS cubic-bezier ทำส่วนที่เหลือ


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 ms" (มีข้อผิดพลาด±เกิดขึ้นsleep)

นั่นหมายความว่ามี 100 เฟรมต่อวินาทีดังนั้นหากเราแสดงหมายเลขเฟรมตาม kมันจะต้องเป็น t=k/100. และเนื่องจากเราแบ่งระยะทางแนวตั้งเป็นบล็อก 100 เมตรเราจึงเขียนความสูงเป็นh=100nที่ไหน nคือจำนวนบล็อก (ที่กำหนดเป็นอินพุต) ความสูงเดินทางในเวลาt ได้รับจาก h=gt2/2ดังนั้นจำนวนของบล็อกที่เดินทางคือ

n=110012gt2=12g×106k24.905×106k2.
เราสามารถสลับกลับเพื่อให้ได้จำนวนเฟรมทั้งหมดที่เราต้องการแสดงผล:
k=n4.905×106452×n.

ความพอเพียงนี้ในการเขียนฟังก์ชั่น ใช้เวลาหนึ่งอาร์กิวเมนต์จำนวนบล็อกที่จะแสดงเช่นn. say "\e[s{"\n"x$_}-"ครั้งแรกที่เราทำ ที่พิมพ์ลำดับหนี ANSI ที่เรียกว่าSave Cursorจากนั้นจะพิมพ์nขึ้นบรรทัดใหม่และหลังจากนั้นจะพิมพ์เส้นประ (พื้น) และขึ้นบรรทัดใหม่ (สิ่งนี้ใช้คุณสมบัติเจ๋ง ๆ ของเครื่องหมายคำพูดคู่ใน Perl 6: คุณสามารถอินไลน์ผลลัพธ์ของโค้ดใด ๆ ลงในสตริงโดยการเขียนโค้ดนั้นภายในเครื่องหมายปีกกา)

หลังจากนั้นเราสร้างลำดับจาก 0 ถึง 452n(ตัดโดยอัตโนมัติเป็นจำนวนเต็ม) ด้วย^452*.sqrtและเราแมปกับมัน ในการวนซ้ำแต่ละครั้งเราพิมพ์ลำดับUnsave Cursor ANSI (ซึ่งวางเคอร์เซอร์ที่ตำแหน่งที่บันทึกล่าสุด) เขียน4.9×106k2สตริง "space + newline" (ถูกตัดทอนโดยอัตโนมัติอีกครั้ง) และในที่สุดก็oหมายถึงวัตถุ จากนั้นเรานอนหลับเป็นเวลา 10 มิลลิวินาทีล้างออกและทำซ้ำ

เนื่องจากการตัดอัตโนมัติมันแค่ทำสิ่งที่ถูกต้อง™และย้าย "o" เฉพาะหลังจากที่เต็ม 100 เมตรของการตกแต่ละครั้ง

ภาพเคลื่อนไหวที่เกิด


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พารามิเตอร์ 's อยู่ในนาโนวินาทีดังนั้นตัวอักษรจะสั้นกว่า4472135 2*sqrt 5*10^6น่าเสียดายที่46**4 = 4477456ไม่อยู่ภายในขีดจำกัดความแม่นยำที่ต้องการ


1

Python 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

@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 ไบต์ที่เพิ่มขึ้นจากพื้นดิน 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')+"-");}}

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.