Simulación de pelota que rebota

8

Imprima, en STDOUT, un patrón que muestre en qué dirección tomará una pelota que rebota.

Se hacen los siguientes supuestos:

  • La pelota comienza en la esquina superior izquierda: 0, 0con velocidad inicial cero.
  • La gravedad es 9.8ms^-2exactamente hacia el piso (y positivo).
  • La pelota pesa 500gexactamente.
  • La pelota rebota a 45 o 135 grados en el piso a menos que desee agregar los cálculos apropiados para agregar trayectorias variables. (Bonus puntos arbitrarios!)
  • La pelota tiene un coeficiente constante de resorte de restitución / constante de rebote de 0.8exactamente.
  • La pelota es perfectamente esférica y no se deforma cuando rebota.
  • La sala tiene 25 caracteres de alto, 130 caracteres de ancho. Cada x e y es de 1 metro y cada posición de la pelota representa una muestra discreta: el período de tiempo exacto no se especifica deliberadamente, pero la pantalla debe hacer que la trayectoria de la pelota sea lo suficientemente clara. La salida debe mostrar el camino de la pelota, no solo la posición final.
  • El piso y la pelota deben indicarse con caracteres en STDOUT, que pueden ser iguales. La presencia de ninguna bola o superficie del piso se indicará con un carácter de espacio.
  • Se le permite asumir el redondeo a tres decimales en cualquier cálculo. (Las soluciones que usan números enteros pueden estar particularmente interesadas en esta regla).
  • La simulación se detiene cuando la pelota no se mueve del piso o sale de la habitación ( x > width of area.)
  • El programa debe simular el camino de la pelota, no simplemente cargarlo desde un archivo o codificarlo de alguna manera en el programa. La prueba para esto será cambiar opcionalmente una de las constantes. Si el programa no calcula un resultado nuevo y correcto, entonces no califica.

Salida de ejemplo:

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

Determinación del ganador. Aceptaré la respuesta que:

  1. Cumple con las reglas como se definió anteriormente.
  2. Se considerará la característica adicional.
  3. Es la más corta y elegante (decisión subjetiva).
Thomas O
fuente
1
¿Falta la velocidad de entrada y / o de inicio (energía?) O estoy ciego? Tal como lo veo ahora, podría dibujar el cuadro y decir que la pelota está parada, o comprimir su imagen y mostrarla en cada carrera.
shiona
1
pero si decido que la pelota tiene una velocidad de 0.0001 m / s (o lo que sea lo suficientemente pequeña) en la dirección de 45 °, la pelota no deja visiblemente el suelo con la resolución elegida. Creo que los problemas siempre deben tener algún tipo de entrada (usuario, aleatorio, etc.) para hacer imposible la codificación dura de una sola respuesta.
shiona
44
¿Son las estrellas a la izquierda el eje y o están marcando el camino de la bola? Si marcan el camino de la pelota, estas simulaciones físicas parecen un poco dudosas porque la pelota no tiene un componente de movimiento hacia la derecha, por lo que cuando rebota en un piso plano, debe rebotar hacia arriba y no hacia la derecha. Además, los ángulos serían más planos en cada rebote (si tenemos un componente de movimiento a la derecha).
Thomas W.
1
Es esto code-golfo code-challengeo qué? Por favor etiquete apropiadamente.
Paul R
1
Dado que la pelota simplemente se cae, ¿qué hace que la pelota se mueva hacia la derecha? ¿Por qué no se mueve simplemente hacia arriba y hacia abajo?
DavidC

Respuestas:

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)

La curva resultante es ligeramente diferente al ejemplo, pero esto se debe a que la velocidad se ajusta antes de que la pelota caiga al suelo, en lugar de después de que ya lo haya hecho.

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

Python 132 bytes

Una versión más realista, que comienza con una velocidad x constante:

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)

Produce:

****                                                                                                                              
    **                                                                                                                            
     ***                                                                                                                          
       **                                                                                                                         
        **                                                                                                                        
         **                                                                                                                       
          **                                                                                                                      
           *                                                                                                                      
            *                                                                                                                     
            **                   *********                                                                                        
             *                 **        **                                                                                       
              *              **            **                                                                                     
              **            **              **                                                                                    
               *           **                **                                                                                   
               **         **                  **                *****                                                             
                *        **                    **             ***   ****                                                          
                 *       *                      **          **         **                                                         
                 **     *                        *         **            **                                                       
                  *    **                         *       *               **          *******                                     
                  *    *                          **    **                 **      ***       **                                   
                   *  *                            *    *                   **    **           **       *******                   
                   * **                             *  *                     *   **             **    ***     ***      ****       
                    **                              ***                       * *                ** **          **  ****  ****    
                    **                               **                        **                 ***             ***        *****
**********************************************************************************************************************************
primo
fuente
¡Felicidades, es asombroso!
rubik
1

Presentaré mi propia solución en Python. Solo un poco simplificado; ¡Estoy seguro de que hay formas mucho mejores de hacerlo! 282 280 caracteres. El resultado de ejemplo en la publicación de preguntas se generó utilizando este programa.

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
fuente
55
La forma en que su pelota "rebota siempre 45 grados" es muy poco física. La forma normal y razonable de simular una pelota que rebota en 2D es dejar constante el componente x de la velocidad y solo reflejar el componente y (es decir, tener en cuenta la repulsión perpendicular a la superficie pero descuidar la fricción tangente a ella). ¡No necesita ninguna función trigonométrica o similar para hacer eso!
dejó de girar en sentido contrario a las agujas del reloj el