Als ich aufwuchs, war mein erstes Konsolenspielsystem ein Atari 2600, und ich werde immer eine Vorliebe für einige der Spiele haben, die ich als Kind so genossen habe. Viele der Grafiken sind immer noch einprägsam, vielleicht sogar ikonisch.
Es stellt sich heraus, dass diese Sprites sehr vereinfachte Bitmaps mit einer Breite von 8 Pixeln und variabler Höhe sind, wobei die binäre Darstellung die Anordnung der Pixel ist.
Zum Beispiel würden die hexadezimalen Bytes 0x18, 0x24, 0x18 einen groben Kreis wie folgt zeichnen:
0x18: 00011000
0x24: 00100100
0x18: 00011000
Da eine Breite von 8 Pixeln relativ kleine Grafiken erzeugt (selbst nach Atari 2600-Standards), war es üblich, entweder die Höhe oder die Breite oder beides zu verdoppeln oder zu vervierfachen, um eine größere (wenn auch blockartigere und verzerrtere) Version desselben Bildes zu erzeugen. Sie werden normalerweise sowohl für Sprites als auch für Spielfelder vertikal oder horizontal gespiegelt. Das Spiel Combat ist ein gutes Beispiel dafür.
Die Herausforderung besteht darin, Code zu schreiben, um diese Sprites als "Grafiken" in ASCII-Form anzuzeigen, einschließlich der Möglichkeit, sie vertikal, horizontal oder beides zu strecken oder zu spiegeln. Dies muss in Form eines vollständigen Programms oder einer aufrufbaren Funktion erfolgen.
Eingang:
- Ein Array von Bytes, die jeweils die horizontalen Bits für diese Zeile darstellen.
- Ein ganzzahliger Wert ungleich Null für jede Richtung, horizontal und vertikal, der den Skalierungsfaktor für diese Dimension darstellt.
- Ein negativer Wert gibt an, dass die Bemaßung auch entlang ihrer Achse gespiegelt werden soll.
Ausgabe:
- ASCII-Darstellung nach STDOUT oder einer durch Zeilenumbrüche getrennten Zeichenfolge, wobei ein Leerzeichen für schwarze (0) Pixel und ein beliebiges druckbares Zeichen ohne Leerzeichen für weiße (1) Pixel verwendet wird.
Testdaten:
bmp1 = [ 0x06, 0x0F, 0xF3, 0xFE, 0x0E, 0x04, 0x04, 0x1E, 0x3F, 0x7F, 0xE3, 0xC3, 0xC3, 0xC7, 0xFF, 0x3C, 0x08, 0x8F, 0xE1, 0x3F ]
bmp2 = [ 0x07, 0xFD, 0xA7 ]
bmp3 = [ 0x00, 0x8E, 0x84, 0xFF, 0xFF, 0x04, 0x0E, 0x00 ]
bmp4 = [ 0x00, 0xFC, 0xFC, 0x38, 0x3F, 0x38, 0xFC, 0xFC]
Hinweis: Die obigen Beispiele für Eingabearrays von Bytes sind hexadezimal angegeben. Wenn Ihre Plattform keine Hex-Literale für die Bytedarstellung akzeptiert, können Sie diese in ein natives byteäquivalentes Literal konvertieren.
Beispielausgabe:
f( bmp1, 1, 1 ) =>
--------
XX
XXXX
XXXX XX
XXXXXXX
XXX
X
X
XXXX
XXXXXX
XXXXXXX
XXX XX
XX XX
XX XX
XX XXX
XXXXXXXX
XXXX
X
X XXXX
XXX X
XXXXXX
--------
f( bmp1, -2, 1 ) =>
----------------
XXXX
XXXXXXXX
XXXX XXXXXXXX
XXXXXXXXXXXXXX
XXXXXX
XX
XX
XXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXX XXXXXX
XXXX XXXX
XXXX XXXX
XXXXXX XXXX
XXXXXXXXXXXXXXXX
XXXXXXXX
XX
XXXXXXXX XX
XX XXXXXX
XXXXXXXXXXXX
----------------
f( bmp2, 1, 2 ) =>
--------
XXX
XXX
XXXXXX X
XXXXXX X
X X XXX
X X XXX
--------
f( bmp2, 2, 1 ) =>
----------------
XXXXXX
XXXXXXXXXXXX XX
XX XX XXXXXX
----------------
f( bmp2, -2, -2 ) =>
----------------
XXXXXX XX XX
XXXXXX XX XX
XX XXXXXXXXXXXX
XX XXXXXXXXXXXX
XXXXXX
XXXXXX
----------------
f( bmp3, 1, -1 ) =>
--------
XXX
X
XXXXXXXX
XXXXXXXX
X X
X XXX
--------
f( bmp3, 3, 3 ) =>
------------------------
XXX XXXXXXXXX
XXX XXXXXXXXX
XXX XXXXXXXXX
XXX XXX
XXX XXX
XXX XXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXX
XXX
XXX
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
------------------------
f( bmp4, -1, -1 ) =>
--------
XXXXXX
XXXXXX
XXX
XXXXXX
XXX
XXXXXX
XXXXXX
--------
f( bmp4, 4, 2 ) =>
--------------------------------
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
--------------------------------
Hinweis: Die horizontalen Linien oben und unten zeigen den Anfang und das Ende der Ausgabe. Sie werden in der Ausgabe nicht benötigt, es werden jedoch leere Zeilen (dargestellt durch alle Nullen / Leerzeichen) am Anfang und / oder Ende benötigt, wie gezeigt.
Anmerkung 2: Diese Test-Bitmaps wurden von Spiel-Screenshots inspiriert und neu gezeichnet / codiert, die in Wikipedia als "fair use" gekennzeichnet sind.