O Adam7 é um algoritmo de entrelaçamento para imagens rasterizadas, como PNG. Ele é chamado de algoritmo "Adam7" porque foi inventado por Adam M. Costello e é gerado seguindo um determinado padrão 7 vezes. Uma das coisas legais sobre o algoritmo Adam7 que o torna realmente divertido para o golfe com código é que o padrão pode ser repetido um número arbitrário de vezes, desde que seja estranho. Em 1996, quando o PNG
padrão foi desenvolvido, o uso de apenas 7 iterações era considerado suficiente, pois as 9 iterações eram muito complexas e as 5 iterações não eram tão eficientes.
Aqui está a primeira iteração do bloco:
a
Bem simples. Este é um bloco "Adam1". Veja como chegamos à próxima iteração, o bloco "Adam3".
Como nosso último ladrilho foi 1x1
, dobramos a altura e a largura, e o próximo será 2x2
. Primeiro, começamos com um 'a' no canto superior esquerdo.
a-
--
Etapa 2, copie esse padrão para a direita e aumente a letra em que estamos.
ab
--
Etapa 3, igual à etapa 2, mas copie para baixo em vez de para a direita.
ab
cc
Estrondo. O bloco "Adam3". Vamos fazer o "Adam5" também, para que você possa realmente ver como o algoritmo funciona. Esse ladrilho, novamente, será duas vezes maior 4x4
. Novamente, começamos com um a
no canto superior esquerdo:
a---
----
----
----
Duplique esse padrão, aumente a letra e mova-a para a direita:
a-b-
----
----
----
Mais uma vez, desta vez para baixo.
a-b-
----
c-c-
----
Mais uma vez, desta vez para a direita.
adbd
----
cdcd
----
Mais uma vez, desta vez para baixo.
adbd
eeee
cdcd
eeee
Este é o bloco "Adam5". Aqui está a representação ASCII do bloco Adam7:
afdfbfdf
gggggggg
efefefef
gggggggg
cfdfcfdf
gggggggg
efefefef
gggggggg
E enquanto estamos nisso, aqui está uma animação divertida de cada etapa do bloco Adam7 (embora ele faça vários blocos lado a lado):
O desafio
Dado um número ímpar positivo N , produza o bloco "Adam N ". Você pode usar qualquer método padrão de IO . Como estamos usando o alfabeto em vez de números, você só precisa manipular entradas de até 25. Você pode optar por gerar caracteres minúsculos ou maiúsculos, desde que você especifique e seja consistente.
IO de amostra
1:
a
3:
ab
cc
5:
adbd
eeee
cdcd
eeee
7:
afdfbfdf
gggggggg
efefefef
gggggggg
cfdfcfdf
gggggggg
efefefef
gggggggg
9:
ahfhdhfhbhfhdhfh
iiiiiiiiiiiiiiii
ghghghghghghghgh
iiiiiiiiiiiiiiii
ehfhehfhehfhehfh
iiiiiiiiiiiiiiii
ghghghghghghghgh
iiiiiiiiiiiiiiii
chfhdhfhchfhdhfh
iiiiiiiiiiiiiiii
ghghghghghghghgh
iiiiiiiiiiiiiiii
ehfhehfhehfhehfh
iiiiiiiiiiiiiiii
ghghghghghghghgh
iiiiiiiiiiiiiiii
Como de costume, esse é um código de golfe, então as brechas padrão se aplicam e a resposta mais curta em bytes ganha!
c
o testcase9
?Respostas:
CJam, 20 bytes
Experimente online .
Alternativas de 20/21 bytes:
fonte
MATL , 23 bytes
Experimente online!
Isso usa o produto tensor Kronecker repetido para estender a matriz, seguido pela transposição. A cada iteração, novas colunas contendo zeros são intercaladas com as antigas; esses zeros são substituídos pelo novo valor apropriado (que aumenta a cada iteração); e a matriz é transposta.
(Um byte foi desperdiçado porque o produto Kronecker da Octave não permite a entrada de caracteres. Isso será corrigido para a próxima versão).
Explicação
fonte
Perl,
11010410099918987 + 1 (-p
sinalizador) = 88 bytesUsando:
Ungolfed:
Ideone .
fonte
-l
sinalizador atribui$\
variável para ter o valor com código octal0141
(caractere ASCIIa
). El141
é mais curto que$\="a";
.Pitão, 38 bytes
Experimente aqui!
Eu esperaria que isso fosse facilmente jogável.
fonte
JavaScript (ES6), 114 bytes
fonte