Quando eu era criança, meu primeiro sistema de console era o Atari 2600 e sempre terei amor por alguns desses jogos que eu tanto gostava quando criança. Muitos dos gráficos ainda são memoráveis, talvez até icônicos.
Acontece que esses sprites são bitmaps muito simplistas, com 8 pixels de largura e altura variável, onde a representação binária é a disposição dos pixels.
Por exemplo, os bytes hexadecimais 0x18, 0x24, 0x18 desenham um círculo bruto da seguinte forma:
0x18: 00011000
0x24: 00100100
0x18: 00011000
Como a largura de 8 pixels cria gráficos bastante pequenos (mesmo para os padrões Atari 2600), era comum dobrar ou quadruplicar a altura, largura ou ambas, para criar uma versão maior (embora mais quadrada e distorcida) da mesma imagem. Eles também seriam virados verticalmente ou horizontalmente para sprites de jogadores e campos de jogos. O jogo Combat é um bom exemplo disso.
O desafio é escrever código para exibir esses sprites como "gráficos" na forma ASCII, incluindo a capacidade de esticá-los ou invertê-los verticalmente, horizontalmente ou ambos. Isso deve estar na forma de um programa completo ou de uma função que pode ser chamada.
Entrada:
- Uma matriz de bytes, cada um representando os bits horizontais para essa linha.
- Um valor inteiro diferente de zero para cada direção, horizontal e vertical, representando o fator de escala para essa dimensão.
- Um valor negativo indica que a dimensão também deve ser invertida ao longo de seu eixo.
Saída:
- Representação ASCII para STDOUT ou uma sequência separada por nova linha, usando um caractere de espaço para pixels pretos (0) e qualquer caractere imprimível e não espacial de sua escolha para pixels brancos (1).
Dados de teste:
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]
Nota: As matrizes de entrada de bytes do exemplo acima são fornecidas como hexadecimais. Se sua plataforma não aceitar literais hexadecimais para representação de bytes, você poderá convertê-los em um literal nativo equivalente a bytes.
Saída de exemplo:
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
--------------------------------
Nota: as linhas horizontais acima e abaixo devem mostrar o início e o fim da saída. Eles não são necessários na saída, no entanto, são necessárias linhas vazias (representadas por todos os zeros / espaços) no início e / ou no final, conforme mostrado.
Nota 2: esses bitmaps de teste foram inspirados e redesenhados / codificados com base em capturas de tela de jogos marcadas como "uso justo" na Wikipedia.
Critérios Vencedores
- Isso é código-golfe , então o código mais curto em bytes por idioma vence.
- As brechas padrão são proibidas.