Escreva um programa que exiba uma bola ASCII em movimento *
dentro de um retângulo (20 por 10 caracteres, incluindo borda). A bola não deve cruzar o retângulo, por exemplo, esbarrar quando atingir a parede. A cena deve ser limpa e redesenhada a cada 0,1 segundos e a bola deve mover 1 caractere nas direções x e y a cada quadro. O programa mais curto escrito em qualquer idioma vence.
Exemplo de saída (quadro 1)
+------------------+
|* |
| |
| |
| |
| |
| |
| |
| |
+------------------+
Exemplo de saída (quadro 2)
+------------------+
| |
| * |
| |
| |
| |
| |
| |
| |
+------------------+
Exemplo de saída (quadro 8)
+------------------+
| |
| |
| |
| |
| |
| |
| |
| * |
+------------------+
Exemplo de saída (quadro 9)
+------------------+
| |
| |
| |
| |
| |
| |
| * |
| |
+------------------+
1080x1920
resolução :)Respostas:
Ruby 1.9, 115 caracteres
A lógica movimento é bastante semelhante ao Danko 's resposta .
Esta versão foi testada apenas no Linux.
fonte
puts"\e[2J"
apenas imprime←[2J
(e uma nova linha) na tela.cls
não funciona para mim, massystem ("cls")
funciona.Powershell, 144 caracteres
Com base na excelente resposta de Joey , usando o fato de que as coordenadas da bola são uma função do índice de quadros (i), portanto, se você tiver algo parecido
x=n-abs(n-(i mod (2*n)))
, x passará de 0 para n, volta para 0 e assim por diante ...fonte
if(-1,18-eq$x){$a*=-1;$x+=2*$a}if(-1,8-eq$y){$b*=-1;$y+=2*$b}
que substituiu quatroif
segundos antes ;-). Eu tinha certeza de que tinha que haver uma fórmula, no entanto.Python 2, 234
Tenho certeza de que isso pode ser mais praticado, mas tenho que ir, então aqui está o que tenho. vai trabalhar mais nisso mais tarde
nota: funciona no console de comandos do Windows. Outros sistemas operacionais podem usar um comando diferente do que
cls
para limpar a tela, comoclear
fonte
print "\e[H\e[2J"
o trabalho no windows?Ruby (
179174147)EDIT se livrou de mais alguns caracteres:
EDIT raspou alguns caracteres, agora 174:
Ungolfed:
fonte
sleep .1
funcionar também?SyntaxError: (irb):1: no .<digit> floating literal anymore; put 0 before dot
. Mas voltarei a isso se precisar no futuro, obrigado!?*
em vez de'*'
, etc.←[2J←[f+------------------+
a primeira linha.$> << "\e[2J\e[f"+f
para'cls';$><<f
(backticks de uso paracls
)JavaScript (
275283)Demonstração: http://jsfiddle.net/eKcfu/2/
Eu escrevi isso rapidamente, então tenho certeza de que ainda há bastante espaço para melhorias. Sugestões são bem-vindas :)
Editar 1 : remover chamada de função separada desnecessária, incorporar diretamente
setInterval
.fonte
Haskell, 212 caracteres
Utiliza uma abordagem mais funcional para calcular as coordenadas, criando a sequência infinita para cada coordenada separadamente e, em seguida, fechando-as juntas (linhas 2 e 3). O resto é desenhar código.
fonte
PowerShell, 184
185215Apenas semi-golfe, pois meu cérebro não está funcionando corretamente quando estou doente ...
Alguns truques legais, no entanto.
[Editar]: Fazer um loop sobre o campo é muito mais curto.
fonte
QBasic (QB64),
178173 bytes-5 bytes graças ao DLosc
fonte
DO ... LOOP
no lugar deWHILE 1 ... WEND
e salvar 5 bytes.Perl 5, 141 caracteres
Não inicia no canto superior esquerdo como o exemplo de saída, mas isso não é declarado como um requisito.
fonte
Ruby 1.9, 162 caracteres
35 caracteres a menos da resposta de @ Ventero, mas fiquei impressionado que consegui chegar até aqui ainda usando uma abordagem relativamente direta à lógica real. O ^ [é um ESC literal (1 caractere).
fonte
R, 233 caracteres
fonte
Outra entrada do bash -
213204 caracteresNão é realmente um vencedor, mas foi divertido. Ele usa sequências de caracteres vt100 para o desenho. (o código relatado aqui usa 215 caracteres para facilitar a leitura, dois caracteres podem ser removidos escapando, por exemplo, '*' -> \ *
fonte
Powershell, 139 bytes
Inspirado pela resposta de Danko Durbić .
Este script usa o
-replace
operador para desenhar*
dentro do retângulo.Script com menos golfe para explicar como funciona:
fonte
Bash 278
300, 296O \ e na linha
echo -e "\e[$2;$1H$3"
pode ser produzido porpara substituí-lo. Como 0x1b binário, é 3 caracteres mais curto; Eu conto apenas 1 para "\ e", porque apenas o software de layout me obriga a usar
\e
.fonte
$
símbolos internos((...))
e substituíx=$(($x+$p))
- los por((x+=p))
e similarmente na linha a seguir. (Eles também sugeriram o uso\e
do caractere de escape).\*
pode funcionar como um substituto para"*"
.1,337
que precisa ser permanentemente bloqueado no local: PTI Basic,
169167 bytesHorrivelmente lento, mas funciona.
fonte
(X=20)→S
pode ser(X=20→S
, e você pode tirar vantagem de Ans para economizar alguns bytes na final Por (circular Estou linhas positivas 8 e 9 podem ser golfed, mas eu não sei como no momento.."| \ Output(O,1,Ans \ Output(O,20,Ans
Deveria trabalhar.Ans
é um token de um byte , digitado com2nd
(-)
. Isso acabará economizando um byte, pois o|
token tem dois bytes na calculadora.PHP,
196186181bytesEu removi evitando um estouro inteiro para salvar 6 bytes. Será executado por 29 bilhões de anos antes do estouro; ainda 6,8 anos em um sistema de 32 bits. Eu diria que é aceitável.
Calcular a posição em vez de ajustá-la economizou muito, preparando o modelo completo de uma só vez.
Corra com
-nr
. Requer PHP 7.1.repartição :
fonte