Aidez Notwen à simuler la gravité!

9

Notwen veut étudier la cinématique des corps lancés de grandes hauteurs dans un champ gravitationnel uniforme mais malheureusement il n'a pas la possibilité technique d'aller à des endroits suffisamment hauts et d'observer les objets en tombant. Mais qui ne veut pas voir les progrès de la science alors ... Aidons Notwen à construire un simulateur de gravité!

Contexte physique

Un objet tombé d'une hauteur h ( sans vitesse initiale ) dans un champ gravitationnel uniforme, négligeant les effets atmosphériques tels que la traînée ou le vent gagne en vitesse et accélère vers le sol avec le temps. Cette "vitesse de changement" de vitesse dans une unité de temps est appelée accélération gravitationnelle . Près de la surface de la Terre, il est approximativement égal à g9,8ms2 , mais pour les besoins de ce défi, nous utiliserons la valeurdixms2 , ce qui signifie qu'en une seconde, un objet augmente sa vitesse d'environdixms . Envisagez d'avoir une hauteurh, qui est un multiple de100met imaginez diviser cette hauteur en intervalles égaux, chacun de100mètres de long. Notwen veut mesurer le temps qu'il faut à l'objet pour passer à travers chacun de ces intervalles, c'est donc ce que nous visons également à calculer. Lacinématiquemoderne- sauter les détails techniques - nous dit que:

Δhk=vktk+12gtk2
ΔhkΔh=100mpour toutes les valeurs dekdans notre cas,vkest la vitesse initiale au début de notrekeintervalle ettkest la durée dukeintervalle de temps (pour référence, l'indexation commence à0avecv0=0). On sait également quevka l'expression suivante:
vk=2g(Δh0+Δh1++Δhk-1)=2gkΔh
Numériquement, on obtientvk=2000kms et brancher dans la première équation et résoudre pourtkdonne
(*)tk=25(k+1-k)s
Donc l'objet parcourt le premier intervalle (k=0) en4.4721s, le deuxième intervalle (k=1) en1,8524s et ainsi de suite (colleravec plus de valeurs).

Le défi

Entrée: La hauteur h partir de laquelle l'objet est projeté comme: un multiple entier positif de 100 , h ou le nombre d'intervalles N=h100 (donc700ou7signifierait queh=700m) - lequel dépend de vous.

Sortie: Une animation artistique ASCII d'un objet qui tombe, tombé d'une hauteur h (détails ci-dessous).

La structure d'une trame de sortie doit être la suivante:

  • N sauts de ligne précédant le "sol", représentés par au moins un caractère non blanc (par exemple@). Au moins un des caractères du sol doit se trouver sur la verticale sur laquelle tombe l'objet.
  • Un autre caractère non blanc représentant l'objet (par exemple X), autre que celui que vous avez choisi pour le sol.
  • Facultativement , un caractère au début de chaque ligne représentant l'axe vertical ou le mur fait sur N lignes. Toute quantité d'espaces de début et de fin est correcte tant qu'ils sont cohérents entre les cadres, ainsi que toute quantité d'espaces entre le mur et l'objet. Exemples de trames valides: 1 (pour h=700m ou N=7 ):
    | X                                       >
    |                             @           >   A
    |                                         >
    |        or            or           or    > 
    |               O                         >
    |                                         >
    |                                         >
    @@@             ^           -----            &&&
    

L'objet doit commencer sur la première ligne de la première image, puis après t04.47s la sortie doit être vidée et votre programme doit afficher l'objet sur la même verticale mais sur la ligne suivante dans la deuxième image; puis après t11,85s la sortie doit être à nouveau vidée et votre programme doit afficher l'objet sur la même verticale mais sur la ligne suivante dans le troisième cadre et ainsi de suite jusqu'à ce que l'objet atteigne la ligne juste au-dessus du sol. Exemple:

Exemple d'animation

Règles

  • La sortie doit être du texte écrit sur une console interactive (jetable), un GIF, un fichier séparé pour chaque image ou une autre technique de sortie raisonnable.
  • Chaque image doit remplacer complètement la dernière image et être au même emplacement.
  • Vous pouvez supposer que le temps nécessaire au compilateur / interprète pour produire le texte est négligeable et que la précision minimale autorisée pour le calcul des racines carrées est de 2 décimales.
  • Vous pouvez prendre des entrées et fournir des sorties par n'importe quelle méthode standard , tout en prenant note que ces failles sont interdites par défaut. Il s'agit de , alors essayez de terminer la tâche dans le moins d'octets possible dans la langue de votre choix.

1: Je suis indulgent sur ce qui constitue un cadre valide parce que je veux autoriser ce qui convient le mieux à votre solution et je n'essaie pas d'ajouter des choses superflues au défi. Si quelque chose n'est pas clair, demandez dans les commentaires.

M. Xcoder
la source

Réponses:

3

JavaScript (ES7) + CSS + HTML, 340 octets

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
la source
2

Fusain , 28 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Remarque: espace de fin. Vous pouvez observer le retard sur TIO mais vous ne pouvez pas regarder l'animation, vous devrez donc l'imaginer à partir de la sortie. Prend Nen entrée. Explication:

Nθ

Entrée N.

↓θ⁴

Imprimez le mur et le sol afin que la forme de la sortie soit cohérente.

Fθ«

Boucle sur chaque intervalle.

J²ιPX

Placez un Xà la hauteur appropriée.

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

Générez le contenu du canevas actuel et attendez la durée appropriée (tronquée à la milliseconde près).

 

Remplacez le Xpar un espace.

Neil
la source
2

Perl 6 , 81 octets

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

"Essayez-le en ligne!", Mais TIO ne peut pas gérer l'animation.

Explication

J'ai choisi une approche un peu différente (et je pense que c'est pour le mieux, mais je n'en suis pas sûr). Au lieu de dormir pendant des durées données par la formule du PO, je dessine juste la situation appropriée "toutes les 10 ms" (± erreurs induites parsleep ).

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

n=110012gt2=12g×dix-6k24,905×dix-6k2.
k=n4,905×dix-6452×n.

nsay "\e[s{"\n"x$_}-"n nouvelles lignes, et après cela, il imprime un tiret (le sol) et une nouvelle ligne. (Cela utilise la fonctionnalité intéressante des guillemets doubles dans Perl 6: vous pouvez incorporer le résultat de tout code directement dans la chaîne en écrivant ce code entre accolades.)

452n^452*.sqrt4.9×dix-6k2o

En raison de la troncature automatique, il ne fait que la bonne chose ™ et déplace le "o" seulement après chaque 100 m de chute.

animation résultante

Ramillies
la source
1

Haskell, 145 octets

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]

Doit être exécuté dans un terminal ANSI. L'entrée est le nombre d'intervalles.

threadDelayLe paramètre de est en nanosecondes, donc un littéral 4472135est plus court que 2*sqrt 5*10^6. Malheureusement 46**4 = 4477456n'est pas dans la limite de la précision requise.

nimi
la source
1

Python 2 , 117 120 123 octets

-3 octets Merci à "Ne soyez pas un x-triple point" et "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))

Essayez-le en ligne!

entrez la description de l'image ici

mdahmoune
la source
1
+1 de moi, bonne solution! L'utilisation du caractère non imprimable ne permettrait-elle pas d'économiser quelques octets plutôt que chr(27)?
M. Xcoder
@ Don'tbeax-tripledot Et si l'on n'obtient pas le personnage lui-même, '\33'devrait encore être plus court.
Jonathan Frech
, Aussi 2*5**.5est 20**.5.
Jonathan Frech
@JonathanFrech Racine carrée de 20 remplacée par 4.47
mdahmoune
@mdahmoune Eh bien ... Si cette précision est suffisante, alors oui.
Jonathan Frech
1

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

Besoin d'utiliser le système; pour 13 octets supplémentaires.

Étrangement, Console.Clear () ne semble pas fonctionner pour moi sur TIO. Cependant, cela fonctionne parfaitement dans une application console sous VS2017.

EDIT: Merci à Embodiment of Ignorance pour avoir raccourci la boucle, souligné mon assignation de variable inutile et inutile d'utiliser System.Threading; (restes de la copie VS), et soulignant que le terrain était nécessaire! Total de 8 octets golfés jusqu'à présent avec l'ajout du terrain. 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')+"-");}}

Essayez-le en ligne!

Destroigo
la source