Inspirado por esta listagem no Commodore 64 Guia do usuário:
10 PRINT "{CLR/HOME}"
20 POKE 53280,7 : POKE 53281,13
30 X = 1 : Y = 1
40 DX = 1 : DY = 1
50 POKE 1024 + X + 40 * Y, 81
60 FOR T = 1 TO 10 : NEXT
70 POKE 1024 + X + 40 * Y, 32
80 X = X + DX
90 IF X <= 0 OR X >= 39 THEN DX = -DX
100 Y = Y + DY
110 IF Y <= 0 OR Y >= 24 THEN DY = -DY
120 GOTO 50
Faça um programa semelhante no idioma / plataforma escolhido para rebater um objeto parecido com uma bola ao redor do seu terminal, tela, tela ou outra área de exibição visual.
Você não precisa imitar exatamente os gráficos PETSCII do C64, um simples O
ou o o
fará, nem precisa usar o GOTO
comando se ele ainda existir no seu idioma. Desde que sua bola comece no topo da tela e viaje na diagonal até atingir o limite da tela, e depois salte conforme a seguinte:
- Viajando para baixo e para a direita e atinge a parte inferior da área da tela, salta para cima e continua à direita;
- Viajando para cima e para a direita e atinge o limite mais à direita e salta para a esquerda e para cima;
- Viajando para a esquerda e para cima e atinge o topo, salta para a esquerda e para baixo;
- Viajando para a esquerda e para baixo e atinge o limite mais à esquerda, salta para a direita e para baixo;
- Atinge qualquer canto e inverte a direção;
Então estamos todos bem.
Você também não precisa mover 8 pixels de cada vez, como está acontecendo na listagem BASIC do C64; você pode mover um bloco de caracteres ou um pixel de cada vez, o que achar mais apropriado.
Para ver esta listagem BASIC funcionando, você pode digitá-la com este emulador online Commodore 64, desde que o seu navegador suporte Flash.
Respostas:
Código da máquina 6502 (C64),
908991 bytes+2 bytes porque precisa de um endereço de carregamento (não PIC por causa da auto-modificação)
Demonstração online
Uso:
sys49152
Eu tentei muito reduzir o tamanho (por exemplo, NÃO usar IRQs para cronometrar, mas estúpidos loops vazios), ainda é impossível atingir o nível do C64 BASIC jogado por Titus : ooh, bem. Mas parece menos cintilante;)
Explicação: (desmontagem de vice)
Apenas por diversão, aqui está uma variante mais profissional, usando um sprite para a bola e piscando a borda quando atingida em 385 bytes (contendo os dados do sprite usados no local ):
Demonstração online - | - procure a fonte do montador ca65
Comece e pare a bola quicando com
sys49152
.$C000
, o que requer a cópia do conteúdo da tela e do conjunto de caracteres (fonte).RUN/STOP + RESTORE
está quebrado, não tente.TI$
fica para trás também.fonte
inc $d020
maisjsr flash
;) hitshimselfwithalargetrout IT'S maravilhosa!.prg
arquivo válido e, da minha meta-pergunta aqui , eu tenho que incluí-lo ... provavelmente poderia deixá-lo de fora se o código fosse independente da posição.Utilitários Bash + Unix,
125117 bytesAnimação da amostra:
fonte
Montagem CP-1610 ,
67…6462 DECLEs = 78 bytesEste código deve ser executado em um Intellivision . Ele está usando um de seus sprites de hardware, conhecido como MOB (para Mobile Object).
Um código de operação CP-1610 é codificado com um valor de 10 bits, conhecido como 'DECLE'. Este programa tem 62 DECLEs, começando em US $ 4800 e terminando em US $ 483D.
Despejo hexadecimal + fonte
Saída
fonte
HTML (Microsoft Edge / Internet Explorer), 81 bytes
Finja que é 1998 com estas
<marquee>
tags aninhadas :Testado no Microsoft Edge, embora, pelo que li, o IE também deva dar suporte a tendas. Decididamente não funciona no Chrome.
A configuração
direction=up
economizaria 2 bytes, mas viole a regra de que a bola deve começar no topo da tela.fonte
direction
atributo.marquee
, isso é bastante criativo!TI-BASIC,
7170Tradução literal, eu não ficaria surpreso se houver truques para torná-lo menor.
A tela é indexada em 16x8 e 1, portanto as constantes são diferentes.
~
é a maneira do SourceCoder de escrever o símbolo de negação.Parece mais suave no hardware.
fonte
Anterior, 209 bytes
Isso assume um tamanho de tela de 80x25, mas você pode ajustar o intervalo facilmente substituindo o
"O"
(79) na última linha e o*64
(24) na segunda última linha (observe que a segunda última linha é executada da direita para a esquerda). A velocidade também pode ser ajustada substituindo o"2"
(50) na última linha.fonte
Java,
184176 bytesIsso faz uso das seqüências de escape ANSI para realocar o cursor, que é o objeto que salta ao redor de uma
85 x 25
tela do terminal. Salve em um arquivo chamadoA.java
.Ungolfed
Demo
fonte
Thread.sleep(50)
. E seus programas jogados e não jogados não correspondem.Clojure,
398380375 bytes-18 bytes, alterando o nome da fonte para uma string vazia para padronizá-la, alinhando as verificações de limite e corrigindo o problema de limite inferior (que você pode ver no GIF). Corrigindo os bytes realmente salvos.
-5 bytes, mudando para uma sintaxe de destruição mais sucinta e diminuindo a bola em um pixel.
Usa Quil .
Tentei mudar para o modo funcional, mas exigiu muito código extra e acabou sendo mais caro.
(Observe que a nova versão não salta mais cedo na parte inferior da tela, como ocorre no GIF.)
fonte
(+ 0 font-size)
lá. É embaraçoso. Vou consertar isso na próxima versão. Deve me salvar como 5 bytes.Raquete 247 bytes
Ungolfed:
Saída:
fonte
Geléia, 37 bytes
Com alguma ajuda desta resposta para obter o loop e os caracteres de escape corretos. Atualmente, ele salta em uma tela de 80x24, mas isso pode ser facilmente modificado no código.
Os coordenados em cada direção podem ser representados como elementos de duas listas
[0, 1,..., 24, 23,..., 1]
e[0, 1,..., 80, 79,..., 1]
, vamos chamá-losY
eX
, que são infinitamente repetidos. Essa repetição infinita pode ser emulada usando indexação modular - usandoị
no Jelly. Exemplo: nai
iteração, a bola está na posição(X[i%|X|], Y[i%|Y|]) = (iịY, iịX)
. A bola em movimento é apenas o cursor que é colocado em posição emitindoiịY
novas linhas eiịX
espaços.Demo
Explicação
fonte
SmileBASIC,
8574 bytesA posição da bola pode ser modelada com duas ondas triangulares, e a maneira mais curta que consegui produzi-las no SmileBASIC foi o arco-seno (seno (x)). (o algoritmo usando MOD foi mais longo, pois o SB usa em
MOD
vez de%
)fonte
CSS / HTML, 200 + 7 = 207 bytes
Esta versão mostra o tamanho da tela e também dá à animação uma sensação mais pixelizada:
Mostrar snippet de código
fonte
Dyalog APL, 44 bytes
Explicação:
{
...}⍨1 1
: chame a função fornecida com ⍺ = ⍵ = 1 1⎕SM∘←0,G←⍺+⍵
: armazenar⍺+⍵
emG
, exibir um0
naquele local no⎕SM
janela.⎕DL.1
: aguarde 1/10 de segundo⊃1 G∨.≥G⎕SD
: Verificação seG
está no⎕SM
limite da janela (1≥G
ouG≥⎕SD
,⎕SD
é o s creen d imensions)1-2×
: mapear[1,0]
para[¯1,1]
, para inverter a direção da viagem⍵×
: multiplique a direção atual da viagem por essaG∇
: recursão,G
seja o novo local (⍺
) e⍵....
a nova direção (⍵
).fonte
PHP,
1129794103102 bytesO
recupera um capital em uma grade de 40x25, começando no canto superior direito;imprime 99 novas linhas para limpar a tela.
Corra com
-nr
.A^K
=chr(10)
= nova linhaA^a
=chr(32)
= espaçofonte
for($d=$e=-1;;usleep(1e5))echo($r=str_repeat)(A^K,99),$r(A^a,$x+=$d*=$x%79?1:-1),O,$r(A^K,$y+=$e*=$y%24?1:-1);
. O módulo é falso em 0 e N e reverte a direção. Infelizmente, temos que iniciar $ d e $ e para -1, mas ainda conseguimos algumas economias.$x%79<=>.5
também funciona para os mesmos bytes.BASIC de Simons (C64),
6665 bytesUm byte salvo agradeceu @ShaunBebbers.
Eu preciso de apenas uma linha aqui, porque o Simons´ Basic tem uma função de módulo.
Afinal, isso requer um C64 físico e um módulo BASIC de Simons
(ou qualquer outra extensão BASIC que tenha uma
mod
função).Digite estes 69 caracteres:
{CLR}
é o PETSCII 147, que limpa a tela. Use Shift + CLR / HOME para digitar.bytecount
Quando guardadas em disco, que leva de 65 bytes, porque os comandos são tokenized:
for
,to
,poke
,abs
,next
egoto
são um byte de cada;mod
leva dois bytes.Isso gera 59 bytes de código mais 4 bytes para ponteiros e 2 bytes para o número da linha.
Para referência, consulte Mapeando o C64 e procure por
$800
(Texto do Programa BASIC).(Você pode encontrar a área de memória da tela de vídeo em
$400
.)demolir
O programa faz um loop
I
de 0 a 623 (= LCM de 48 e 78 menos 1). No loopI
é mapeado para 39..0..38 respectivamente 24..0..23(como o programa original).
Quando o loop é concluído, o programa é reiniciado pulando para a linha 0.
C64 BASIC,
7776 bytesInfelizmente, preciso de duas linhas, porque mesmo com todas as abreviações possíveis, seriam necessários 83 caracteres - muitos para usar o editor de linha C64:
(Um editor hexadecimal pode ser usado para criar uma linha mais longa - o que tornaria 73 bytes.)
fonte
:
e não;
goto
em sua versão de dois forro, comogoto
sem um número assumegoto 0
em BASIC 2$0400
para$07e7
; ou use sprites. Usar o Kernal com$ffd2
(acumulador de saída) funcionaria, pois você pode definir as posições X e Y no cursor com bastante facilidade (não me lembro da chamada para isso), mas talvez você precise evitar a posição do último caractere, caso isso o force um avanço de linha.Python 2,
176168 bytesIsso pressupõe um tamanho de terminal de 80x24. Definitivamente não é o ideal, mas eu sou novo no golfe, então sim.
Agradecemos a R. Kap por sugerir x% 79 <1 em vez de x <1 ou x> 79 e o mesmo para y.
fonte
x<1or x>78
porx%79<0
ey<1or y>22
pory%23<1
.Rebol / Vista,
284266bytesUngolfed:
fonte
Bytes C 294
Versão não destruída:
Explicação
graphics.h
no meu/usr/include
diretório. Portanto, eu procurei e é isso que eu encontrei. É uma implementação de TurboC Graphics usando SDL para Linux. Pode-se também usar o OpenGL. No Windows, acho que já está instalado, não tenho certeza sobre o MacOS.void initgraph(int *graphdriver, int *graphmode, char *pathtodriver);
inicializa o sistema e coloca-o no modo gráfico; nesse caso, o driver gráfico é detectado automaticamente. Por favor, consulte este link para mais detalhes.x
ey
são coordenadas que determinam a posição da bola.a
eb
são sinalizadores,a
é definido como zero quando ox
valor cai abaixo de 60 eb
é definido como zero quandoy
cai abaixo de 60.x
ey
excedem os valores limites da janela, e as coordenadas são ajustadas de acordo.usleep
para que minha CPU não fique estressada.closegraph()
chamada para fechar a janela. Mas está faltando aqui.Deve ser compilado com o sinalizador de vinculador
-lgraph
Ele roda mais suave em hardware real. :)
fonte
graphics.h
. Esta resposta askubuntu.com/questions/525051/… foi útil.MATL , 42 bytes
Isso usa uma tela e um personagem de 70 × 16
O
. Se você esperar alguns saltos, verá a bola acertando um canto.Experimente o MATL Online!
O tamanho da tela pode ser facilmente modificado no código. A parte relevante é
8E70
, que empurra8
, dobra e empurra70
. Por exemplo, para uma tela de 80 × 25, substitua por5W80
, que empurra5
, esquadrinha e empurra80
(ou substitua por25 80
, mas isso requer mais um byte).Além disso, adicionar
tD
no final do código mostra a posição atual em tempo real (vertical, depois horizontal,1 1
é superior esquerdo). Como exemplo, para um80×18
tela,Experimente também!
Explicação
Isso usa um loop infinito. A posição é mantida na área de transferência
H
como um vetor 1 × 2 e a direção é mantida na área de transferênciaI
como um vetor 1 × 2 com entradas1
ou-1
.Cada iteração limpa a tela, define uma matriz de espaços, escreve um
O
na posição relevante e a exibe. Em seguida, a posição e o diretório precisam ser atualizados.A posição é
1
baseada e, portanto, as bordas da tela são1
e o tamanho máximo da tela. Portanto, se o tamanho da tela do módulo de posição fornecer0
ou1
no primeiro ou no segundo componentes, o que significa que atingimos uma aresta vertical ou horizontal, respectivamente, esse componente do vetor de direção será negado. Depois disso, a nova direção é adicionada à posição atual para obter a nova posição.fonte
Aqui está a lista do ZX Spectrum.
fonte
Maldições C +, 190 bytes
Explicação:
fonte
Lua ( 2D ), 130 bytes
Lua não é a melhor linguagem para codificar golfe, mas aqui está você! Alguns pontos que vale a pena mencionar:
O tamanho da tela padrão é 800 x 600. Ele pode ser alterado no arquivo de configuração, mas não vi nenhuma restrição de tamanho, então deixei como está.
love.draw()
é a função de desenho de LÖVE e tem um nome predeterminado. Funções alternativas do LÖVE que poderiam ser usadas seriamlove.update(dt)
elove.run()
- a primeira sendo mais longa, em bytes, e a segunda mais curta, sim, mas sem um loop infinito embutido. Assim,draw()
parece ser a nossa melhor aposta aqui.A versão acima usa
love.graphics.points
para desenhar a bola. Embora seja mais curto, não tenho certeza se é permitido. Aqui está um GIF de como ele é executado:Como você pode ver (ou talvez não possa), há um único pixel se movendo na tela. Enquanto isso economiza bytes, não é o resultado mais satisfatório.
Então, eu fiz uma solução alternativa de 131 bytes :
Este usa
love.graphics.print
- que imprime texto - e um0
como uma bola, tornando-o muito mais visível e atraente.fonte
CHIP-8,
363428 bytesNão há truques sofisticados aqui ...
Requer um intérprete que desenhe sprites corretamente (apenas um sprite pode ser desenhado por quadro, o que torna o programa mais lento o suficiente para que você possa vê-lo).
Vídeo de baixa qualidade
fonte
ZX Spectrum BASIC - 179 bytes
Aqui está apenas um pouco condensado. São 179 bytes com os gráficos de bola incluídos
fonte
o
ouO
você poderá salvar alguns bytes na lista simbólica; você também é capaz de editar respostas anteriores quando você tem soluções melhoradas, ao invés de re-responder a mesma pergunta