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.
Antworten:
Python 2 , 117 Bytes
Probieren Sie es online!
quelle
05AB1E ,
2726 BytesNimmt die Eingabe als Liste von 8-Bit-Binärzeichenfolgen und gibt sie
1
als Nicht-Leerzeichen aus.-1 Byte dank @MagicOctopusUrn .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
0‹i
...0‹
Tat ein 1-Byte für sein . Wir haben ein 1-Byte für>=0
, das istd
. Wir sollten aber auch ein 1-Byte haben, um nach negativen Imos zu suchen. Jetzt benutze ich einfach0‹
oderd_
.„íR³²‚0‹Ï.V
(vollständiger Codeεε²Ä×}J³Äи0ð:}„íR³²‚0‹Ï.V˜»
), was keine Verbesserung darstellt, aber eine dieser negativen Prüfungen beseitigt.εS²Ä×J³Äи²0‹ií]³0‹iR}˜0ð:»
spart ziemlich sicher ein Byte. Wenn Sie ein 2D-Array aufnehmen können, können Sie das ArrayS
für 25 Byte vollständig entfernen .S²Ä×
stattε²Ä×}
. Vielen Dank! Hmm, wenn wir die Binäreingänge als Liste von 0s und 1s nehmen dürfen, könnte ein zusätzliches Byte gespeichert werden, indem das weggelassen wirdS
. Wird OP fragen, ob dies erlaubt ist. Ich mag deine auch„íR³²‚0‹Ï.V
in deinem anderen Kommentar. :)MATL ,
2419 BytesEingaben sind eine Reihe von Dezimalzahlen, horizontale Skala, vertikale Skala.
Probieren Sie es online!
Erläuterung
quelle
Dyalog APL,
464233 BytesProbieren Sie es online!
-9 danke an ngn!
quelle
{' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⍺,⊂⍉⍵⊤⍨8/2]}
dfn -> programm:' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⎕,⊂⍉⎕⊤⍨8/2]
' #'[⍉⊃{⊖⍣(0>⍺)⍉⍵/⍨|⍺}/⎕,⊂⎕⊤⍨8/2]
. Übrigens scheint die Ausgabe für den zweiten Test in Ihrer ursprünglichen Lösung umgekehrt zu seinProlog (SWI) , 252 Bytes
Probieren Sie es online!
Erläuterung
quelle
Kohle , 28 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Durchlaufen Sie die Liste der Bytes.
Ordnen Sie den vertikalen Skalierungsfaktor zu und multiplizieren Sie so die Ausgabelinien.
Konvertieren Sie die Eingabe in Basis 2, kehren Sie sie um, ordnen Sie die Ziffern dem Leerzeichen zu und
X
multiplizieren Sie dann jedes Zeichen mit dem horizontalen Skalierungsfaktor.Wenn der horizontale Skalierungsfaktor positiv war, reflektieren Sie, um das Bild wieder in die richtige Richtung zu bringen.
Vertikal spiegeln, wenn der vertikale Skalierungsfaktor negativ war.
quelle
F
(For
) anstelle von¿
(If
) für die Prüfungen verwendet?else
wird impliziert, dass ich nur verwenden kann,if
wenn es die letzte Anweisung im Block ist.If
hier also zwei verwenden, ist dies tatsächlich einIf ... Else If ...
lockerer Fall als zweiIf
. Hmm, gut zu wissen.C (clang) , 120 Bytes
Probieren Sie es online!
quelle
Common Lisp , 157 Bytes
Probieren Sie es online!
Erläuterung
quelle
Tcl , 192 Bytes
Probieren Sie es online!
quelle
8088 Maschinencode, IBM PC DOS,
7771 BytesGebaut:
Auflistung:
Es stellte sich heraus, dass dies in ASM eher ein Trottel war, als ich ursprünglich gedacht hatte. Mehrere gleichzeitige Schleifen und viele if / else-Verzweigungen können Ihnen sicherlich Kopfschmerzen bereiten.
Dies ist als MAKRO implementiert, da es die Übergabe funktionsähnlicher Parameter zum Testen ermöglicht.
Ausgabe
Hier ist ein Testprogramm für DOS, das zur Eingabe des X- und Y-Skalierungsfaktors auffordert und auf dem Bildschirm anzeigt. Wenn Sie den Drachen zu stark skalieren, wird ein Bildlauf nach oben ausgeführt, da das Standard-DOS-Fenster nur 24 Zeilen enthält.
Und hier ist unser kleiner Drache (Ente):
Probieren Sie es online!
Sie können in einer DOS-VM mit DOSBox oder VirtualConsoles.com mit den folgenden Schritten testen :
PLANE
,KEY
,TANK
oderDRAGON
.quelle
Perl 5, 105 Bytes
TIO
Wenn die Eingabe hex sein muss
126 Bytes
quelle
Jelly , 21 Bytes
Probieren Sie es online!
Angenommen, es gibt höchstens ein Befehlszeilenargument.
quelle
APL (Dyalog Extended) , 23 Byte SBCS
Dzaima-Methode
⎕IO←0
Probieren Sie es online!
{
…}/
Reduzieren Sie von rechts nach links mit dem folgenden anonymen Lambda:|⍺
die Größe des linken Arguments (der Skalierungsfaktor)⍵/⍨
Verwenden Sie dies, um das richtige Argument horizontal zu replizieren⍉
transponieren⊖⍣(
…)
Umdrehen, wenn:>⍺
Der Skalierungsfaktor ist kleiner als Null⊃
offenbaren (da Reduktion beigefügt, um Tensorrang von 1 auf 0 zu reduzieren)' x'⊇⍨
Wählen Sie mithilfe dieser Matrix Elemente aus der Zeichenfolge "x" ausquelle
Ruby , 89 Bytes
Probieren Sie es online!
quelle
T-SQL, 216 Bytes
Drücken Sie vor dem Ausführen dieser MS-SQL Studio-Verwaltung die Tastenkombination STRG-T, um Daten als Text anzuzeigen. Die Höhe kann nicht angepasst werden, um die Anzahl der Elemente in der Eingabe zu überschreiten.
Aufgrund der schrecklichen Implementierung von STRING_AGG funktioniert die Höhenvariable nur in MSSM. MS sollte einen dritten optionalen Parameter angegeben haben, um die Reihenfolge der zu verkettenden Elemente einzuschließen.
Die Online-Version kann nur die Anpassung der Breite unterstützen. Die Höhe führt zu einem flippigen Ergebnis mit mehreren Stapelformen.
Dieses Skript zeigt in der Online-Version nicht die richtigen Formen an, daher habe ich einige geringfügige Anpassungen vorgenommen, um dies auszugleichen. Probieren Sie es online aus
quelle