Помогите Notwen симулировать гравитацию!


9

Нотвен хочет изучить кинематику тел, сброшенных с больших высот в однородном гравитационном поле, но, к сожалению, у него нет технической возможности подняться на достаточно высокие места и наблюдать за объектами при падении. Но кто не хочет видеть достижения в науке, так что ... Давайте поможем Нотвену построить симулятор гравитации!

Физический фон

Объект упал с высоты h( без начальной скорости ) в однородном гравитационном поле, пренебрегая атмосферными эффектами, такими как сопротивление или ветер, набирает скорость и со временем ускоряется к земле. Эта «скорость изменения» скорости в единицу времени называется гравитационным ускорением . У поверхности Земли оно приблизительно равно , но для этой задачи мы будем использовать значение Это означает, что за одну секунду объект увеличивает свою скорость примерно на . Подумайте о том, чтобы иметь высоту , кратную и представьте, что эта высота делится на равные интервалы, каждый из которых равенg≈9.8ms210ms210msh100m100метров Notwen хочет измерить, сколько времени требуется объекту, чтобы пройти через каждый из этих интервалов, так что это то, что мы стремимся также вычислить. Современная кинематика - пропуская технические - говорит нам, что: где для всех значений в нашем случае, является начальным скорость в начале нашего интервала а - продолжительность интервала времени (для справки, индексирование начинается с с ). Мы также знаем, что имеет следующее выражение:

Δhk=vktk+12gtk2
Δhk≡Δh=100mkvkkthtkkth0v0=0vk
vk=2g(Δh0+Δh1+⋯+Δhk−1)=2gkΔh
Численно мы получаем и включение в первое уравнение и решение для дает Таким образом, объект проходит первый интервал ( ) за , второй интервал ( ) за и т. д. ( pastebin с большим количеством значений).vk=2000kmstk
(*)tk=25(k+1−k)s
k=04.4721sk=11.8524s

Соревнование

Входные данные: высота с которой объект выбрасывается как: положительное целое число, кратное , или числу интервалов (так что или означают, что ) - какой зависит от вас.h100h N=h1007007h=700m

Вывод: художественная анимация ASCII падающего объекта, сброшенного с высоты (подробности ниже).h

Структура выходного кадра должна быть следующей:

  • N символов новой строки, предшествующих «основанию», представленных как минимум одним непробельным символом (например, @). По крайней мере, один из символов земли должен лежать на вертикали, на которую падает объект.
  • Другой непробельный символ, представляющий объект (например X), отличный от того, который вы выбрали для земли.
  • По желанию , символ в начале каждой строки, представляющий вертикальную ось или стену, состоит из строк. Подойдет любое количество начальных и конечных пространств, если они согласованы между кадрами, а также любое количество промежутков между стеной и объектом. Примеры допустимых кадров включают 1 (для или ): Nh=700mN=7
    | X                                       >
    |                             @           >   A
    |                                         >
    |        or            or           or    > 
    |               O                         >
    |                                         >
    |                                         >
    @@@             ^           -----            &&&
    

Объект должен начинаться с первой строки первого кадра, затем через с выход должен быть очищен, и ваша программа должна отобразить объект на той же вертикали, но на следующей строке во втором кадре; затем через с выходной сигнал должен быть снова и ваша программа должна отобразить объект на той же вертикали, но на следующей строке в третьем кадре и т. д., пока объект не достигнет линии прямо над землей. Пример:t0≈4.47st1≈1.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 сделает все остальное.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 не может справиться с анимацией.

объяснение

Я выбрал немного другой подход (и думаю, что к лучшему, хотя точно не знаю). Вместо того, чтобы спать в течение времени, заданного формулой в ОП, я просто рисую соответствующую ситуацию «каждые 10 мс» (± ошибки, вызванные sleep).

Это означает, что есть 100 кадров в секунду, поэтому, если мы обозначим номер кадра через k, Это должно быть t=k/100, И поскольку мы делим вертикальное расстояние на 100-метровые блоки, мы можем записать высоту какh=100n, где nколичество блоков (задается как вход) Высота, пройденная во времениt дан кем-то h=gt2/2таким образом, количество пройденных блоков

n=110012gt2=12g×10−6k2≈4.905×10−6k2.
Мы можем инвертировать его, чтобы получить общее количество кадров, которое нам нужно отрендерить:
k=n4.905×10−6≈452×n.

Этого достаточно, чтобы написать функцию. Требуется один аргумент, количество блоков для рендеринга, т.е.n, Во-первых, мы делаем say "\e[s{"\n"x$_}-". Это печатает escape-последовательность ANSI под названием Save Cursor , затем она печатаетnсимвол новой строки, а после этого он печатает тире (основание) и символ новой строки. (Это использует классную особенность двойных кавычек в Perl 6: вы можете встроить результат любого кода прямо в строку, написав этот код внутри фигурных скобок.)

После этого мы делаем последовательность от 0 до 452n(автоматически усекается до целого) с помощью ^452*.sqrt, и мы отображаем его. В каждой итерации мы печатаем последовательность ANSI Unsave Cursor (которая помещает курсор в место, где он был сохранен в последний раз), пишем4.9×10−6k2строки "пробел + символ новой строки" (автоматически обрезается еще раз) и, наконец o, символ, обозначающий объект. Затем мы спим в течение 10 мс, промыть и повторить.

Благодаря автоматическому усечению, он просто делает правильную вещь ™ и перемещает букву «о» только через каждые 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Параметр в наносекундах, поэтому литерал 4472135короче, чем 2*sqrt 5*10^6. К сожалению 46**4 = 4477456, не в пределах требуемой точности.


1

Python 2 , 117 120 123 байта

-3 байта благодаря "Не будь х-тройная точка" и "Джонатан Фрех"

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.

РЕДАКТИРОВАТЬ: Благодаря Embodiment of Ignorance за сокращение цикла, указание на мои ненужные переменные назначают и ненужные с помощью 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.