Inspiré par cette liste du Guide de l'utilisateur du 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
Créez un programme similaire dans la langue / plate-forme de votre choix pour faire rebondir un objet semblable à une balle autour de votre terminal, écran, toile ou autre zone d'affichage visuel.
Vous n'avez pas à imiter exactement les graphiques PETSCII du C64, un simple O
ou o
fera l'affaire, ni à utiliser la GOTO
commande si elle existe toujours dans votre langue. Tant que votre balle commence au sommet de votre toile et se déplace en diagonale jusqu'à ce qu'elle atteigne une limite de toile, puis rebondit en conséquence, comme suit:
- Déplacement vers le bas et à droite et frappe le bas de la zone d'écran, rebondit et continue à droite;
- Voyager vers le haut et vers la droite et frappe la limite la plus à droite, et rebondit vers la gauche et vers le haut;
- Voyager à gauche et en haut et frappe le haut, rebondit à gauche et en bas;
- Voyager à gauche et en bas et atteint la limite la plus à gauche, rebondit à droite et en bas;
- Frappe n'importe quel coin et inverse la direction;
Ensuite, nous sommes tous bons.
Vous n'avez pas non plus à déplacer la balle de 8 pixels à la fois, comme c'est le cas dans la liste BASIC du C64; vous pouvez déplacer un bloc de caractères ou un pixel à la fois, selon ce qui vous semble le plus approprié.
Pour voir cette liste BASIC fonctionner, vous pouvez la saisir avec cet émulateur en ligne Commodore 64 à condition que votre navigateur prenne en charge Flash.
Réponses:
6502 code machine (C64),
908991 octets+2 octets car il a besoin d' une adresse de chargement (pas PIC à cause de l'auto-modification)
Démo en ligne
Usage:
sys49152
J'ai essayé de réduire la taille (par exemple en n'utilisant pas d'IRQ pour le chronométrage mais des boucles vides stupides à la place), toujours impossible d'atteindre le niveau du C64 BASIC golfé de Titus : o oh, bien. Mais ça a l'air moins scintillant;)
Explication: (vice démontage)
Juste pour le plaisir, voici une variante plus professionnelle utilisant un sprite pour le ballon et faisant clignoter la bordure lorsqu'elle est frappée en 385 octets (contenant les données de sprite utilisées sur place ):
Démo en ligne - | - Parcourir la source de l'assembleur ca65
Démarrez et arrêtez la balle qui rebondit avec
sys49152
.$C000
, ce qui nécessite de copier le contenu de l'écran et le jeu de caractères (police).RUN/STOP + RESTORE
est cassé, n'essayez pas.TI$
sera également à la traîne.la source
inc $d020
plusjsr flash
;) hitshimselfwithalargetrout C'est merveilleux!.prg
fichier valide et de ma méta question ici je suppose que je dois l'inclure ... pourrait probablement le laisser de côté si le code était indépendant de la position.Utilitaires bash + Unix,
125117 bytesAnimation de l'exemple de course:
la source
Ensemble CP-1610 ,
67…6462 DECLEs = 78 octetsCe code est destiné à être exécuté sur une Intellivision . Il utilise l'un de ses sprites matériels, connu sous le nom de MOB (pour Mobile Object).
Un opcode CP-1610 est codé avec une valeur de 10 bits, connue sous le nom de «DECLE». Ce programme dure 62 DECLEs, commençant à 4800 $ et se terminant à 483D $.
Vidage hexadécimal + source
Production
la source
HTML (Microsoft Edge / Internet Explorer), 81 octets
Imaginez que c'est 1998 avec ces
<marquee>
balises imbriquées :Testé dans Microsoft Edge, mais d'après ce que j'ai lu, IE devrait également prendre en charge les chapiteaux. Décidément ne fonctionne pas dans Chrome.
Le réglage
direction=up
permettrait d'économiser 2 octets, mais enfreindrait la règle selon laquelle la balle doit commencer en haut du canevas.la source
direction
attribut.marquee
, c'est assez créatif!TI-BASIC,
7170Traduction assez littérale, je ne serais pas surpris s'il existe des astuces pour le réduire.
L'écran est 16x8 et indexé 1 donc les constantes sont différentes.
~
est le moyen SourceCoder d'écrire le symbole de négation.Il semble plus fluide sur le matériel.
la source
Befunge, 209 octets
Cela suppose une taille d'écran de 80x25, mais vous pouvez facilement modifier la plage en remplaçant le
"O"
(79) sur la dernière ligne et le*64
(24) sur l'avant-dernière ligne (notez que l'avant-dernière ligne est exécutée de droite à gauche). La vitesse peut également être ajustée en remplaçant le"2"
(50) sur la dernière ligne.la source
Java,
184176 octetsCela utilise les séquences d'échappement ANSI pour déplacer le curseur, qui est l'objet qui rebondit autour d'un
85 x 25
écran de terminal. Enregistrez dans un fichier nomméA.java
.Non golfé
Démo
la source
Thread.sleep(50)
. Et vos programmes golfés et non golfés ne correspondent pas.Clojure,
398380375 octets-18 octets en changeant le nom de la police en une chaîne vide pour la définir par défaut, en soulignant les vérifications des limites et en corrigeant le problème de limite inférieure (que vous pouvez voir dans le GIF). Correction des octets réellement enregistrés.
-5 octets en passant à une syntaxe de déstructuration plus succincte et en rétrécissant la boule d'un pixel.
Utilise Quil .
J'ai essayé de passer en mode fonctionnel, mais cela nécessitait beaucoup de code supplémentaire et a fini par être plus cher.
(Remarque, la nouvelle version ne rebondit pas tôt le long du bas de l'écran comme elle le fait dans le GIF.)
la source
(+ 0 font-size)
. C'est embarrassant. Je corrigerai cela dans la prochaine version. Devrait me sauver comme 5 octets.Raquette 247 octets
Non golfé:
Production:
la source
Gelée, 37 octets
Avec un peu d'aide de cette réponse pour obtenir la bonne boucle et les caractères d'échappement. Actuellement, il rebondit dans un écran 80x24, mais cela peut être facilement modifié dans le code.
Les coördinates dans chaque direction peuvent être représentés comme des éléments de deux listes
[0, 1,..., 24, 23,..., 1]
et[0, 1,..., 80, 79,..., 1]
, appelons-lesY
etX
, qui sont répétés à l'infini. Cette répétition infinie peut être émulée à l'aide d'une indexation modulaire - à l'aideị
de Jelly. Exemple: lors de lai
itération, la balle est en position(X[i%|X|], Y[i%|Y|]) = (iịY, iịX)
. La balle en mouvement n'est que le curseur qui se met en place en émettant desiịY
nouvelles lignes et desiịX
espaces.Démo
Explication
la source
SmileBASIC,
8574 octetsLa position de la balle peut être modélisée avec 2 ondes triangulaires, et le moyen le plus court que j'ai pu trouver pour les produire dans SmileBASIC était l'arc sinus (sinus (x)). (l'algorithme utilisant MOD était plus long puisque SB utilise à la
MOD
place de%
)la source
CSS / HTML, 200 + 7 = 207 octets
Cette version vous montre la taille de la toile et donne également à l'animation une sensation plus pixélisée:
Afficher l'extrait de code
la source
Dyalog APL, 44 octets
Explication:
{
...}⍨1 1
: appeler la fonction donnée avec ⍺ = ⍵ = 1 1⎕SM∘←0,G←⍺+⍵
: stocker⍺+⍵
dansG
, afficher un0
à cet endroit dans le⎕SM
fenêtre.⎕DL.1
: attendez 1 / 10e de seconde⊃1 G∨.≥G⎕SD
: Contrôle siG
est à la⎕SM
limite de la fenêtre (1≥G
ouG≥⎕SD
,⎕SD
est le s creen d imensions)1-2×
: carte[1,0]
sur[¯1,1]
, pour inverser le sens de la marche⍵×
: multipliez le sens de déplacement actuel par celuiG∇
: récursivité,G
soit le nouvel emplacement (⍺
) et⍵....
la nouvelle direction (⍵
).la source
PHP,
1129794103102 octetsfait rebondir un capital
O
sur une grille de 40x25, en commençant par le coin supérieur droit;imprime 99 nouvelles lignes pour effacer l'écran.
Courez avec
-nr
.A^K
=chr(10)
= nouvelle ligneA^a
=chr(32)
= espacela source
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);
. Le modulo est faux à 0 et N et inverse la direction. Malheureusement, nous devons initier $ d et $ e à -1, mais nous réalisons tout de même quelques économies.$x%79<=>.5
fonctionne également pour les mêmes octets.BASIC Simons (C64),
6665 octetsUn octet enregistré grâce à @ShaunBebbers.
Je n'ai besoin que d'une ligne ici, car Simons´ Basic a une fonction modulo.
AfaIk, cela nécessite un C64 physique et un module BASIC de Simons
(ou toute autre extension BASIC ayant une
mod
fonction).Tapez ces 69 caractères:
{CLR}
est PETSCII 147, qui efface l'écran. Utilisez Shift + CLR / HOME pour le saisir.bytecount
Lors de l' enregistrement sur le disque, cela prend 65 octets, car les commandes sont tokenizés:
for
,to
,poke
,abs
,next
etgoto
sont chacun un octet;mod
prend deux octets.Cela fait 59 octets de code plus 4 octets pour les pointeurs et 2 octets pour le numéro de ligne.
Pour référence, voir Mappage du C64 et recherchez
$800
(Texte du programme BASIC).(Vous pouvez trouver la zone de mémoire de l'écran vidéo sur
$400
.)panne
Le programme boucle
I
de 0 à 623 (= LCM de 48 et 78 moins 1). Dans la boucleI
est mappé à 39..0..38 respectivement 24..0..23(comme le fait le programme d'origine).
Lorsque la boucle est terminée, le programme est redémarré en sautant à la ligne 0.
C64 BASIC,
7776 octetsMalheureusement, j'ai besoin de deux lignes, car même avec toutes les abréviations possibles, il faudrait 83 caractères - trop pour utiliser l'éditeur de ligne C64:
(Un éditeur hexadécimal pourrait être utilisé pour créer une ligne plus longue - ce qui en ferait 73 octets.)
la source
:
et non;
goto
dans votre version à deux lignes , cargoto
sans un nombre supposegoto 0
sur BASIC 2$0400
à$07e7
; ou utilisez des sprites. L'utilisation du Kernal avec$ffd2
(accumulateur de sortie) fonctionnerait car vous pouvez définir les positions X et Y sur le curseur assez facilement (je ne me souviens pas de l'appel pour cela), mais vous devrez peut-être éviter la dernière position du caractère au cas où cela forcerait un saut de ligne.Python 2,
176168 octetsCela suppose une taille de terminal de 80x24. Certainement pas optimal mais je suis nouveau au golf alors oui.
Merci à R. Kap d'avoir suggéré le x% 79 <1 au lieu de x <1 ou x> 79 et idem pour y.
la source
x<1or x>78
parx%79<0
ety<1or y>22
pary%23<1
.Rebol / View,
284266 octetsNon golfé:
la source
C 294 octets
Version non golfée:
Explication
graphics.h
dans mon/usr/include
répertoire. Par conséquent, j'ai cherché et cela que j'ai trouvé. Il s'agit d'une implémentation TurboC Graphics utilisant SDL pour Linux. On pourrait également utiliser OpenGL. Dans Windows, je suppose qu'il est déjà installé, pas sûr de MacOS.void initgraph(int *graphdriver, int *graphmode, char *pathtodriver);
initialise le système et le met en mode graphique, dans ce cas, le pilote graphique est automatiquement détecté. Veuillez vous référer à ce lien pour plus de détails.x
ety
sont des coordonnées qui déterminent la position de la balle.a
etb
sont des indicateurs,a
est mis à zéro lorsque lax
valeur tombe en dessous de 60 etb
est mis à zéro lorsquey
tombe en dessous de 60.x
ety
dépassent les valeurs limites de la fenêtre, et les coordonnées sont ajustées en conséquence.usleep
pour que mon CPU ne soit pas stressé.closegraph()
appel pour fermer la fenêtre. Mais il manque ici.Doit être compilé avec l'indicateur de l'éditeur de liens
-lgraph
Il fonctionne plus facilement sur du vrai matériel. :)
la source
graphics.h
. Cette réponse askubuntu.com/questions/525051/… était utile.MATL , 42 octets
Cela utilise un écran et un caractère 70 × 16
O
. Si vous attendez quelques rebonds, vous verrez la balle frapper un coin.Essayez MATL en ligne!
La taille de l'écran peut être facilement modifiée dans le code. La partie pertinente est
8E70
, qui la pousse8
, la double et la pousse70
. Par exemple, pour un écran 80 × 25, remplacez par5W80
, qui le pousse5
, le met au carré et le pousse80
(ou le remplace par25 80
, mais cela nécessite un octet de plus).De plus, l'ajout
tD
à la fin du code montre la position actuelle en temps réel (vertical, puis horizontal, en1 1
haut à gauche). Par exemple, pour un80×18
écran,Essayez-le aussi!
Explication
Cela utilise une boucle infinie. La position est conservée dans le presse-papiers en
H
tant que vecteur 1 × 2 et la direction est conservée dans le presse-papiers enI
tant que vecteur 1 × 2 avec les entrées1
ou-1
.Chaque itération efface l'écran, définit une matrice d'espaces, écrit un
O
à la position appropriée et l'affiche. Ensuite, la position et la direction doivent être mises à jour.La position est
1
basée sur, et donc les bords de l'écran sont1
et la taille maximale de l'écran. Donc, si la taille de l'écran modulo de position donne0
ou1
dans les première ou deuxième composantes, ce qui signifie que nous avons atteint un bord vertical ou horizontal respectivement, cette composante du vecteur de direction est annulée. Après cela, la nouvelle direction est ajoutée à la position actuelle pour obtenir la nouvelle position.la source
Voici la liste ZX Spectrum.
la source
C + curses, 190 octets
Explication:
la source
Lua ( LÖVE 2D ), 130 octets
Lua n'est pas la meilleure langue en matière de golf de code, mais c'est parti! Quelques points à noter:
La taille par défaut du canevas est 800 x 600. Elle peut être modifiée dans le fichier de configuration, mais je n'ai vu aucune restriction de taille, je l'ai donc laissée telle quelle.
love.draw()
est la fonction de dessin de LÖVE et elle a un nom prédéterminé. Les autres fonctions LÖVE qui pourraient être utilisées seraientlove.update(dt)
etlove.run()
- la première étant plus longue, en octets, et la seconde étant plus courte, oui, mais sans boucle infinie intégrée. Ainsi,draw()
semble être notre meilleur pari ici.La version ci-dessus utilise
love.graphics.points
pour tirer la balle. Bien que plus court, je ne suis pas sûr que ce soit autorisé. Voici un GIF de son fonctionnement:Comme vous pouvez le voir (ou peut-être pas), un seul pixel se déplace sur l'écran. Bien que cela économise des octets, ce n'est pas le résultat le plus satisfaisant.
J'ai donc fait une solution alternative de 131 octets :
Celui-ci utilise
love.graphics.print
- qui imprime du texte - et un0
comme une balle, ce qui le rend beaucoup plus visible et attrayant.la source
CHIP-8,
363428 octetsPas de tours de fantaisie ici ...
Nécessite un interprète qui dessine correctement les sprites (un seul sprite peut être dessiné par image, ce qui ralentit suffisamment le programme pour que vous puissiez le voir).
Vidéo de faible qualité
la source
ZX Spectrum BASIC - 179 octets
Ici, c'est juste un peu condensé. C'est 179 octets avec les graphiques de balle inclus
la source
o
ouO
vous pourrez peut-être enregistrer quelques octets dans la liste symbolique; vous pouvez également modifier les réponses précédentes lorsque vous avez amélioré les solutions, plutôt que de répondre à nouveau à la même question