Simulação de bola quicando

8

Imprima, no STDOUT, um padrão que mostre em que direção uma bola quicando seguirá.

As seguintes premissas são feitas:

  • A bola começa no canto superior esquerdo: 0, 0com velocidade inicial zero.
  • A gravidade é 9.8ms^-2exatamente em direção ao chão (y positivo.)
  • A bola pesa 500gexatamente.
  • A bola salta a 45 ou 135 graus no chão, a menos que você queira adicionar os cálculos apropriados para adicionar trajetórias variáveis. (Pontos arbitrários de bônus!)
  • A bola tem um coeficiente constante de mola de restituição / bouncyness constante de 0.8exatamente.
  • A bola é perfeitamente esférica e não se deforma quando bate.
  • A sala tem 25 caracteres, 130 caracteres de largura. Cada xey é de 1 metro e cada posição da bola representa uma amostra discreta - o período exato é deliberadamente não especificado, mas a tela deve deixar o caminho da bola suficientemente claro. A saída deve mostrar o caminho da bola, não apenas a posição final.
  • O piso e a bola devem ser indicados usando caracteres em STDOUT, que podem ser os mesmos. A presença de nenhuma bola ou superfície do piso deve ser indicada com um caractere de espaço.
  • Você pode assumir o arredondamento para três casas decimais em qualquer cálculo. (As soluções que usam puramente números inteiros podem estar particularmente interessadas nessa regra.)
  • A simulação para quando a bola não se move do chão ou sai da sala ( x > width of area.)
  • O programa deve simular o caminho da bola, não simplesmente carregá-lo de um arquivo ou codificá-lo de alguma forma no programa. O teste para isso será opcionalmente alterar uma das constantes. Se o programa não calcular um resultado novo e correto, ele não se qualifica.

Exemplo de saída:

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

Determinação do vencedor. Aceitarei a resposta que:

  1. Atende às regras, conforme definido acima.
  2. Característica de bônus será considerada.
  3. É a mais curta e elegante (decisão subjetiva).
Thomas O
fonte
1
A entrada e / ou a velocidade inicial (energia?) Estão ausentes ou estou cego? Como eu vejo agora, eu poderia simplesmente desenhar a caixa e dizer que a bola está parada, ou compactar sua imagem e exibi-la a cada corrida.
shiona
1
mas se eu decidir que a bola tem a velocidade de 0,0001 m / s (ou qualquer que seja pequena o suficiente) na direção de 45 °, a bola não sai visivelmente do chão com a resolução escolhida. Eu acho que os problemas sempre devem ter algum tipo de entrada (usuário, aleatório etc.) para tornar impossível a codificação embutida em uma única resposta.
Shiona
4
As estrelas à esquerda são o eixo y ou estão marcando o caminho da bola? Se eles marcarem o caminho da bola, essas simulações de física parecerão um pouco duvidosas porque a bola não tem componente de movimento para a direita; portanto, ao saltar em um piso plano, ela deve saltar de volta para cima e não para a direita. Além disso, os ângulos ficariam mais achatados a cada salto (se tivermos um componente de movimento à direita).
Thomas W.
1
Isso é code-golfou code-challengeou o quê? Etiquete adequadamente.
Paul R
1
Dado que a bola é simplesmente derrubada, o que faz a bola se mover para a direita? Por que simplesmente não se move para cima e para baixo?
23413 DavidC

Respostas:

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)

A curva resultante é um pouco diferente do exemplo, mas isso ocorre porque a velocidade é ajustada antes da bola entrar no chão, em vez de depois da bola já estar.

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

Python 132 bytes

Uma versão mais realista, que começa com uma velocidade 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)

Produz:

****                                                                                                                              
    **                                                                                                                            
     ***                                                                                                                          
       **                                                                                                                         
        **                                                                                                                        
         **                                                                                                                       
          **                                                                                                                      
           *                                                                                                                      
            *                                                                                                                     
            **                   *********                                                                                        
             *                 **        **                                                                                       
              *              **            **                                                                                     
              **            **              **                                                                                    
               *           **                **                                                                                   
               **         **                  **                *****                                                             
                *        **                    **             ***   ****                                                          
                 *       *                      **          **         **                                                         
                 **     *                        *         **            **                                                       
                  *    **                         *       *               **          *******                                     
                  *    *                          **    **                 **      ***       **                                   
                   *  *                            *    *                   **    **           **       *******                   
                   * **                             *  *                     *   **             **    ***     ***      ****       
                    **                              ***                       * *                ** **          **  ****  ****    
                    **                               **                        **                 ***             ***        *****
**********************************************************************************************************************************
primo
fonte
Parabéns, é incrível!
Rubik
1

Vou enviar minha própria solução em Python. Apenas um pouco simplificado; Tenho certeza de que existem maneiras muito melhores de fazê-lo! 282 280 caracteres. O exemplo de saída no posto de perguntas foi gerado usando 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
fonte
5
A maneira como sua bola "salta sempre 45 graus" é altamente anti-física. A maneira normal e razoável de simular uma bola quicando em 2D é deixar constante o componente x da velocidade e espelhar apenas o componente y (isto é, explicar a repulsão perpendicular à superfície, mas negligenciar o atrito tangente a ela). Você não precisa de funções trigonométricas ou afins para fazer isso!
deixou de girar no sentido anti-horáriowis