En grandissant, mon premier système de jeu sur console était un Atari 2600 et j'aurai toujours un amour pour certains de ces jeux que j'aimais tant quand j'étais enfant. De nombreux graphiques sont toujours mémorables, peut-être même emblématiques.
Il s'avère que ces sprites sont des images bitmap très simplistes, de 8 pixels de large à hauteur variable où la représentation binaire est l'agencement des pixels.
Par exemple, les octets hexadécimaux 0x18, 0x24, 0x18 dessineraient un cercle brut comme ceci:
0x18: 00011000
0x24: 00100100
0x18: 00011000
Comme 8 pixels de large créent des graphiques assez petits (même selon les normes Atari 2600), il était courant de doubler ou quadrupler la hauteur, la largeur ou les deux pour créer une version plus grande (bien que plus en blocs et déformée) de la même image. Ils seraient généralement également inversés verticalement ou horizontalement pour les sprites des joueurs et les terrains de jeu. Le jeu Combat en est un bon exemple.
Le défi consiste à écrire du code pour afficher ces images-objets sous forme de «graphiques» sous forme ASCII, y compris la possibilité de les étirer ou de les retourner verticalement, horizontalement ou les deux. Cela doit être sous la forme d'un programme complet ou d'une fonction appelable.
Contribution:
- Un tableau d'octets, chacun représentant les bits horizontaux pour cette ligne.
- Une valeur entière non nulle pour chaque direction, horizontale et verticale représentant le facteur d'échelle pour cette dimension.
- Une valeur négative indique que la dimension doit également être inversée le long de son axe.
Sortie:
- Représentation ASCII en STDOUT ou une chaîne séparée par des sauts de ligne, en utilisant un caractère espace pour les pixels noirs (0) et tout caractère imprimable non espace de votre choix pour les pixels blancs (1).
Données de test:
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]
Remarque: Les tableaux d'entrée d'octets ci-dessus sont fournis sous forme hexadécimale. Si votre plate-forme n'accepte pas les littéraux hexadécimaux pour la représentation des octets, vous pouvez les convertir en un littéral équivalent octet natif.
Exemple de sortie:
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
--------------------------------
Remarque: les lignes horizontales au-dessus et en dessous doivent indiquer le début et la fin de la sortie. Ils ne sont pas requis dans la sortie, mais des lignes vides (représentées par tous les zéros / espaces) au début et / ou à la fin sont requises, comme indiqué.
Note 2: ces bitmaps de test ont été inspirés et recréés / codés sur la base de captures d'écran de jeu étiquetées comme "fair use" sur Wikipédia.
Réponses:
Python 2 , 117 octets
Essayez-le en ligne!
la source
05AB1E ,
2726 octetsPrend l'entrée comme une liste de chaînes binaires de 8 bits et les sorties avec
1
comme caractère non-espace.-1 octet grâce à @MagicOctopusUrn .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
0‹i
...0‹
effet .. Nous avons un octet pour>=0
, ce qui estd
. Mais nous devrions également avoir un octet pour vérifier l'imo négative. Maintenant, j'utilise juste0‹
oud_
.„íR³²‚0‹Ï.V
(code completεε²Ä×}J³Äи0ð:}„íR³²‚0‹Ï.V˜»
), ce qui n'est pas une amélioration, mais se débarrasse de l'un de ces contrôles négatifs.εS²Ä×J³Äи²0‹ií]³0‹iR}˜0ð:»
sauvegarde d'un octet est sûre . Si vous pouvez prendre un tableau 2D, vous pouvez supprimerS
entièrement pour 25 octets.S²Ä×
au lieu deε²Ä×}
. Merci! Hmm, si nous sommes autorisés à prendre les entrées binaires comme une liste de 0 et de 1, un octet supplémentaire pourrait être enregistré en omettant leS
. Demander à OP si cela est autorisé. Je vous aime aussi„íR³²‚0‹Ï.V
dans votre autre commentaire. :)MATL ,
2419 octetsLes entrées sont un tableau de nombres décimaux, échelle horizontale, échelle verticale.
Essayez-le en ligne!
Explication
la source
Dyalog APL,
464233 octetsEssayez-le en ligne!
-9 grâce à ngn!
la source
{' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⍺,⊂⍉⍵⊤⍨8/2]}
dfn -> programme:' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⎕,⊂⍉⎕⊤⍨8/2]
' #'[⍉⊃{⊖⍣(0>⍺)⍉⍵/⍨|⍺}/⎕,⊂⎕⊤⍨8/2]
. btw, la sortie pour le deuxième test semble inversée dans votre solution d'origineProlog (SWI) , 252 octets
Essayez-le en ligne!
Explication
la source
Fusain , 28 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Faites une boucle sur la liste des octets.
Carte sur le facteur d'échelle vertical, multipliant ainsi les lignes de sortie.
Convertissez l'entrée en base 2, inversez-la, mappez les chiffres à l'espace
X
, puis multipliez chaque caractère par le facteur d'échelle horizontal.Si le facteur d'échelle horizontal était positif, réfléchissez pour obtenir à nouveau l'image dans le bon sens.
Refléter verticalement si le facteur d'échelle vertical était négatif.
la source
F
(For
) au lieu de¿
(If
) pour les vérifications?else
est implicite, donc la seule fois que je peux utiliser,if
c'est si c'est la dernière instruction du bloc.If
ici serait en faitIf ... Else If ...
au lieu de deux en vracIf
. Hmm, bon à savoir.C (clang) , 120 octets
Essayez-le en ligne!
la source
Lisp commun , 157 octets
Essayez-le en ligne!
Explication
la source
Tcl , 192 octets
Essayez-le en ligne!
la source
Code machine 8088, IBM PC DOS,
7771 octetsAssemblé:
Référencement:
Cela s'est avéré être plus compliqué dans l'ASM que je ne le pensais à l'origine. Plusieurs boucles simultanées et de nombreuses ramifications if / else peuvent certainement vous donner des maux de tête.
Ceci est implémenté en tant que MACRO car il permet le passage de paramètres de type fonction pour les tests.
Production
Voici un programme de test pour DOS qui demande le facteur d'échelle X et Y et qui s'affiche à l'écran. Notez que la mise à l'échelle trop importante du dragon défilera au-dessus du haut, car la fenêtre DOS par défaut ne comporte que 24 lignes.
Et voici notre petit dragon (canard):
Essayez-le en ligne!
Vous pouvez tester dans une machine virtuelle DOS en utilisant DOSBox ou VirtualConsoles.com avec les étapes suivantes:
PLANE
,KEY
,TANK
ouDRAGON
.la source
Perl 5, 105 octets
TIO
Si l'entrée doit être hexadécimale
126 octets
la source
Gelée , 21 octets
Essayez-le en ligne!
Suppose qu'il existe au plus un argument de ligne de commande.
la source
APL (Dyalog Extended) , 23 octets SBCS
méthode de dzaima
⎕IO←0
Essayez-le en ligne!
{
…}/
Réduisez de droite à gauche en utilisant le lambda anonyme suivant:|⍺
la magnitude de l'argument de gauche (le facteur d'échelle)⍵/⍨
l'utiliser pour répliquer le bon argument horizontalement⍉
transposer⊖⍣(
…)
Retourner si:>⍺
le facteur d'échelle est inférieur à zéro⊃
divulguer (depuis la réduction incluse pour réduire le rang du tenseur de 1 à 0)' x'⊇⍨
sélectionner des éléments de la chaîne "x" en utilisant cette matricela source
Rubis , 89 octets
Essayez-le en ligne!
la source
T-SQL, 216 octets
Avant d'exécuter cette gestion MS-SQL Studio, appuyez sur CRTL-t pour afficher les données sous forme de texte. La hauteur ne peut pas être ajustée pour dépasser le nombre d'éléments dans l'entrée.
En raison de l'horrible implémentation de STRING_AGG , la variable de hauteur ne fonctionnera que dans MSSM. MS aurait dû créer un troisième paramètre facultatif pour inclure l'ordre des éléments à concaténer.
La version en ligne ne peut prendre en charge que le réglage de la largeur. La hauteur se traduira par un résultat funky avec plusieurs formes d'empilement.
Ce script n'affichera pas les formes correctes dans la version en ligne, j'ai donc fait quelques ajustements mineurs pour compenser. Essayez-le en ligne
la source