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 O
o o
suficiente, ni tiene que usar el GOTO
comando 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:
sys49152
Traté 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 + RESTORE
está roto, no lo intentes.TI$
se retrasará.fuente
inc $d020
más quejsr flash
;) golpearse a sí mismo con una gran trucha ¡ Es maravilloso!.prg
archivo 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=up
ahorraría 2 bytes, pero rompería la regla de que la pelota tiene que comenzar en la parte superior del lienzo.fuente
direction
atributo.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 25
pantalla 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émoslasY
yX
, que se repiten infinitamente. Esta repetición infinita se puede emular usando indexación modular, usandoị
en Jelly. Ejemplo: en lai
iteració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ịY
nuevas líneas yiịX
espacios.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
MOD
lugar 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 un0
en esa ubicación en la⎕SM
ventana.⎕DL.1
: espere 1/10 de segundo⊃1 G∨.≥G⎕SD
: Verificación siG
está en el⎕SM
límite de la ventana (1≥G
oG≥⎕SD
,⎕SD
es 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 queG
sea la nueva ubicación (⍺
) y⍵....
sea la nueva dirección (⍵
).fuente
PHP,
1129794103102 bytesrebota un capital
O
en 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<=>.5
Tambié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
mod
funció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
,next
ygoto
son un byte cada uno;mod
toma 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
I
de 0 a 623 (= LCM de 48 y 78 menos 1). En el lazoI
se 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;
goto
en su versión de dos líneas, ya quegoto
sin un número asumegoto 0
en BASIC 2$0400
a$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>78
conx%79<0
yy<1or y>22
cony%23<1
.Rebol / View,
284266 bytesSin golf:
fuente
C 294 bytes
Versión sin golf:
Explicación
graphics.h
a mi/usr/include
directorio. 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.x
yy
son coordenadas que determinan la posición de la pelota.a
yb
son banderas,a
se establece en cero cuando elx
valor cae por debajo de 60 yb
se establece en cero cuandoy
cae por debajo de 60.x
yy
exceden los valores límite de la ventana, y las coordenadas se ajustan en consecuencia.usleep
para que mi CPU no se estrese.closegraph()
llamada para cerrar la ventana. Pero falta aquí.Debe compilarse con la bandera del vinculador
-lgraph
Funciona 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
tD
al final del código muestra la posición actual en tiempo real (vertical, luego horizontal,1 1
es la esquina superior izquierda). Como ejemplo, para una80×18
pantalla,¡Pruébalo también!
Explicación
Esto usa un bucle infinito. La posición se mantiene en el portapapeles
H
como un vector 1 × 2, y la dirección se mantiene en el portapapelesI
como un vector 1 × 2 con entradas1
o-1
.Cada iteración borra la pantalla, define una matriz de espacios, escribe un
O
en la posición relevante y lo muestra. Entonces la posición y directio necesitan ser actualizados.La posición se
1
basa y, por lo tanto, los bordes de la pantalla1
y el tamaño máximo de la pantalla. Entonces, si el tamaño de la pantalla del módulo de posición proporciona0
o1
en 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.points
para 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 a0
como 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
o
oO
puede 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