Inspiriert von diesem Eintrag aus dem Commodore 64-Benutzerhandbuch:
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
Erstellen Sie ein ähnliches Programm in der von Ihnen gewählten Sprache / Plattform, um ein kugelähnliches Objekt über Ihr Terminal, Ihren Bildschirm, Ihre Leinwand oder einen anderen visuellen Anzeigebereich zu werfen.
Sie müssen die PETSCII-Grafiken des C64 nicht genau nachbilden, es ist nicht einfach O
oder o
nicht ausreichend, und Sie müssen den GOTO
Befehl auch nicht verwenden, wenn er noch in Ihrer Sprache vorhanden ist. Solange Ihr Ball oben auf Ihrer Leinwand beginnt und sich diagonal bewegt, bis er eine Leinwandbegrenzung erreicht, und dann wie folgt entsprechend abprallt:
- Fahren Sie nach unten und rechts und berühren Sie den unteren Bildschirmrand, hüpfen Sie nach oben und fahren Sie nach rechts fort.
- Nach rechts und oben reisen und an die äußerste rechte Grenze stoßen, nach links und oben springen;
- Nach links und oben reisen und oben aufschlagen, nach links und unten springen;
- Nach links und unten reisen und die äußerste linke Grenze erreichen, nach rechts und unten springen;
- Trifft jede Ecke und kehrt die Richtung um;
Dann sind wir alle gut.
Sie müssen den Ball auch nicht um jeweils 8 Pixel bewegen, wie dies im BASIC-Listing des C64 der Fall ist. Sie können jeweils einen Zeichenblock oder ein Pixel verschieben, je nachdem, was Sie für am besten halten.
Um zu sehen, ob dieses BASIC-Listing funktioniert, können Sie es mit diesem Online-Commodore 64-Emulator eingeben, sofern Ihr Browser Flash unterstützt.
Antworten:
6502 Maschinencode (C64),
908991 Bytes+2 Bytes , weil es muss eine Last - Adresse (nicht PIC wegen der Selbst Modifikation)
Online-Demo
Verwendung:
sys49152
Ich habe mich sehr bemüht, die Größe zu reduzieren (z. B. ohne IRQs für das Timing, sondern mit blöden, leeren Loops), und war immer noch nicht in der Lage , das Niveau von Titus 'Golf C64 BASIC zu erreichen . Aber es sieht weniger flackernd aus;)
Erläuterung: (Vice Disassembly)
Nur zum Spaß, hier ist eine professionellere Variante, bei der ein Sprite für den Ball verwendet wird und die Grenze blinkt, wenn 385 Bytes erreicht werden (einschließlich der Sprite-Daten, die an Ort und Stelle verwendet werden ):
Online-Demo - | - durchsuchen Sie die ca65 Assembler-Quelle
Starten und stoppen Sie den springenden Ball mit
sys49152
.$C000
müssen der Bildschirminhalt und der Zeichensatz (Schriftart) kopiert werden.RUN/STOP + RESTORE
ist kaputt, versuche es nicht.TI$
bleibt ebenfalls zurück.quelle
inc $d020
überjsr flash
;) hitshimselfwithalargetrout Es ist wunderbar!.prg
Datei und von meiner Meta-Frage hier aus muss ich sie einschließen ... könnte sie wahrscheinlich weglassen, wenn der Code positionsunabhängig wäre.Bash + Unix-Dienstprogramme,
125117 BytesAnimation des Probelaufs:
quelle
CP-1610- Baugruppe,
67…6462 DECLEs = 78 ByteDieser Code soll auf einer Intellivision ausgeführt werden . Es verwendet eines seiner Hardware-Sprites, das als MOB (for Mobile Object) bezeichnet wird.
Ein CP-1610-Opcode wird mit einem 10-Bit-Wert codiert, der als "DECLE" bezeichnet wird. Dieses Programm ist 62 DECLE lang und beginnt bei 4800 US-Dollar und endet bei 483 D-Dollar.
Hexadezimaler Speicherauszug + Quelle
Ausgabe
quelle
HTML (Microsoft Edge / Internet Explorer), 81 Byte
Stellen Sie sich vor, es wäre 1998 mit diesen verschachtelten
<marquee>
Tags:Getestet in Microsoft Edge, aber von dem, was ich gelesen habe, sollte IE auch noch Zelte unterstützen. Funktioniert entschieden nicht in Chrome.
Die Einstellung
direction=up
würde 2 Bytes sparen, aber die Regel, dass der Ball oben auf der Leinwand beginnen muss, verletzen.quelle
direction
Attribut nicht zu unterstützen .marquee
, das ist ziemlich kreativ!TI-BASIC,
71,70Ziemlich wörtliche Übersetzung, ich wäre nicht überrascht, wenn es Tricks gibt, um es kleiner zu machen.
Der Bildschirm ist 16x8 und 1-indiziert, sodass die Konstanten unterschiedlich sind.
~
ist der SourceCoder-Weg, um das Negationssymbol zu schreiben.Bei Hardware sieht es flüssiger aus.
quelle
Befunge, 209 Bytes
Dies setzt eine Bildschirmgröße von 80x25 voraus, aber Sie können den Bereich leicht optimieren, indem Sie die
"O"
(79) in der letzten Zeile und die*64
(24) in der vorletzten Zeile ersetzen (beachten Sie, dass die vorletzte Zeile von rechts nach links ausgeführt wird). Die Geschwindigkeit kann auch durch Ersetzen von"2"
(50) in der letzten Zeile angepasst werden .quelle
Java,
184176 BytesDies verwendet ANSI-Escape-Sequenzen , um den Cursor zu verschieben, der das Objekt ist, das um eine
85 x 25
Terminalanzeige herum springt . Speichern Sie in einer Datei mit dem NamenA.java
.Ungolfed
Demo
quelle
Thread.sleep(50)
. Und Ihre Golf- und Nicht-Golf-Programme stimmen nicht überein.Clojure,
398380375 Bytes-18 Bytes, indem Sie den Namen der Schriftart in eine leere Zeichenfolge ändern, um sie als Standard festzulegen, die Begrenzungsüberprüfungen einzufügen und das untere Begrenzungsproblem (das Sie im GIF sehen können) zu beheben. Behebung der tatsächlich gespeicherten Bytes.
-5 Bytes, indem Sie zu einer prägnanteren Destrukturierungssyntax wechseln und den Ball um ein Pixel verkleinern.
Verwendet Quil .
Ich habe versucht, in den Funktionsmodus zu wechseln, aber es war viel zusätzlicher Code erforderlich, und es wurde teurer.
(Beachten Sie, dass die neue Version nicht wie im GIF früh am unteren Bildschirmrand abfällt.)
quelle
(+ 0 font-size)
da drin bin . Das ist peinlich. Ich werde das in der nächsten Version beheben. Sollte mich wie 5 Bytes retten.Schläger 247 Bytes
Ungolfed:
Ausgabe:
quelle
Jelly, 37 Bytes
Mit etwas Hilfe aus dieser Antwort , um die Schleifen- und Fluchtzeichen richtig zu machen. Momentan springt es auf einem 80x24-Bildschirm herum, aber das kann im Code leicht geändert werden.
Die Koordinaten in jeder Richtung können als Elemente von zwei Listen
[0, 1,..., 24, 23,..., 1]
und dargestellt werden[0, 1,..., 80, 79,..., 1]
, nennen wir sieY
undX
, die sich unendlich wiederholen. Diese unendliche Wiederholung kann mithilfe der modularen Indizierung emuliert werden - mithilfeị
von Jelly. Beispiel: In deri
Iteration befindet sich der Ball auf Position(X[i%|X|], Y[i%|Y|]) = (iịY, iịX)
. Die sich bewegende Kugel ist nur der Cursor, der durch das Aussenden voniịY
Zeilenumbrüchen undiịX
Leerzeichen in Position gebracht wird.Demo
Erläuterung
quelle
SmileBASIC,
8574 BytesDie Position des Balls kann mit 2 Dreieckswellen modelliert werden, und der kürzeste Weg, sie in SmileBASIC zu erzeugen, war Arkussinus (Sinus (x)). (Der Algorithmus mit MOD war länger, da SB
MOD
anstelle von verwendet%
)quelle
CSS / HTML, 200 + 7 = 207 Bytes
Diese Version zeigt Ihnen die Größe der Leinwand und verleiht der Animation ein pixeligeres Gefühl:
Code-Snippet anzeigen
quelle
Dyalog APL, 44 Bytes
Erläuterung:
{
...}⍨1 1
: rufe die angegebene Funktion mit ⍺ = ⍵ = 1 1 auf⎕SM∘←0,G←⍺+⍵
: speichern⍺+⍵
inG
, zeige ein0
an diesem Ort im⎕SM
Fenster .⎕DL.1
: Warten Sie eine Zehntelsekunde⊃1 G∨.≥G⎕SD
Wenn Check:G
ist an der⎕SM
Fenstergrenze (1≥G
oderG≥⎕SD
,⎕SD
ist die s creen d bmessungen)1-2×
: Karte[1,0]
auf[¯1,1]
, um die Fahrtrichtung umzudrehen⍵×
: multipliziere die aktuelle Fahrtrichtung damitG∇
: Rekursion, seiG
der neue Ort (⍺
) und⍵....
sei die neue Richtung (⍵
).quelle
PHP
1129794103102 BytesBounces ein Kapital
O
in einem 40x25-Raster, beginnend in der oberen rechten Ecke;druckt 99 Zeilenumbrüche, um den Bildschirm zu löschen.
Laufen Sie mit
-nr
.A^K
=chr(10)
= newlineA^a
=chr(32)
= Leerzeichenquelle
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);
. Das Modulo ist bei 0 und N falsch und kehrt die Richtung um. Leider müssen wir $ d und $ e auf -1 setzen, aber wir bekommen trotzdem einige Einsparungen.$x%79<=>.5
funktioniert auch für die gleichen Bytes.Simons BASIC (C64),
6665 BytesEin Byte gespart dank @ShaunBebbers.
Ich brauche hier nur eine Zeile, weil Simons 'Basic eine Modulofunktion hat.
Um dies zu erreichen, benötigen Sie einen physischen C64 und ein Simons BASIC-Modul
(oder eine andere BASIC-Erweiterung, die eine
mod
Funktion hat).Geben Sie diese 69 Zeichen ein:
{CLR}
ist PETSCII 147, die den Bildschirm löscht. Verwenden Sie Shift + CLR / HOME, um es einzugeben.bytecount
Beim Speichern auf der Festplatte werden 65 Byte benötigt, da die Befehle mit einem Token versehen sind:
for
,to
,poke
,abs
,next
undgoto
sind jeweils ein Byte;mod
nimmt zwei Bytes.Das sind 59 Byte Code plus 4 Byte für Zeiger und 2 Byte für die Zeilennummer.
Informationen hierzu finden Sie unter Zuordnen des C64 und Suchen nach
$800
(BASIC-Programmtext).(Den Speicherbereich für den Videobildschirm finden Sie unter
$400
.)Nervenzusammenbruch
Das Programm durchläuft eine Schleife
I
von 0 bis 623 (= LCM von 48 und 78 minus 1). In der SchleifeI
wird auf 39..0..38 bzw. 24..0..23 abgebildet(wie es das ursprüngliche Programm tut).
Wenn die Schleife beendet ist, wird das Programm neu gestartet, indem in Zeile 0 gesprungen wird.
C64 BASIC,
7776 BytesLeider brauche ich zwei Zeilen, denn selbst mit allen möglichen Abkürzungen würde es 83 Zeichen dauern - zu viele, um den C64-Zeileneditor zu verwenden:
(Ein Hex-Editor könnte verwendet werden, um eine längere Zeile zu erstellen - was 73 Byte ergeben würde.)
quelle
:
und nicht;
goto
in Ihrer zweizeiligen Version verwenden, wie es bei BASIC 2goto
goto 0
$0400
bis direkt auf den Bildschirm zu schreiben$07e7
. oder verwende Sprites. Die Verwendung des Kernal mit$ffd2
(Ausgabeakkumulator) würde funktionieren, da Sie die X- und Y-Position des Cursors leicht genug einstellen können (ich erinnere mich nicht an den Aufruf dafür), aber Sie müssen möglicherweise die letzte Zeichenposition vermeiden, falls sie erzwungen wird ein Zeilenvorschub.Python 2,
176168 BytesDies setzt eine Terminalgröße von 80x24 voraus. Auf jeden Fall nicht optimal, aber ich bin neu im Golfen, ja.
Vielen Dank an R. Kap, der x% 79 <1 anstelle von x <1oder x> 79 vorgeschlagen hat, und dasselbe gilt für y.
quelle
x<1or x>78
mitx%79<0
undy<1or y>22
mity%23<1
.Rebol / View,
284266 BytesUngolfed:
quelle
C 294 Bytes
Ungolfed-Version:
Erläuterung
graphics.h
in mein/usr/include
Verzeichnis gelangen. Deshalb habe ich gesucht und dies ist das, was ich gefunden habe. Es ist eine TurboC Graphics-Implementierung mit SDL für Linux. Man könnte auch OpenGL verwenden. In Windows ist es vermutlich bereits installiert, was MacOS betrifft.void initgraph(int *graphdriver, int *graphmode, char *pathtodriver);
Initialisiert das System und versetzt es in einen Grafikmodus. In diesem Fall wird der Grafiktreiber automatisch erkannt. Bitte verweisen Sie auf diesen LinkWeitere Informationen finden .x
undy
sind Koordinaten, die die Position des Balls bestimmen.a
undb
sind Flags,a
wird auf Null gesetzt, wenn derx
Wert unter 60 fällt, undb
wird auf Null gesetzt, wenny
unter 60 fällt.x
undy
überschreitet Grenzwerte des Fensters, und die Koordinaten werden entsprechend angepasst.usleep
damit meine CPU nicht gestresst wird.closegraph()
Anruf , um das Fenster zu schließen. Aber hier fehlt es.Muss mit dem Linker Flag übersetzt werden
-lgraph
Auf echter Hardware läuft es flüssiger. :)
quelle
graphics.h
. Diese Antwort auf askubuntu.com/questions/525051/… war hilfreich.MATL , 42 Bytes
Dies verwendet einen 70 × 16-Bildschirm und Zeichen
O
. Wenn Sie auf ein paar Bounces warten, sehen Sie den Ball an einer Ecke.Probieren Sie es bei MATL Online!
Die Bildschirmgröße kann im Code leicht geändert werden. Der relevante Teil ist
8E70
, der drückt8
, verdoppelt und drückt70
. Beispiel: Bei einem 80 × 25-Bildschirm wird durch ersetzt5W80
, wodurch er gedrückt5
, quadriert und gedrückt80
(oder durch ersetzt) wird25 80
, dies erfordert jedoch ein weiteres Byte).Auch das Hinzufügen
tD
am Ende des Codes wird auch die aktuelle Position in Echtzeit angezeigt (vertikal, dann horizontal,1 1
oben links). Als Beispiel für einen80×18
Bildschirm,Probieren Sie es auch aus!
Erläuterung
Dies verwendet eine Endlosschleife. Position wird in der Zwischenablage gehalten
H
als 1 × 2-Vektor in der Zwischenablage und die RichtungI
als 1 × 2-Vektor mit den Einträgen1
oder in der Zwischenablage gespeichert-1
.Jede Iteration löscht den Bildschirm, definiert eine Matrix von Leerzeichen und schreibt ein
O
an der entsprechenden Position und zeigt sie an. Dann müssen Position und Richtung aktualisiert werden.Die Position ist
1
-basiert, und daher sind die Ränder des Bildschirms1
und die maximale Bildschirmgröße. Also, wenn Position Modulo Bildschirmgröße gibt0
oder1
entweder in der ersten oder zweiten Komponente , was bedeutet, dass wir eine vertikale oder horizontale Kante erreicht haben, wird diese Komponente des Richtungsvektors negiert. Danach wird die neue Richtung zur aktuellen Position hinzugefügt, um die neue Position zu erhalten.quelle
Hier ist die Auflistung von ZX Spectrum.
quelle
C + Flüche, 190 Bytes
Erläuterung:
quelle
Lua ( LÖVE 2D ), 130 Bytes
Lua ist nicht die beste Sprache, wenn es um Code-Golf geht, aber los geht's! Einige erwähnenswerte Punkte:
Die Standardgröße für die Leinwand ist 800 x 600. Sie kann in der Konfigurationsdatei geändert werden, es wurden jedoch keine Größenbeschränkungen festgestellt. Daher habe ich sie unverändert gelassen.
love.draw()
ist die Zeichenfunktion von LÖVE und hat einen vorgegebenen Namen. Alternative LÖVE-Funktionen, die verwendet werden könnten, wärenlove.update(dt)
undlove.run()
- die erste ist länger, in Bytes, und die letztere ist kürzer, ja, aber ohne eine eingebaute Endlosschleife. Daherdraw()
scheint hier unsere beste Wahl zu sein.In der obigen Version wird
love.graphics.points
der Ball gezogen. Obwohl kürzer, bin ich mir nicht sicher, ob es erlaubt ist. Hier ist ein GIF, wie es läuft:Wie Sie sehen können (oder vielleicht auch nicht können), bewegt sich ein einzelnes Pixel auf dem Bildschirm. Das spart zwar Bytes, ist aber nicht das befriedigendste Ergebnis.
Also habe ich eine alternative 131-Byte-Lösung erstellt :
Dieser verwendet
love.graphics.print
- was Text druckt - und a0
als Kugel, wodurch es viel sichtbarer und ansprechender wird.quelle
CHIP-8,
363428 BytesKeine ausgefallenen Tricks hier ...
Benötigt einen Interpreter, der Sprites korrekt zeichnet (es kann nur ein Sprite pro Frame gezeichnet werden, wodurch das Programm so verlangsamt wird, dass Sie es sehen können).
Video von geringer Qualität
quelle
ZX Spectrum BASIC - 179 Bytes
Hier ist es nur ein bisschen verdichtet. Es ist 179 Bytes mit der eingeschlossenen Kugelgraphik
quelle
o
oderO
Sie können möglicherweise einige Bytes in der symbolischen Liste speichern. Sie können auch frühere Antworten bearbeiten, wenn Sie Lösungen verbessert haben, anstatt dieselbe Frage erneut zu beantworten