Ajude Notwen a simular a gravidade!

9

Notwen quer estudar a cinemática de corpos lançados de grandes alturas em um campo gravitacional uniforme, mas infelizmente ele não tem a possibilidade técnica de ir a lugares suficientemente altos e observar os objetos enquanto cai. Mas quem não quer ver avanços na ciência, então ... Vamos ajudar a Notwen a construir um simulador de gravidade!

Contexto físico

Um objeto caiu de uma altura h ( sem velocidade inicial ) em um campo gravitacional uniforme, negligenciando efeitos atmosféricos, como arrasto ou vento, ganha velocidade e acelera em direção ao solo com o tempo. Essa "taxa de mudança" de velocidade em uma unidade de tempo é chamada aceleração gravitacional . Perto da superfície da Terra, é aproximadamente igual a g9.8ms2 , mas, para os propósitos deste desafio, usaremos o valor10ms2 , o que significa que em um único segundo, um objeto aumenta sua velocidade em cerca de10ms . Considere ter uma alturah, que é um múltiplo de100me imagine dividir essa altura em intervalos iguais, cada um com100metros de comprimento. Notwen quer medir quanto tempo leva para que o objeto caia em cada um desses intervalos, então é isso que pretendemos calcular também. Acinemáticamoderna- ignorando os aspectos técnicos - nos diz que:

Δhk=vktk+12gtk2
ondeΔhkΔh=100mpara todos os valores dek, no nosso caso,vkrepresenta a velocidade inicial no início do nossokthintervalo etké a duração dokthintervalo de tempo (para referência, a indexação começa em0comv0=0). Também sabemos quevktem a seguinte expressão:
vk=2g(Δh0+Δh1++Δhk1)=2gkΔh
Numericamente, obtemosvk=2000kms e ligar na primeira equação e resolvendo paratk
(*)tk=25(k+1k)s
Assim, o objeto percorre o primeiro intervalo (k=0) em4.4721s, o segundo intervalo (k=1) em1.8524se assim por diante (pastacom mais valores).

O desafio

Entrada: a altura h da qual o objeto é lançado como: um múltiplo inteiro positivo de 100 , h ou o número de intervalos N=h100 (então700ou7significaria queh=700m) - qual deles depende de você.

Saída: uma animação artística ASCII de um objeto em queda, que caiu da altura h (detalhes abaixo).

A estrutura de um quadro de saída deve ser a seguinte:

  • N novas linhas anteriores ao "solo", representadas por pelo menos um caractere que não é um espaço em branco (por exemplo@). Pelo menos um dos caracteres do solo deve estar na vertical em que o objeto cai.
  • Outro caractere que não é um espaço em branco que representa o objeto (por exemplo X), diferente daquele que você escolheu para o chão.
  • Nh=700mN=7
    | X                                       >
    |                             @           >   A
    |                                         >
    |        or            or           or    > 
    |               O                         >
    |                                         >
    |                                         >
    @@@             ^           -----            &&&
    

t04.47st11.85s

Exemplo de Animação

Regras

  • A saída deve ser algum texto gravado em um console interativo (lavável), um GIF, um arquivo separado para cada quadro ou alguma outra técnica razoável de saída.
  • Cada quadro deve substituir completamente o último quadro e estar no mesmo local.
  • Você pode supor que o tempo necessário para que o compilador / intérprete produza o texto seja insignificante e a precisão mínima permitida para calcular as raízes quadradas seja de 2 casas decimais.
  • Você pode obter entrada e fornecer saída através de qualquer método padrão , observando que essas brechas são proibidas por padrão. Isso é , então tente concluir a tarefa no mínimo de bytes que você puder gerenciar no seu idioma preferido.

1: Sou indulgente quanto ao que constitui um quadro válido, porque quero permitir o que melhor se adequa à sua solução e não estou tentando adicionar coisas supérfluas ao desafio. Se algo não estiver claro, pergunte nos comentários.

Mr. Xcoder
fonte

Respostas:

3

JavaScript (ES7) + CSS + HTML, 340 bytes

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

Neil
fonte
2

Carvão , 28 bytes

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

Experimente online! Link é a versão detalhada do código. Nota: espaço à direita. Você pode observar o atraso no TIO, mas não pode assistir à animação, portanto terá que imaginar isso a partir da saída. Toma Ncomo entrada. Explicação:

Nθ

Entrada N.

↓θ⁴

Imprima a parede e o chão, para que a forma da saída seja consistente.

Fθ«

Loop em cada intervalo.

J²ιPX

Coloque um Xna altura apropriada.

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

Envie o conteúdo atual da tela e aguarde a quantidade de tempo apropriada (truncada no milissegundo mais próximo).

 

Sobrescreva o Xespaço.

Neil
fonte
2

Perl 6 , 81 bytes

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

"Experimente online!", Mas o TIO não pode lidar com a animação.

Explicação

Eu escolhi uma abordagem um pouco diferente (e acho que é para melhor, embora não tenha certeza). Em vez de adormecer pelos horários indicados pela fórmula no OP, apenas traço a situação apropriada "a cada 10 ms" (± erros induzidos por sleep).

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

n=110012gt2=12g×106k24.905×106k2.
k=n4.905×106452×n.

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

452n^452*.sqrt4.9×106k2o

Devido ao truncamento automático, ele apenas faz a coisa certa ™ e move o "o" somente após cada 100 m de queda.

animação resultante

Ramillies
fonte
1

Haskell, 145 bytes

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]

Precisa ser executado em um terminal ANSI. A entrada é o número de intervalos.

threadDelayO parâmetro está em nanossegundos, portanto, um literal 4472135é menor que 2*sqrt 5*10^6. Infelizmente, 46**4 = 4477456não está dentro do limite da precisão necessária.

nimi
fonte
1

Python 2 , 117 120 123 bytes

-3 bytes Graças a "Não seja um ponto x triplo" e "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))

Experimente online!

insira a descrição da imagem aqui

mdahmoune
fonte
11
+1 de mim, boa solução! Usar o caractere não imprimível real não salvaria alguns bytes em vez de chr(27)?
Mr. Xcoder
@ Don'tbeax-tripledot E se alguém não se apega ao próprio personagem, '\33'deve ser ainda mais curto.
Jonathan Frech
Além disso, 2*5**.5é 20**.5.
Jonathan Frech
@JonathanFrech Raiz quadrada de 20 substituída por 4,47
mdahmoune
@mdahmoune Bem ... Se essa precisão é boa o suficiente, então sim.
Jonathan Frech
1

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

Precisa usar o sistema; por 13 bytes adicionais.

Estranhamente, o Console.Clear () não parece estar funcionando para mim no TIO. No entanto, isso funciona perfeitamente em um aplicativo de console no VS2017.

EDIT: Obrigado à Modalidade de Ignorância por encurtar o loop, apontando minha atribuição desnecessária de variáveis ​​e uso desnecessário de System.Threading; (sobra da cópia do VS) e apontando que o terreno era necessário! Total de 8 bytes jogados até o momento com a adição do solo. 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')+"-");}}

Experimente online!

Destroigo
fonte