Imprime el mosaico AdamN

11

Adam7 es un algoritmo de entrelazado para imágenes ráster, como PNG. Se llama algoritmo "Adam7" porque fue inventado por Adam M. Costello, y se genera siguiendo un patrón determinado 7 veces. Una de las cosas interesantes sobre el algoritmo Adam7 que lo hace realmente divertido para el golf de código es que el patrón puede repetirse un número arbitrario de veces, siempre que sea extraño. En 1996, cuando PNGse desarrolló el estándar, el uso de solo 7 iteraciones se consideraba suficiente, ya que las 9 iteraciones eran demasiado complejas y 5 iteraciones no son tan eficientes.

Aquí está la primera iteración del mosaico:

a

Bastante simple. Este es un mosaico "Adam1". Así es como llegamos a la siguiente iteración, el mosaico "Adam3".

Como nuestro último mosaico fue 1x1, duplicamos la altura y el ancho, y el siguiente será 2x2. Primero, comenzamos con una 'a' en la esquina superior izquierda.

a-
--

Paso 2, copie este patrón a la derecha y aumente la letra en la que estamos en uno.

ab
--

Paso 3, igual que el paso 2, pero copia en lugar de a la derecha.

ab
cc

Auge. El mosaico "Adam3". Hagamos también el "Adam5", para que pueda ver cómo funciona el algoritmo. Este mosaico será, nuevamente, el doble de grande, entonces 4x4. Nuevamente, comenzamos con un aen la esquina superior izquierda:

a---
----
----
----

Duplique este patrón, aumente la letra y muévala a la derecha:

a-b-
----
----
----

De nuevo, esta vez abajo.

a-b-
----
c-c-
----

De nuevo, esta vez a la derecha.

adbd
----
cdcd
----

De nuevo, esta vez abajo.

adbd
eeee
cdcd
eeee

Este es el mosaico "Adam5". Aquí está la representación ASCII del mosaico Adam7:

afdfbfdf
gggggggg
efefefef
gggggggg
cfdfcfdf
gggggggg
efefefef
gggggggg

Y mientras lo hacemos, aquí hay una animación divertida de cada paso del mosaico Adam7 (aunque hace varios mosaicos uno al lado del otro):

ingrese la descripción de la imagen aquí

El reto

Dado un número impar positivo N , genera el mosaico "Adam N ". Puede usar cualquier método predeterminado de IO . Como estamos usando el alfabeto en lugar de números, solo necesita manejar entradas de hasta 25. Puede elegir generar caracteres en minúscula o mayúscula siempre que lo especifique y sea coherente.

Muestra IO

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 costumbre, este es el código de golf, por lo que se aplican las lagunas estándar, ¡y la respuesta más corta en bytes gana!

James
fuente
¿Dónde está el cen el caso de prueba 9?
Leaky Nun
@KennyLau Lo siento, ya está arreglado.
James

Respuestas:

8

CJam, 20 bytes

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

Pruébalo en línea .

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
fuente
6

MATL , 23 bytes

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

Pruébalo en línea!

Esto utiliza el producto tensor Kronecker repetido para extender la matriz, seguido de la transposición. En cada iteración, las nuevas columnas que contienen ceros se entrelazan con las antiguas; esos ceros se reemplazan por el nuevo valor apropiado (que aumenta en cada iteración); y la matriz se transpone.

(Se perdió un byte porque el producto Kronecker de Octave no permite la entrada de caracteres. Esto se solucionará para la próxima versión).

Explicación

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
fuente
3

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

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

Utilizando:

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

Sin golf:

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
fuente
Dios ... ¿qué significa una bandera tan larga?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ La -lbandera asigna $\ variable para que tenga el valor con código octal 0141(carácter ASCII a). Y l141es más corto que $\="a";.
Denis Ibaev
¡Oh que interesante!
Conor O'Brien
1

Pyth, 38 bytes

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

Pruébalo aquí!

Esperaría que esto sea fácilmente golfable.

Azul
fuente
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
fuente
oo, recursivo. ¡Agradable!
Conor O'Brien