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.
Respostas:
Python 2 , 117 bytes
Experimente online!
fonte
05AB1E ,
2726 bytesPega a entrada como uma lista de cadeias binárias de 8 bits e produz
1
como caractere não espacial.-1 byte graças a @MagicOctopusUrn .
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
0‹i
...0‹
verdade ... Temos um byte de 1>=0
, o que éd
. Mas também devemos ter um byter para verificar a imo negativa. Agora eu apenas uso0‹
oud_
.„íR³²‚0‹Ï.V
(código completoεε²Ä×}J³Äи0ð:}„íR³²‚0‹Ï.V˜»
), o que não é uma melhoria, mas se livra de uma dessas verificações negativas.εS²Ä×J³Äи²0‹ií]³0‹iR}˜0ð:»
salva um byte. Se você pode obter uma matriz 2D, é possível removerS
totalmente por 25 bytes.S²Ä×
vez deε²Ä×}
. Obrigado! Hmm, se pudermos considerar as entradas binárias como uma lista de 0s e 1s, um byte adicional poderá ser salvo, omitindo oS
. Perguntará ao OP se isso é permitido. Eu gosto do seu„íR³²‚0‹Ï.V
no seu outro comentário também. :)MATL ,
2419 bytesAs entradas são uma matriz de números decimais, escala horizontal e vertical.
Experimente online!
Explicação
fonte
Dyalog APL,
464233 bytesExperimente online!
-9 graças a ngn!
fonte
{' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⍺,⊂⍉⍵⊤⍨8/2]}
dfn -> programa:' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⎕,⊂⍉⎕⊤⍨8/2]
' #'[⍉⊃{⊖⍣(0>⍺)⍉⍵/⍨|⍺}/⎕,⊂⎕⊤⍨8/2]
. btw, a saída para o segundo teste parece invertida em sua solução originalProlog (SWI) , 252 bytes
Experimente online!
Explicação
fonte
Carvão , 28 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Loop sobre a lista de bytes.
Mapeie sobre o fator de escala vertical, multiplicando assim as linhas de saída.
Converta a entrada na base 2, inverta-a, mapeie os dígitos para o espaço e
X
multiplique cada caractere pelo fator de escala horizontal.Se o fator de escala horizontal for positivo, reflita para obter a imagem da maneira correta novamente.
Reflita verticalmente se o fator de escala vertical for negativo.
fonte
F
(For
) em vez de¿
(If
) para as verificações?else
está implícito; portanto, a única vez que posso usarif
é se for a última declaração do bloco.If
aqui seria realmente um emIf ... Else If ...
vez de dois soltosIf
. Hum, é bom saber.C (clang) , 120 bytes
Experimente online!
fonte
Lisp comum , 157 bytes
Experimente online!
Explicação
fonte
Tcl , 192 bytes
Experimente online!
fonte
Código de máquina 8088, IBM PC DOS,
7771 bytesMontado:
Listagem:
Isso acabou sendo mais doozy no ASM do que eu pensava originalmente. Vários loops simultâneos e muitas ramificações if / else certamente podem causar dores de cabeça.
Isso é implementado como um MACRO, pois permite a passagem de parâmetro semelhante a uma função para teste.
Saída
Aqui está um programa de teste para o DOS que solicita o fator de escala X e Y e atrai para a tela. Observe que escalar demais o dragão passará para cima, pois a janela padrão do DOS é de apenas 24 linhas.
E aqui está o nosso pequeno dragão (pato):
Experimente Online!
Você pode testar em uma VM do DOS usando o DOSBox ou o VirtualConsoles.com com as seguintes etapas:
PLANE
,KEY
,TANK
ouDRAGON
.fonte
Perl 5, 105 bytes
TIO
Se a entrada deve ser hexadecimal
126 bytes
fonte
Gelatina , 21 bytes
Experimente online!
Supõe que haja no máximo um argumento de linha de comando.
fonte
APL (Dyalog Extended) , SBCS de 23 bytes
método de dzaima
⎕IO←0
Experimente online!
{
…}/
Reduza da direita para a esquerda usando a seguinte lambda anônima:|⍺
a magnitude do argumento esquerdo (o fator de escala)⍵/⍨
use isso para replicar o argumento correto horizontalmente⍉
transpor⊖⍣(
...)
virar se:>⍺
o fator de escala é menor que zero⊃
divulgar (desde a redução incluída para reduzir a classificação do tensor de 1 a 0)' x'⊇⍨
selecione elementos da string "x" usando essa matrizfonte
Ruby , 89 bytes
Experimente online!
fonte
T-SQL, 216 bytes
Antes de executar esse gerenciamento do MS-SQL Studio, pressione CRTL-t para mostrar os dados como texto. A altura não pode ser ajustada para exceder o número de elementos na entrada.
Devido à péssima implementação de STRING_AGG , a variável height só funcionará no MSSM. O MS deveria ter feito um terceiro parâmetro opcional para incluir a ordem dos elementos que estão sendo concatenados.
A versão online pode suportar apenas o ajuste da largura. A altura resultará em um resultado descolado, com várias formas de empilhamento.
Este script não mostrará as formas corretas na versão online, então fiz alguns pequenos ajustes para compensar. Experimente online
fonte