Bouncing Ball Simulation

8

Drucken Sie auf STDOUT ein Muster, das zeigt, in welche Richtung ein springender Ball gehen wird.

Folgende Annahmen werden getroffen:

  • Der Ball beginnt in der oberen linken Ecke: 0, 0mit einer Anfangsgeschwindigkeit von Null.
  • Die Schwerkraft ist 9.8ms^-2genau in Richtung Boden (y positiv).
  • Der Ball wiegt 500ggenau.
  • Der Ball springt mit 45 oder 135 Grad zum Boden, es sei denn, Sie möchten die entsprechenden Berechnungen hinzufügen, um variable Flugbahnen hinzuzufügen. (Beliebige Bonuspunkte!)
  • Der Ball hat einen Federkonstanten- Restitutionskoeffizienten / Sprungkonstanten von 0.8genau.
  • Der Ball ist perfekt kugelförmig und verformt sich beim Abprallen nicht.
  • Der Raum ist 25 Zeichen hoch und 130 Zeichen breit. Jedes x und y ist 1 Meter und jede Ballposition stellt eine diskrete Probe dar - der genaue Zeitraum ist absichtlich nicht spezifiziert, aber die Anzeige sollte den Weg des Balls ausreichend klar machen. Die Ausgabe sollte den Weg des Balls zeigen, nicht nur die Endposition.
  • Der Boden und die Kugel sollten mit Zeichen auf STDOUT gekennzeichnet werden, die möglicherweise gleich sind. Das Vorhandensein keiner Kugel oder Bodenfläche ist mit einem Leerzeichen zu kennzeichnen.
  • Sie können bei allen Berechnungen von einer Rundung auf drei Dezimalstellen ausgehen. (Lösungen, die reine Ganzzahlen verwenden, sind möglicherweise besonders an dieser Regel interessiert.)
  • Die Simulation stoppt, wenn sich der Ball entweder nicht vom Boden bewegt oder den Raum verlässt ( x > width of area.)
  • Das Programm muss den Pfad des Balls simulieren, ihn nicht einfach aus einer Datei laden oder irgendwie im Programm codieren lassen. Der Test hierfür besteht darin, optional eine der Konstanten zu ändern. Wenn das Programm kein neues, korrektes Ergebnis berechnet, ist es nicht qualifiziert.

Beispielausgabe:

*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                         ***********                                                                                             
*                    *****           ****                                                                                         
*                 ****                   ***                                                                                      
*               ***                        ***                                                                                    
*              **                             **                                                                                  
*           ***                                 **                                                                                
*          **                                     **                          *********                                           
*         *                                        **                      ****       ****                                        
*       **                                           *                   **               **                                      
*      *                                              **               **                   **                                    
*     *                                                 *            **                       **              ********            
*   **                                                   *          **                         **          ****      ****         
*  *                                                      **      **                             **       **            **        
* *                                                        **    **                               **    **                **    **
**                                                          **  **                                 **  **                  **  ** 
*                                                            ****                                   ****                    ***   
**********************************************************************************************************************************

Ermittlung des Gewinners. Ich werde die Antwort akzeptieren, die:

  1. Erfüllt die oben definierten Regeln.
  2. Bonusleistung wird berücksichtigt.
  3. Ist die kürzeste und eleganteste (subjektive Entscheidung.)
Thomas O.
quelle
1
Fehlt die Eingabe- und / oder Startgeschwindigkeit (Energie?) Oder bin ich blind? So wie ich es jetzt sehe, könnte ich einfach die Schachtel zeichnen und sagen, dass der Ball stationär ist, oder Ihr Bild gzipen und es bei jedem Lauf anzeigen.
Shiona
1
Wenn ich jedoch beschließe, dass der Ball eine Geschwindigkeit von 0,0001 m / s (oder was auch immer klein genug ist) in Richtung 45 ° hat, verlässt der Ball den Boden nicht sichtbar mit der von Ihnen gewählten Auflösung. Ich denke, Probleme sollten immer eine Art Eingabe haben (Benutzer, Zufall usw.), um eine harte Codierung einer einzelnen Antwort unmöglich zu machen.
Shiona
4
Sind die Sterne links die y-Achse oder markieren sie den Weg des Balls? Wenn sie den Weg des Balls markieren, erscheint diese Physiksimulation etwas zweifelhaft, da der Ball rechts keine Bewegungskomponente aufweist. Wenn er also auf einem flachen Boden abprallt, sollte er gerade nach oben und nicht nach rechts zurückspringen. Außerdem würden die Winkel bei jedem Sprung flacher (wenn wir rechts eine Bewegungskomponente haben).
Thomas W.
1
Ist das code-golfoder , code-challengeoder was? Bitte entsprechend kennzeichnen.
Paul R
1
Wenn man den Ball einfach fallen lässt, warum bewegt sich der Ball dann nach rechts? Warum bewegt es sich nicht einfach auf und ab?
DavidC

Antworten:

5

Python 143 Bytes

u=v=x=y=0
a=[[s]*130for s in' '*24+'*']
while x<129:
 if y+v>24:v*=-.8;u=-v
 v+=98e-4;x+=u;y+=v;a[int(y)][int(x)]=s
for r in a:print''.join(r)

Die resultierende Kurve unterscheidet sich geringfügig vom Beispiel, dies liegt jedoch daran, dass die Geschwindigkeit angepasst wird, bevor der Ball in den Boden geht, anstatt nachdem er bereits hat.

*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                                                                                                                                 
*                     ***************                                                                                             
*                 ****               ****                                                                                         
*               ***                     ***                                                                                       
*             **                           **                                                                                     
*           ***                              **                                                                                   
*         **                                   **                          ******                                                 
*        **                                     **                     ****     *****                                             
*       *                                         **                 ***             ***                                          
*     **                                           **              **                  **                                         
*    *                                               *           **                      **            *********                  
*   *                                                 **        **                        **         ***       ***                
*  *                                                   **     **                            **     ***           **        *****  
* *                                                     **   **                              **   **               **   ***    ***
**                                                       ** **                                ** **                 ** **         
*                                                         ***                                   **                   ***          
**********************************************************************************************************************************

Python 132 Bytes

Eine realistischere Version, die mit einer konstanten x- Geschwindigkeit beginnt :

v=x=y=0
a=[[s]*130for s in' '*24+'*']
while x<129:v=(y+v<24or-.8)*v+98e-4;x+=.3;y+=v;a[int(y)][int(x)]=s
for r in a:print''.join(r)

Produziert:

****                                                                                                                              
    **                                                                                                                            
     ***                                                                                                                          
       **                                                                                                                         
        **                                                                                                                        
         **                                                                                                                       
          **                                                                                                                      
           *                                                                                                                      
            *                                                                                                                     
            **                   *********                                                                                        
             *                 **        **                                                                                       
              *              **            **                                                                                     
              **            **              **                                                                                    
               *           **                **                                                                                   
               **         **                  **                *****                                                             
                *        **                    **             ***   ****                                                          
                 *       *                      **          **         **                                                         
                 **     *                        *         **            **                                                       
                  *    **                         *       *               **          *******                                     
                  *    *                          **    **                 **      ***       **                                   
                   *  *                            *    *                   **    **           **       *******                   
                   * **                             *  *                     *   **             **    ***     ***      ****       
                    **                              ***                       * *                ** **          **  ****  ****    
                    **                               **                        **                 ***             ***        *****
**********************************************************************************************************************************
primo
quelle
Herzlichen Glückwunsch, es ist unglaublich!
Rubik
1

Ich werde meine eigene Lösung in Python einreichen. Nur leicht vereinfacht; Ich bin sicher, es gibt viel bessere Möglichkeiten! 282 280 Zeichen. Die Beispielausgabe im Fragenbeitrag wurde mit diesem Programm generiert.

import sys;o=sys.stdout.write
py=px=vy=vx=0;g=98e-4;h=25;w=130;k=.8;p=[]
while 1:
 vy+=g;py+=vy;px+=vx
 if py>h:vy=-vy*k;vx=-vy
 if px>w:break
 p.append([int(px),int(py)])
py=0
while py<=h:
 px=0
 while px<w:
  if [px,py] in p or py==h:o('*')
  else:o(' ')
  px+=1
 o('\n');py+=1
Thomas O.
quelle
5
Die Art und Weise, wie Ihr Ball "immer um 45 Grad springt", ist höchst unphysisch. Die normale und vernünftige Möglichkeit, einen springenden Ball in 2D zu simulieren, besteht darin, die x-Komponente der Geschwindigkeit konstant zu lassen und nur die y-Komponente zu spiegeln (dh die Abstoßung senkrecht zur Oberfläche zu berücksichtigen, aber die Reibungstangente zu vernachlässigen). Sie brauchen keine trigonometrischen Funktionen oder ähnliches, um das zu tun!
aufgehört, gegen den Uhrzeigersinn am