Inspirado en este listado de la Guía del usuario de Commodore 64:
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
Haga un programa similar en el idioma / plataforma que elija para hacer rebotar un objeto similar a una pelota alrededor de su terminal, pantalla, lienzo u otra área de visualización.
No tiene que imitar los gráficos PETSCII del C64 exactamente, de manera simple Oo osuficiente, ni tiene que usar el GOTOcomando si todavía existe en su idioma. Siempre que su bola comience en la parte superior de su lienzo y viaje en diagonal hasta que llegue al límite del lienzo, y luego rebote en consecuencia, de la siguiente manera:
- Viajando hacia abajo y hacia la derecha y toca la parte inferior del área de la pantalla, rebota y continúa hacia la derecha;
- Viaja hacia arriba y hacia la derecha y golpea el límite más a la derecha, y rebota hacia la izquierda y hacia arriba;
- Viajando hacia la izquierda y hacia arriba y golpea la parte superior, rebota hacia la izquierda y hacia abajo;
- Viajando hacia la izquierda y hacia abajo y llega al límite más a la izquierda, rebota hacia la derecha y hacia abajo;
- Golpea cualquier esquina e invierte la dirección;
Entonces todos estamos bien.
Tampoco tiene que mover la bola 8 píxeles a la vez, como está sucediendo en la lista BÁSICA en el C64; puede mover un bloque de caracteres o un píxel a la vez, lo que considere más apropiado.
Para ver este listado BÁSICO funcionando, puede escribirlo con este emulador en línea Commodore 64 siempre que su navegador admita Flash.

Respuestas:
6502 código máquina (C64),
908991 bytes+2 bytes porque necesita una dirección de carga (no PIC debido a la auto modificación)
Demostración en línea
Uso:
sys49152Traté de reducir el tamaño (p. Ej., NO utilicé IRQ para medir el tiempo, sino estúpidos bucles vacíos), todavía es imposible alcanzar el nivel del golf básico C64 de Titus : oh, bueno. Pero parece menos parpadeante;)
Explicación: (vice desmontaje)
Solo por diversión, aquí hay una variante más profesional que usa un sprite para la pelota y parpadea el borde cuando se golpea en 385 bytes (que contiene los datos del sprite que se usan en su lugar ):
Demostración en línea - | - explore la fuente del ensamblador ca65
Comience y pare la pelota que rebota con
sys49152.$C000, lo que requiere copiar el contenido de la pantalla y el juego de caracteres (fuente).RUN/STOP + RESTOREestá roto, no lo intentes.TI$se retrasará.fuente
inc $d020más quejsr flash;) golpearse a sí mismo con una gran trucha ¡ Es maravilloso!.prgarchivo válido y de mi meta pregunta aquí que tomo, tengo que incluirla ... probablemente podría omitirla si el código fuera independiente de la posición.Utilidades Bash + Unix,
125117 bytesAnimación de muestra de ejecución:
fuente
Conjunto CP-1610 ,
67…6462 DECLEs = 78 bytesEste código está destinado a ejecutarse en una Intellivision . Está utilizando uno de sus sprites de hardware, conocido como MOB (para Mobile Object).
Un código de operación CP-1610 está codificado con un valor de 10 bits, conocido como 'DECLE'. Este programa tiene una duración de 62 DECLE, que comienza en $ 4800 y termina en $ 483D.
Volcado hexadecimal + fuente
Salida
fuente
HTML (Microsoft Edge / Internet Explorer), 81 bytes
Imagina que es 1998 con estas
<marquee>etiquetas anidadas :Probado en Microsoft Edge, aunque por lo que he leído, IE también debería ser compatible con las carpas. Decididamente no funciona en Chrome.
La configuración
direction=upahorraría 2 bytes, pero rompería la regla de que la pelota tiene que comenzar en la parte superior del lienzo.fuente
directionatributo.marquee, ¡eso es bastante creativo!TI-BASIC,
7170Traducción literal, no me sorprendería si hay trucos para hacerlo más pequeño.
La pantalla tiene 16x8 y está indexada en 1, por lo que las constantes son diferentes.
~es la forma de SourceCoder de escribir el símbolo de negación.Se ve más suave en el hardware.
fuente
Befunge, 209 bytes
Esto supone un tamaño de pantalla de 80x25, pero puede ajustar fácilmente el rango reemplazando el
"O"(79) en la última línea y el*64(24) en la segunda última línea (tenga en cuenta que la segunda última línea se ejecuta de derecha a izquierda). La velocidad también se puede ajustar reemplazando el"2"(50) en la última línea.fuente
Java,
184176 bytesEsto hace uso de las secuencias de escape ANSI para reubicar el cursor, que es el objeto que rebota alrededor de una
85 x 25pantalla de terminal. Guardar en un archivo llamadoA.java.Sin golf
Manifestación
fuente
Thread.sleep(50). Y sus programas de golf y sin golf no coinciden.Clojure,
398380375 bytes-18 bytes cambiando el nombre de la fuente a una cadena vacía para predeterminarlo, alineando las comprobaciones de límites y solucionando el problema del límite inferior (que puede ver en el GIF). Arreglando eso que realmente guardó bytes.
-5 bytes cambiando a una sintaxis de desestructuración más sucinta y reduciendo la bola por un píxel.
Utiliza Quil .
Traté de cambiar al modo funcional, pero requirió mucho código extra y terminó siendo más costoso.
(Tenga en cuenta que la nueva versión no rebota temprano en la parte inferior de la pantalla como lo hace en el GIF).
fuente
(+ 0 font-size)allí. Eso es vergonzoso. Lo arreglaré en la próxima versión. Debería salvarme como 5 bytes.Raqueta 247 bytes
Sin golf:
Salida:
fuente
Jalea, 37 bytes
Con algo de ayuda de esta respuesta para acertar y escapar de los caracteres correctamente. Actualmente rebota en una pantalla de 80x24, pero eso puede modificarse fácilmente en el código.
Las coordenadas en cada dirección pueden representarse como elementos de dos listas
[0, 1,..., 24, 23,..., 1]y[0, 1,..., 80, 79,..., 1], llamémoslasYyX, que se repiten infinitamente. Esta repetición infinita se puede emular usando indexación modular, usandoịen Jelly. Ejemplo: en laiiteración la pelota está en posición(X[i%|X|], Y[i%|Y|]) = (iịY, iịX). La bola en movimiento es solo el cursor que se coloca en posición emitiendoiịYnuevas líneas yiịXespacios.Manifestación
Explicación
fuente
SmileBASIC,
8574 bytesLa posición de la pelota se puede modelar con 2 ondas triangulares, y la forma más corta que pude encontrar para producirlas en SmileBASIC fue arcsine (seno (x)). (el algoritmo que usa MOD fue más largo ya que SB usa en
MODlugar de%)fuente
CSS / HTML, 200 + 7 = 207 bytes
Esta versión le muestra el tamaño del lienzo y también le da a la animación una sensación más pixelada:
Mostrar fragmento de código
fuente
Dyalog APL, 44 bytes
Explicación:
{...}⍨1 1: llama a la función dada con ⍺ = ⍵ = 1 1⎕SM∘←0,G←⍺+⍵: almacenar⍺+⍵enG, mostrar un0en esa ubicación en la⎕SMventana.⎕DL.1: espere 1/10 de segundo⊃1 G∨.≥G⎕SD: Verificación siGestá en el⎕SMlímite de la ventana (1≥GoG≥⎕SD,⎕SDes la s Creen d IMENSIONES)1-2×: mapa[1,0]sobre[¯1,1], para voltear la dirección de viaje⍵×: multiplica la dirección de viaje actual por esoG∇: recursión, deje queGsea la nueva ubicación (⍺) y⍵....sea la nueva dirección (⍵).fuente
PHP,
1129794103102 bytesrebota un capital
Oen una cuadrícula de 40x25, comenzando en la esquina superior derecha;imprime 99 líneas nuevas para borrar la pantalla.
Corre con
-nr.A^K=chr(10)= nueva líneaA^a=chr(32)= espaciofuente
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);. El módulo es falso en 0 y N y revierte la dirección. Lamentablemente, tenemos que iniciar $ d y $ e a -1, pero aún así obtener algunos ahorros.$x%79<=>.5También funciona para los mismos bytes.Simons´ BASIC (C64),
6665 bytesUn byte guardado gracias @ShaunBebbers.
Solo necesito una línea aquí, porque Simons 'Basic tiene una función de módulo.
De hecho, esto requiere un C64 físico y un módulo BÁSICO de Simons
(o cualquier otra extensión BÁSICA que tenga una
modfunción).Escriba estos 69 caracteres:
{CLR}es PETSCII 147, que borra la pantalla. Use Shift + CLR / HOME para escribirlo.bytecount
Cuando graba en el disco, se necesita 65 bytes, ya que los comandos se tokenized:
for,to,poke,abs,nextygotoson un byte cada uno;modtoma dos bytesEso genera 59 bytes de código más 4 bytes para punteros y 2 bytes para el número de línea.
Como referencia, consulte Mapeo del C64 y busque
$800(Texto de programa BÁSICO).(Puede encontrar el Área de memoria de la pantalla de video en
$400.)Descompostura
El programa realiza un bucle
Ide 0 a 623 (= LCM de 48 y 78 menos 1). En el lazoIse asigna a 39..0..38 respectivamente 24..0..23(como lo hace el programa original).
Cuando finaliza el ciclo, el programa se reinicia saltando a la línea 0.
C64 BASIC,
7776 bytesDesafortunadamente, necesito dos líneas, porque incluso con todas las abreviaturas posibles, tomaría 83 caracteres, demasiados para usar el editor de líneas C64:
(Se podría usar un editor hexadecimal para crear una línea más larga, lo que lo convertiría en 73 bytes).
fuente
:y no;gotoen su versión de dos líneas, ya quegotosin un número asumegoto 0en BASIC 2$0400a$07e7; o usa sprites. El uso de Kernal con$ffd2(acumulador de salida) funcionaría, ya que puede configurar la posición X e Y en el cursor con bastante facilidad (no recuerdo la llamada para eso), pero es posible que deba evitar la última posición del personaje en caso de que fuerce Un avance de línea.Python 2,
176168bytesEsto supone un tamaño de terminal de 80x24. Definitivamente no es óptimo, pero soy nuevo en el golf, así que sí.
Gracias a R. Kap por sugerir el x% 79 <1 en lugar de x <1 o x> 79 y lo mismo para y.
fuente
x<1or x>78conx%79<0yy<1or y>22cony%23<1.Rebol / View,
284266 bytesSin golf:
fuente
C 294 bytes
Versión sin golf:
Explicación
graphics.ha mi/usr/includedirectorio. Por lo tanto, busqué y esto es lo que encontré. Es una implementación de Gráficos TurboC que usa SDL para Linux. También se podría usar OpenGL. En Windows, supongo que ya está instalado, no estoy seguro acerca de MacOS.void initgraph(int *graphdriver, int *graphmode, char *pathtodriver);inicializa el sistema y lo pone en modo gráfico, en este caso, el controlador de gráficos se detecta automáticamente. Por favor, consulte este enlace para más detalles.xyyson coordenadas que determinan la posición de la pelota.aybson banderas,ase establece en cero cuando elxvalor cae por debajo de 60 ybse establece en cero cuandoycae por debajo de 60.xyyexceden los valores límite de la ventana, y las coordenadas se ajustan en consecuencia.usleeppara que mi CPU no se estrese.closegraph()llamada para cerrar la ventana. Pero falta aquí.Debe compilarse con la bandera del vinculador
-lgraphFunciona mejor en hardware real. :)
fuente
graphics.h. Esta respuesta askubuntu.com/questions/525051/… fue útil.MATL , 42 bytes
Utiliza una pantalla y un personaje de 70 × 16
O. Si espera algunos rebotes, verá que la pelota golpea una esquina.¡Pruébelo en MATL Online!
El tamaño de la pantalla se puede modificar fácilmente en el código. La parte relevante es
8E70, que empuja8, dobla y empuja70. Por ejemplo, para una pantalla de 80 × 25, reemplace por5W80, que empuja5, cuadra y empuja80(o reemplaza por25 80, pero eso requiere un byte más).Además, agregar
tDal final del código muestra la posición actual en tiempo real (vertical, luego horizontal,1 1es la esquina superior izquierda). Como ejemplo, para una80×18pantalla,¡Pruébalo también!
Explicación
Esto usa un bucle infinito. La posición se mantiene en el portapapeles
Hcomo un vector 1 × 2, y la dirección se mantiene en el portapapelesIcomo un vector 1 × 2 con entradas1o-1.Cada iteración borra la pantalla, define una matriz de espacios, escribe un
Oen la posición relevante y lo muestra. Entonces la posición y directio necesitan ser actualizados.La posición se
1basa y, por lo tanto, los bordes de la pantalla1y el tamaño máximo de la pantalla. Entonces, si el tamaño de la pantalla del módulo de posición proporciona0o1en el primer o segundo componente, lo que significa que hemos alcanzado un borde vertical u horizontal respectivamente, ese componente del vector de dirección se niega. Después de eso, la nueva dirección se agrega a la posición actual para obtener la nueva posición.fuente
Aquí está la lista de ZX Spectrum.
fuente
C + maldiciones, 190 bytes
Explicación:
fuente
Lua ( LÖVE 2D ), 130 bytes
Lua no es el mejor idioma cuando se trata de código de golf, ¡pero aquí tienes! Algunos puntos que vale la pena mencionar:
El tamaño de lienzo predeterminado es 800 x 600. Se puede cambiar en el archivo de configuración, pero no vi ninguna restricción de tamaño, así que lo dejé como está.
love.draw()es la función de dibujo de LÖVE y tiene un nombre predeterminado. Las funciones alternativas de LÖVE que podrían usarse seríanlove.update(dt)ylove.run(), la primera más larga, en bytes, y la segunda más corta, sí, pero sin un bucle infinito incorporado. Por lo tanto,draw()parece ser nuestra mejor apuesta aquí.La versión anterior se utiliza
love.graphics.pointspara dibujar la pelota. Aunque más corto, no estoy seguro de que esté permitido. Aquí hay un GIF de cómo funciona:Como puede ver (o quizás no puede), hay un solo píxel moviéndose en la pantalla. Si bien eso ahorra bytes, no es el resultado más satisfactorio.
Así que hice una solución alternativa de 131 bytes :
Éste usa
love.graphics.print, que imprime texto, y a0como una bola, lo que lo hace mucho más visible y atractivo.fuente
CHIP-8,
363428 bytesNo hay trucos elegantes aquí ...
Requiere un intérprete que dibuje sprites correctamente (solo se puede dibujar un sprite por cuadro, lo que ralentiza el programa lo suficiente como para que pueda verlo).
Video de baja calidad
fuente
ZX Spectrum BASIC - 179 bytes
Aquí solo se condensa un poco. Son 179 bytes con los gráficos de la pelota incluidos
fuente
ooOpuede guardar algunos bytes en la lista simbólica; también puede editar respuestas anteriores cuando haya mejorado las soluciones, en lugar de volver a responder la misma pregunta