Hilf Notwen, die Schwerkraft zu simulieren!

9

Notwen möchte die Kinematik von Körpern untersuchen, die aus großen Höhen in einem gleichmäßigen Gravitationsfeld geworfen werden, hat aber leider nicht die technische Möglichkeit, an ausreichend hohe Stellen zu gehen und die Objekte beim Fallen zu beobachten. Aber wer will nicht Fortschritte in der Wissenschaft sehen, also ... Helfen wir Notwen, einen Schwerkraftsimulator zu bauen!

Physischer Hintergrund

Ein Objekt, das aus einer Höhe h ( ohne Anfangsgeschwindigkeit ) in ein gleichmäßiges Gravitationsfeld gefallen ist und dabei atmosphärische Effekte wie Luftwiderstand oder Wind vernachlässigt, gewinnt an Geschwindigkeit und beschleunigt mit der Zeit in Richtung Boden. Diese "Änderungsrate" der Geschwindigkeit in einer Zeiteinheit wird als Gravitationsbeschleunigung bezeichnet . In der Nähe der Erdoberfläche entspricht sie ungefähr G9.8ms2 , aber für die Zwecke dieser Herausforderung verwenden wir den Wert10ms2 , was bedeutet, dass ein Objekt in einer einzigen Sekunde seine Geschwindigkeit um etwa10merhöht10ms . StellenSie sich eine Höheh, die ein Vielfaches von100mund stellen Sie sich vor, Sie teilen diese Höhe in gleiche Intervalle von jeweils100Metern Länge. Notwen möchte messen, wie lange es dauert, bis das Objekt jedes dieser Intervalle durchläuft. Deshalb wollen wir dies auch berechnen. ModerneKinematik- Überspringen technische - sagt unsdass:

Δhk=vktk+12Gtk2
wobeiin unserem Fallfür alle Werte vonkΔhkΔh=100mist,vkdie Anfangsgeschwindigkeit zu Beginn unseresk-tenIntervalls ist undtkdie Dauer desk-tenZeitintervalls ist (Als Referenz beginnt die Indizierung bei0mitv0=0). Wir wissen auch, dassvkden folgenden Ausdruck hat: vk=kvkkthtkkth0v0=0vk
vk=2G(Δh0+Δh1++Δhk- -1)=2GkΔh
Numerisch erhalten wirvk=2000kms und Einstecken in die erste Gleichung und Auflösen nachtkergibt
(*)tk=25(k+1- -k)s
Das Objekt fährt also das erste Intervall (k=0) in4.4721s, das zweite Intervall (k=1) in1,8524susw. (Pastebinmit mehr Werten).

Die Herausforderung

Eingabe: Die Höhe h aus der das Objekt geworfen wird, ist entweder: ein positives ganzzahliges Vielfaches von 100 , h oder die Anzahl der Intervalle N.=h100 (also entweder700oder7würde bedeuten, dassh=700m) - welches liegt bei Ihnen.

Ausgabe: Eine ASCII-Kunstanimation eines fallenden Objekts, die aus einer Höhe h fallen gelassen wurde (Details unten).

Die Struktur eines Ausgaberahmens muss wie folgt sein:

  • N. Zeilenumbrüche vor dem "Grund", dargestellt durch mindestens ein Nicht-Leerzeichen (z@.B.). Mindestens eines der Zeichen des Bodens muss auf der Vertikalen liegen, auf die das Objekt fällt.
  • Ein anderes Nicht-Leerzeichen, das das Objekt darstellt (z. B. X), außer dem, das Sie für den Boden ausgewählt haben.
  • Optional ein Zeichen am Anfang jeder Linie, das die vertikale Achse oder die Wand darstellt, die auf N. Linien erstellt wurde. Jede Anzahl von führenden und nachfolgenden Leerzeichen ist in Ordnung, solange sie zwischen Frames konsistent sind, sowie jede beliebige Anzahl von Leerzeichen zwischen der Wand und dem Objekt. Beispiele für gültige Rahmen sind 1 (für h=700m oder N.=7 ):
    | X                                       >
    |                             @           >   A
    |                                         >
    |        or            or           or    > 
    |               O                         >
    |                                         >
    |                                         >
    @@@             ^           -----            &&&
    

Das Objekt muss in der ersten Zeile des ersten Frames beginnen. Nach t04.47s die Ausgabe geleert werden und Ihr Programm sollte das Objekt in derselben Vertikalen, aber in der nächsten Zeile im zweiten Frame anzeigen. dann sollte nach t11,85s die Ausgabe wieder geleert werden und Ihr Programm sollte das Objekt in derselben Vertikalen, aber in der nächsten Zeile im dritten Frame usw. anzeigen, bis das Objekt die Linie direkt über dem Boden erreicht. Beispiel:

Animationsbeispiel

Regeln

  • Die Ausgabe sollte Text sein, der auf eine interaktive (spülbare) Konsole, ein GIF, eine separate Datei für jeden Frame oder eine andere vernünftige Ausgabetechnik geschrieben wurde.
  • Jeder Frame sollte den letzten Frame vollständig überschreiben und sich an derselben Stelle befinden.
  • Sie können davon ausgehen, dass die Zeit, die der Compiler / Interpreter für die Ausgabe des Texts benötigt, vernachlässigbar ist und die für die Berechnung der Quadratwurzeln zulässige Mindestgenauigkeit 2 Dezimalstellen beträgt.
  • Sie können Eingaben vornehmen und Ausgaben über eine beliebige Standardmethode bereitstellen , wobei zu beachten ist, dass diese Lücken standardmäßig verboten sind. Dies ist . Versuchen Sie also, die Aufgabe mit den wenigsten Bytes abzuschließen, die Sie in der Sprache Ihrer Wahl verwalten können.

1: Ich bin nachsichtig, was einen gültigen Rahmen ausmacht, weil ich zulassen möchte, was zu Ihrer Lösung am besten passt, und ich versuche nicht, der Herausforderung überflüssiges Material hinzuzufügen. Wenn etwas unklar ist, fragen Sie in den Kommentaren.

Mr. Xcoder
quelle

Antworten:

3

JavaScript (ES7) + CSS + HTML, 340 Byte

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
quelle
2

Holzkohle , 28 Bytes

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

Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Hinweis: Leerzeichen. Sie können die Verzögerung bei TIO beobachten, aber Sie können die Animation nicht sehen, daher müssen Sie sich das anhand der Ausgabe vorstellen. Nimmt Nals Eingabe. Erläuterung:

Nθ

Eingabe N.

↓θ⁴

Drucken Sie die Wand und den Boden so, dass die Form der Ausgabe konsistent ist.

Fθ«

Schleife über jedes Intervall.

J²ιPX

Stellen Sie eine Xauf die entsprechende Höhe.

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

Geben Sie den aktuellen Canvas-Inhalt aus und warten Sie auf die entsprechende Zeitspanne (auf die nächste Millisekunde gekürzt).

 

Überschreiben Sie das Xmit einem Leerzeichen.

Neil
quelle
2

Perl 6 , 81 Bytes

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

"Probieren Sie es online aus!", Aber TIO kann die Animation nicht verarbeiten.

Erläuterung

Ich habe einen etwas anderen Ansatz gewählt (und ich denke, es ist zum Besseren, obwohl ich es nicht genau weiß). Anstatt für Zeiten zu schlafen, die durch die Formel im OP angegeben sind, zeichne ich einfach die entsprechende Situation "alle 10 ms" (± Fehler induziert durch sleep).

kt=k/.100h=100nnth=Gt2/.2

n=110012Gt2=12G×10- -6k24.905×10- -6k2.
k=n4.905×10- -6452×n.

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

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

Aufgrund des automatischen Abschneidens macht es nur das Richtige und bewegt das "o" erst nach jeweils vollen 100 m des Sturzes.

resultierende Animation

Ramillies
quelle
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]

Muss in einem ANSI-Terminal ausgeführt werden. Die Eingabe ist die Anzahl der Intervalle.

threadDelayDer Parameter von 'ist in Nanosekunden angegeben, daher ist ein Literal 4472135kürzer als 2*sqrt 5*10^6. Liegt leider 46**4 = 4477456nicht im Rahmen der geforderten Präzision.

Nimi
quelle
1

Python 2 , 117 120 123 Bytes

-3 Bytes Dank an "Sei kein x-dreifacher Punkt" und "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))

Probieren Sie es online aus!

Geben Sie hier die Bildbeschreibung ein

mdahmoune
quelle
1
+1 von mir, gute Lösung! Würde die Verwendung des tatsächlich nicht druckbaren Zeichens nicht ein paar Bytes sparen anstatt chr(27)?
Herr Xcoder
@ Don'tbeax-tripledot Und wenn man den Charakter selbst nicht in den Griff bekommt, '\33'sollte er trotzdem kürzer sein.
Jonathan Frech
Auch 2*5**.5ist 20**.5.
Jonathan Frech
@ JonathanFrech Quadratwurzel von 20 ersetzt durch
4.47
@mdahmoune Nun ... Wenn diese Genauigkeit gut genug ist, dann ja.
Jonathan Frech
1

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

Benötigt System; für 13 zusätzliche Bytes.

Seltsamerweise scheint Console.Clear () bei TIO nicht für mich zu funktionieren. Dies läuft jedoch perfekt in einer Konsolen-App unter VS2017.

BEARBEITEN: Dank Verkörperung der Ignoranz für die Verkürzung der Schleife, die auf meine unnötige Variablenzuweisung und die unnötige Verwendung von System.Threading hinweist; Aussage (Rest vom VS-Kopieren) und Hinweis darauf, dass der Boden erforderlich war! Insgesamt wurden bisher 8 Bytes mit dem Zusatz des Bodens gespielt. 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')+"-");}}

Probieren Sie es online aus!

Destroigo
quelle