Imprimir o bloco AdamN

11

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 PNGpadrã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 ano 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):

insira a descrição da imagem aqui

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!

James
fonte
Onde está co testcase 9?
Freira vazando
@KennyLau Desculpe, está consertado agora.
James

Respostas:

8

CJam, 20 bytes

Laq~{'a+_@f*\f+z}/N*

Experimente online .

La                      Push [[]]
  q~                    Push input n
    {           }/      For i in 0..n-1 ...
     'a+                  Add to char 'a to give current char
        _@f*              Join each row by char
            \f+           Add char to the end of each row as well
               z          Zip to transpose
                  N*    Join result by newlines

Alternativas de 20/21 bytes:

Laaq~{'a+aff+:sz}/N*
Laaq~{'a+\Laf+f*z}/N*
Laq~{'a+f{_@*\+}z}/N*
Sp3000
fonte
6

MATL , 23 bytes

97tiq:+"TFX*tXa~@wZ(!]c

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

97       % Push 97 (ASCII for 'a')
t        % Duplicate
iq:      % Take input n. Range [1 2 ... n-1]
+        % Add. Gives [98 99 ... 97+n-1] (letters to be filled)
"        % For each
  TFX*   %   Kronecker product with [1 0]. This interleaves new columns with zeros
  tXa~   %   Duplicate. Logical index for the new columns
  @wZ(   %   Assign letter to those columns
  !      %   Transpose (zip)
]        % End if
c        % Convert to chat. Implicitly display
Luis Mendo
fonte
3

Perl, 110 104 100 99 91 89 87 + 1 ( -psinalizador) = 88 bytes

#!perl -p
$==$_/2;$_=a.$/;$"=b;s/\w/$&.$"/ge,$"++,s/\n/$&.$"x2**$%.$&/ge,$"++until$=<++$%;$\=$_}{

Usando:

> echo 5 | perl -pe '$==$_/2;$_=a.$/;$"=b;s/\w/$&.$"/ge,$"++,s/\n/$&.$"x2**$%.$&/ge,$"++until$=<++$%;$\=$_}{'

Ungolfed:

while (<>) {
# code above added by -p
    # $_ has input value
    # $/ = "\n" by default
    # $% = 0 by default
    my $n = $_ / 2;   # input
    my $s = "a" . $/; # "a\n"
    my $c = "b";      # "b"
    my $i = $%;       # 0
    while (++$i <= $n) {
        $s =~ s/(\w)/$1 . $c/ge;
        $c++;
        $s =~ s/(\n)/$1 . ($с x 2**$i) . $1/ge;
        $c++;
    }
    $\ = $s;
} {
# code below added by -p
    print;  # prints $_ (undef here) and $\
}

Ideone .

Denis Ibaev
fonte
Meu Deus ... o que significa uma bandeira tão longa?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ O -lsinalizador atribui $\ variável para ter o valor com código octal 0141(caractere ASCII a). E l141é mais curto que $\="a";.
Denis Ibaev 16/05/19
Oh, que interessante!
Conor O'Brien
1

Pitão, 38 bytes

u:+r:jK@;tyHGb++b*^2H@;yHb6b+bKbh/Q2"a

Experimente aqui!

Eu esperaria que isso fosse facilmente jogável.

Azul
fonte
1

JavaScript (ES6), 114 bytes

f=n=>n<2?`a
`:f(n-2).replace(/./g,`$&`+(n+8).toString(36)).replace(/\n/g,`
${(n+9).toString(36).repeat(1<<n/2)}
`)
Neil
fonte
recursiva. Agradável!
Conor O'Brien