Допоможіть Notwen імітувати гравітацію!


9

Нотвен хоче вивчити кінематику тіл, викинутих з великої висоти в рівномірному гравітаційному полі, але, на жаль, у нього немає технічної можливості піднятися на досить високі місця і спостерігати за предметами під час падіння. Але хто не хоче бачити досягнення науки, тому ... Допоможемо Нотвену побудувати симулятор тяжіння!

Фізична основа

Предмет опустився з висоти h( без початкової швидкості ) в рівномірному гравітаційному полі, нехтуючи атмосферними ефектами, такими як перетягування або вітер, з часом набирає швидкість і прискорюється до землі. Ця "швидкість зміни" швидкості в одиниці часу називається гравітаційним прискоренням . Біля поверхні Землі вона приблизно дорівнюєg9.8ms2, але для цілей цього виклику ми будемо використовувати значення 10ms2, що означає, що за одну секунду об’єкт збільшує свою швидкість приблизно на 10ms. Поміркуйте з висотоюh, що є кратним 100m і уявіть, як розділити цю висоту на рівні проміжки, кожен 100метрів завдовжки. Notwen хоче виміряти, скільки часу потрібно, щоб об'єкт пройшов через кожен з цих інтервалів, тому саме це ми і прагнемо обчислити. Сучасна кінематика - пропускаючи техніку - говорить нам про те, що:

Δhk=vktk+12gtk2
де ΔhkΔh=100m для всіх значень k у нашому випадку, vk - початкова швидкість на початку нашої kth інтервал і tk - тривалість kth інтервал часу (для довідки, індексація починається з 0 з v0=0). Ми також це знаємоvk має таке вираження:
vk=2g(Δh0+Δh1++Δhk1)=2gkΔh
Числово ми отримуємо vk=2000kms і підключення до першого рівняння та вирішення для tk дає
(*)tk=25(k+1k)s
Отже об'єкт проходить перший інтервал (k=0) в 4.4721s, другий інтервал (k=1) в 1.8524sі так далі ( пастібін з більшим значенням).

Змагання

Вхід: Висотаh з якого викидається об'єкт як: додатне ціле число, кратне о 100, h або кількість інтервалівN=h100 (так або 700 або 7 означало б це h=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

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

Якщо я отримав свої суми правильно, тривалість анімації - це 20N і тоді CSS-кубік-безір робить все інше.


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 не може впоратися з анімацією.

Пояснення

Я вибрав дещо інший підхід (і, думаю, це на краще, хоча я не знаю точно). Замість того, щоб спати протягом часу, заданого формулою в ОП, я просто малюю відповідну ситуацію "кожні 10 мс" (± помилки, викликані 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 під назвою Зберегти курсор , а потім друкуєnнові рядки, а після цього друкується тире (земля) та новий рядок. (Для цього використовується класна функція подвійних лапок в Perl 6: ви можете вбудувати результат будь-якого коду прямо в рядок, записавши цей код всередині фігурних дужок.)

Після цього робимо послідовність від 0 до 452n(автоматично обрізається цілим числом) з ^452*.sqrt, і ми відображаємо його. У кожній ітерації ми друкуємо послідовність ANSI курсору незбереження (що ставить курсор у положення, де він був останній час збережений), пишемо4.9×106k2рядки "пробіл + новий рядок" (автоматично вкорочується ще раз) і нарешті той, oщо позначає об'єкт. Потім ми спимо 10 мс, промиваємо і повторюємо.

Завдяки автоматичному укороченню, він просто робить The Right Thing ™ і переміщує "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-потрійною крапкою" та "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

@ Don'tbeax-tripledot І якщо хтось не знайдеться за самим персонажем, '\33'все одно він повинен бути коротшим.
Джонатан

Також, 2*5**.5є 20**.5.
Джонатан

@JonathanFrech Квадратний корінь 20 замінено на 4.47
mdahmoune

@mdahmoune Ну ... Якщо ця точність досить добра, то так.
Джонатан

1

C # (.NET Core) , 201 , 180 + 13 = 193 байт

Потреби з використанням системи; за 13 додаткових байтів.

Як не дивно, Console.Clear (), схоже, не працює для мене на TIO. Однак це ідеально працює в консольному додатку під VS2017.

EDIT: Завдяки втіленню невігластва за скорочення циклу, вказуючи на мій непотрібний присвоєння змінної та непотрібність за допомогою 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')+"-");}}

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.