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


9

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

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

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

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

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

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

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

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

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

Объект должен начинаться с первой строки первого кадра, затем через с выход должен быть очищен, и ваша программа должна отобразить объект на той же вертикали, но на следующей строке во втором кадре; затем через с выходной сигнал должен быть снова и ваша программа должна отобразить объект на той же вертикали, но на следующей строке в третьем кадре и т. д., пока объект не достигнет линии прямо над землей. Пример:t04.47st11.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×106k24.905×106k2.
Мы можем инвертировать его, чтобы получить общее количество кадров, которое нам нужно отрендерить:
k=n4.905×106452×n.

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

После этого мы делаем последовательность от 0 до 452n(автоматически усекается до целого) с помощью ^452*.sqrt, и мы отображаем его. В каждой итерации мы печатаем последовательность ANSI Unsave Cursor (которая помещает курсор в место, где он был сохранен в последний раз), пишем4.9×106k2строки "пробел + символ новой строки" (автоматически обрезается еще раз) и, наконец 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.