Espero que esta imagem lhe pareça familiar.
É um dos fantasmas de Pacman em seu estado "vulnerável" , depois que Pacman comeu uma pílula de poder.
O desafio
Imagine nosso fantasma em um pequeno quadro, usando arte ASCII. Na escala normal (mais sobre isso posteriormente), cada quadrado na imagem acima deve corresponder a um caractere, e o quadro deve ter uma separação de um caractere para cima e para baixo, e uma separação de dois caracteres à esquerda e à direita do fantasma :
####################
# #
# #### #
# ######## #
# ########## #
# ############ #
# ############ #
# ### ## ### #
# #### ## #### #
# ############## #
# ############## #
# ## ## ## ## #
# # ## ## ## # #
# ############## #
# ## ### ### ## #
# # ## ## # #
# #
####################
Mas isso não parece muito bonito. #
pode não ser a melhor opção para os pixels ativos. Além disso, as células de caracteres não são quadradas, o que faz nosso amigo parecer mais fantasmagórico do que ele já é.
Portanto, para ter mais flexibilidade, a imagem mudará de acordo com três parâmetros de entrada:
- Caractere a ser usado para pixels ativos;
- Fator de escala horizontal;
- Fator de escala vertical.
Por exemplo, com %
, 4
, 2
o ouput seria a melhor imagem olhando
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% %%%%
%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%% %%%%%%%% %%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%% %%%%
%%%% %%%%%%%% %%%%%%%%%%%% %%%%%%%%%%%% %%%%%%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%% %%%%%%%% %%%%%%%% %%%% %%%%
%%%% %%%%
%%%% %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Regras
Todos os builtins permitidos.
As entradas são obtidas em qualquer formato razoável e em qualquer ordem. A primeira entrada acima (caractere para pixels ativos) é garantida como um caractere ASCII imprimível (códigos 32 a 126).
O espaço à direita após cada linha ou as novas linhas à direita após a última linha são aceitáveis.
Código de golfe, menos bytes ganha.
fonte
Respostas:
CJam,
535149 bytesObserve que três dos caracteres não são imprimíveis. Experimente online!
fundo
A metade direita da saída sem escala é idêntica à esquerda, portanto basta codificar uma delas. Se substituirmos espaços por zeros e não espaços por uns, obteremos
onde cada linha pode ser interpretada como um número binário. Isso gera
A maneira mais fácil de codificar essas informações é substituir cada número inteiro pelo caractere Unicode nesse ponto de código, mas todos exigiriam que dois bytes fossem codificados com UTF-8.
Ao XORing dos números inteiros com 544, mantemos todos, exceto dois números inteiros, abaixo de 128 e evitamos bytes nulos.
O resultado é
como inteiros ou
como uma corda escapada.
Como funciona
fonte
Perl,
1131051041009796Adicionado +2 para
-ap
Sugestões por dev-null salvar 9 bytes Corrigida contagem incorreta conforme observado por Dennis
Corra usando
echo "2 4 %" | perl -ap pacman.pl
pacman.pl
:exceto que a string
"\xff\x00\x03\x0f\x1f\x3f\x3f\x39\x79\x7f\x7f\x66\x59\x7f\x6e\x46\x00\xff"
deve ser escrita em formato binário com aspas simplesO espaço como caractere de substituição se torna a cadeia vazia e leva a linhas curtas. Mas tudo ficará vazio de qualquer maneira
fonte
Dyalog APL, 64 bytes
Isso leva o fator de escala como argumento à esquerda e o caractere como argumento à direita, ou seja:
Explicação:
⍉(7/2)⊤⎕AV⍳'Äâ\⊥⊥∘)⍞⍞┬#⍞`⍒'
: A metade esquerda do fantasma, sem a borda. (É simétrico.) Cada caractere tem seu conjunto de bits alto, para impedir a seleção de caracteres não imprimíveis⎕AV
, mas apenas os primeiros 7 bytes são usados.0,⍪⍨0⍪0,0,
: adicione uma borda de espaços em branco à esquerda, superior e inferior1⍪⍨1⍪1,
: adicione o quadro à esquerda, superior e inferior,∘⌽⍨
: junte-se a ele com seu espelho vertical1+
: adicione 1, porque as matrizes são indexadas 1 por padrão' '⍵[
...]
: use essa matriz como um índice na string' '⍵
, para que cada 0 seja mapeado para um espaço em branco e cada 1 seja mapeado para⍵
.⍺,⊂
: coloque a matriz e junte-a aos fatores de escala/
: dobre à direita com a seguinte função:/∘⍉
: transpor e dimensionar horizontalmentefonte
MATL , 71 bytes
Experimente online!
Explicação
A imagem é horizontalmente simétrica, portanto, apenas a metade esquerda precisa ser codificada. Cada linha de 10 pixels é codificada em binário como um número entre 0 e 1023. Os pixels ativos são codificados como 0 em vez de 1, portanto, a primeira linha é o número 0 em vez de 1023.
Como as linhas consecutivas diferem apenas em alguns pixels, os números são codificados ainda mais diferencialmente. Portanto, cada linha será decodificada como a soma acumulada de todos os números até essa linha, seguida pela conversão em binário.
Os números necessários são então
0 é introduzido no MATL usando o
O
função que evita um separador com números vizinhos. Além disso, sinais negativos não implicam bytes extras, pois servem como separadores.Depois que a matriz é criada, ela é cumulativamente somada, decodificada em binário e espelhada horizontalmente. A matriz 2D resultante é usada para indexar uma sequência de dois caracteres para produzir o resultado. Essa string é da forma
'% '
em que'%'
está um caractere de entrada.Conforme observado pelo @Conor, o código também funciona com dois caracteres como entrada. Nesse caso, a sequência final indexada será no formato
'%_ '
, onde a entrada é uma sequência de dois caracteres'%_'
. O espaço será simplesmente ignorado, porque a matriz de indexação aborda apenas os dois primeiros caracteres.fonte
C (gcc) ,
199197 bytes-2 bytes graças a @JonathanFrech
Experimente online!
188 bytes (não imprimíveis)
Cortesia de @JonathanFrech.
Experimente online!
Nada de espetacular acontecendo. Como outros notaram, o fantasma é altamente simétrico. A imagem em si tem 20 unidades de largura, mas, exceto nas linhas superior e inferior, as três colunas mais à direita são idênticas. Isso nos permite armazenar metade da imagem como caracteres, em vez de precisar usar números inteiros:
A string resultante foi revertida para obter alguns bytes ao ter um loop descendente (também resolvendo um problema irritante com escapes hexadecimais). Outros loops podem ser invertidos sem problemas, graças à simetria.
Cada caractere é deslocado para a esquerda e recebe uma borda (com cuidado especial na primeira e na última linha). Então é apenas uma questão de produzir a string corretamente dimensionada.
Todos os loops for me fazem sentir que há uma maneira melhor.
fonte
\xff
que não pode ser substituído porÿ
( TIO )?Sério, 116 bytes
Essa nova linha é importante. Hexdump:
A mesma estratégia da resposta CJam de Dennis , mas os valores são codificados em hexadecimal, em vez de XOR com 544, e a manipulação de strings é muito mais difícil em Seriously.
Experimente online!
fonte
BBC BASIC,
239236232214 bytesA chamada
PROCM(1,1,35)
produz o fantasma feito de # símbolos. Os argumentos para o PROCM são: escala horizontal, escala vertical, valor ASCII do caractere.Este programa funcionará tanto para o Brandy Basic quanto para o BASIC 2 em um modelo B.
fonte
Lote,
740722720 bytesEditar: salvou
1820 bytes removendo espaços desnecessários.fonte
Stax , 45 bytes
Execute e depure
Explicação:
fonte
JavaScript (ES6), 167 bytes
Com base na resposta de @ Dennis. Eu acho que você pode cortar outro byte usando um FF literal em vez de
\f
, mas duvido que possa colar um aqui. Ao tentar fazer isso, você também pode querer usar\u01CA
oNJ
personagem.Infelizmente, anexar um espaço ao argumento do caractere custa 6 bytes inteiros.
fonte
Python 2,
838828618 bytesEconomizei 210 bytes usando uma string em vez de uma matriz. Graças a Dennis por essa sugestão, sei que posso melhorar ainda mais, mas por enquanto é uma boa melhoria.
É o melhor que posso fazer, não sou muito bom com gráficos na linha de comando.Tomei o pequeno fantasma como base.
Estou usando o ascii 219 por padrão, porque com esse caractere, o fantasma parece bem incrível !!!
Golfe
Experimente em repl.it
Ungolfed
Teste
fonte
Python 2, 244 bytes
fonte
Python 2, 169 bytes
Experimente online!
Explicação:
Como na resposta de Dennis , cada caractere nesta sequência representa a representação binária de uma linha da metade esquerda da "imagem", XOR 544.
Para cada caractere na sequência, faça o seguinte:
Transforme o caractere em sua representação inteira e execute um XOR binário com 544. Em seguida, transforme esse número inteiro em uma sequência de caracteres de sua representação binária, como '0xb1111111111'.
Para cada caractere na picada, começando na posição 2 (que ignora o 0b no início), faça o seguinte:
Se o caractere == "1", substitua-o pelo caractere fornecido, caso contrário, substitua-o por um espaço. Em seguida, copie esse caractere x vezes. (x = 0 resultará em uma sequência vazia.)
Concatene todas as cadeias em uma cadeia longa, separadas por uma cadeia vazia "".
faça uma sequência de b + o inverso de b, crie uma matriz contendo y instâncias dessa sequência (y = 0 produzirá uma lista vazia []) e, em seguida, acrescente essa lista à lista z.
Por fim, imprima para rastrear cada uma das seqüências produzidas, separadas por quebras de linha.
fonte