fundo
A arte ASCII é a prática de criar imagens usando texto ASCII para formar formas.
Alias é o efeito criado pelos grandes "pixels" da arte ASCII, que são do tamanho de caracteres. A imagem fica com blocos e difícil de ver. A suavização de serrilhado remove esse efeito criando um gradiente e suavizando as arestas rígidas da arte ASCII.
O desafio
Seu desafio é escrever o programa mais curto possível, que terá uma obra de arte ASCII e produzirá uma versão com anti-alias.
Que tipo de anti-aliasing?
Toda a arte ASCII consistirá em dois tipos de símbolos: Espaços e espaços não em branco. Para cada caractere que não seja um espaço em branco, seu programa deve determinar se está em uma posição em que precisa ser suavizado. Se for, é necessário substituí-lo pelo caractere correto. Se não for, o personagem permanece o mesmo.
Como você sabe se um personagem precisa ser anti-alias? A resposta depende dos caracteres imediatamente acima, abaixo, esquerda e direita do caractere ( não nas diagonais ). Aqui está um gráfico de quando o anti-aliasing é necessário, onde ?
e x
pode representar qualquer caractere que não seja um espaço em branco.
x? -> d?
? ?
?x -> ?b
? ?
? ?
?x -> ?F
? ?
x? -> Y?
x -> ; Note: This character has been changed from _ to ;
? ?
? ?
x -> V
?x -> ?>
x? -> <?
x -> @
Entrada (e exemplo de arte ASCII pré-anti-aliasing)
Primeiro, haverá duas linhas de entrada (para STDIN), um número H seguido de um número W. Haverá, então, linhas H com exatamente W caracteres cada (excluindo a nova linha). Estas linhas a seguir serão a arte ASCII que precisa ser anti-alias. Aqui está um exemplo de entrada (não bonito, mas um teste):
7
9
888888
888888
999 98 7
666666
666666
6666
6
Saída (e exemplo arte anti-alias)
Seu programa deve gerar para STDOUT a arte ASCII (das mesmas dimensões), que foi anti-alias. Aqui está a saída para a entrada acima. Observe como os caracteres de borda são tratados como espaços em branco.
d8888>
d8888F
<99 98 @
Y6666b
Y6666>
Y66F
V
Isso pode não parecer tão bom (devido ao espaço entre as linhas no bloco de código), fica melhor com arte ASCII maior e a qualidade depende da fonte exata usada.
Outro exemplo
Entrada
12
18
xx xxx xxx
xxxx xxx xxx
xxxxxx xxx xxx
xxx xxx xxx xxx
xxxx xxx xxx xxx
xxxxxx xxx xxx
xxxx xxx xxx
x xx xxx xxx x
xx xxx xxx xx
xxx xxx xxx xxx
xxxx xxx xxx xx
xxxxx xxx xxx x
Saída
db <xb <xb
dxxb Yxb Yxb
dxxxxb Yxb Yxb
dxx xxb xxb xxb
Yxxb xxF xxF xxF
YxxxxF dxF dxF
YxxF dxF dxF
; YF dxF dxF ;
xb dxF dxF dx
xxb <xF <xF <xx
xxxb Yxb Yxb Yx
Yxxx> Yx> Yx> V
Regras, restrições e notas
Seu programa deve ser escrito apenas em caracteres ASCII imprimíveis, para que possamos criar arte com os programas. Fora isso, as regras padrão de código de golfe se aplicam.
fonte
_
tornou-se;
porque funciona melhor.Respostas:
Ruby,
180168 caracteresOutra implementação Ruby que adota uma abordagem zip. Você pode ver o segundo exemplo em execução online .
Editar: o uso
readlines
salva 12 caracteres.fonte
Rubi
275265263261258254244243214212207Amostra 1: http://ideone.com/PfNMA
Amostra 2: http://ideone.com/sWijD
fonte
0..h-1
pode ser escrito como0...h
. 3)G=[];h.times{G<<gets}
pode ser escrito comoG=readlines
, da mesma forma que no seu código C #. 4) Após o passo 3. a variável h se torna inútil, os valores de hew são usados apenas uma vez, portantoh=gets.to_i;w=gets.to_i;H=(0..h-1);W=(0..w-1)
podem ser escritos comoH=0...gets.to_i;W=0...gets.to_i
. 5) No presente casoand
pode ser escrito como&&
, que não precisa os espaços ao redor. 6) Você tem um extra; e você contou a nova linha no final do arquivo, que não é necessária. Isso significa 214 caracteres: ideone.com/CiW0lH=0..gets.to_i
quando escrevi o código, mas ele não parecia funcionar (obviamente, deve ter sido por outros motivos).map
vez deeach
2) emz=->...
vez dedef z...end
.map
vez deeach
mudar. Para a sintaxe lambda, no entanto, acho que exigiria que o usoz
fosse da forma emz.call(args)
vez dez(args)
, adicionando um pouco à contagem de caracteres. Por favor, deixe-me saber se estou faltando alguma coisa.[]
uso lambda .Javascript, 410 caracteres:
ungolfed:
Original,
440 caracteres:NB: Eu assumi que as duas primeiras linhas de entrada são realmente irrelevantes e o tamanho das seguintes linhas está correto. Também acho que talvez consiga cortar mais alguns caracteres quando tiver uma chance!
fonte
m={22:"b",28:"d",13:"Y",7:"F",20:";",5:"V",6:">",12:"<",4:"@"}
subscrito, em seguida, convertido de m comparseInt()
:m[parseInt(y[d](''),2)]
. Isso reduz o tamanho para 373 caracteres.Python, 259 caracteres
O programa lê a entrada em uma única sequência de caracteres
I
(com espaços separando as linhas), fecha uma lista de cinco tuplas contendo o caractere e seus quatro caracteres adjacentes e, em seguida, pesquisa o caractere resultante usando a indexação de seqüências.fonte
PHP -
359330282268257 caracteresfonte
\r\n
. Atualizei meu código para trabalhar com EOL estilo unix\n
.Pitão,
246241O WC e o teste na amostra 2 diferiram com a saída da solução Ruby na parte superior:
fonte
C #
591563fonte