Imprimer la tuile AdamN

11

Adam7 est un algorithme d'entrelacement pour les images raster, telles que PNG. On l'appelle l'algorithme "Adam7" car il a été inventé par Adam M. Costello, et il est généré en suivant un certain schéma 7 fois. L'une des choses intéressantes de l'algorithme Adam7 qui le rend vraiment amusant pour le golf de code, c'est que le motif peut être répété un nombre arbitraire de fois, tant qu'il est impair. À l'époque de 1996, lorsque la PNGnorme a été élaborée, l'utilisation de seulement 7 itérations était considérée comme suffisante, car les 9 itérations étaient trop complexes et 5 itérations n'étaient pas aussi efficaces.

Voici la première itération de la tuile:

a

Assez simple. Il s'agit d'une tuile "Adam1". Voici comment nous arrivons à la prochaine itération, la tuile "Adam3".

Depuis notre dernière tuile 1x1, nous doublons la hauteur et la largeur, et la suivante sera 2x2. Tout d'abord, nous commençons par un «a» dans le coin supérieur gauche.

a-
--

Étape 2, copiez ce modèle vers la droite et augmentez la lettre sur laquelle nous sommes.

ab
--

Étape 3, identique à l'étape 2, mais copiez vers le bas au lieu de droite.

ab
cc

Boom. La tuile "Adam3". Faisons aussi le "Adam5", afin que vous puissiez réellement voir comment l'algorithme fonctionne. Cette tuile sera, encore une fois, deux fois plus grande, donc 4x4. Encore une fois, nous commençons par un adans le coin supérieur gauche:

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

Doublez ce motif, augmentez la lettre et déplacez-la vers la droite:

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

Encore une fois, cette fois.

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

Encore une fois, cette fois à droite.

adbd
----
cdcd
----

Encore une fois, cette fois.

adbd
eeee
cdcd
eeee

Ceci est la tuile "Adam5". Voici la représentation ASCII de la tuile Adam7:

afdfbfdf
gggggggg
efefefef
gggggggg
cfdfcfdf
gggggggg
efefefef
gggggggg

Et pendant que nous y sommes, voici une animation amusante de chaque étape de la tuile Adam7 (bien qu'elle fasse plusieurs tuiles côte à côte):

entrez la description de l'image ici

Le défi

Étant donné un nombre impair impair N , sortez la tuile "Adam N ". Vous pouvez utiliser une méthode par défaut de IO . Étant donné que nous utilisons l'alphabet au lieu de chiffres, vous n'avez besoin de gérer que des entrées jusqu'à 25. Vous pouvez choisir de sortir des caractères en minuscules ou en majuscules tant que vous le spécifiez et qu'il est cohérent.

Exemple d'E / S

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

Comme d'habitude, il s'agit de code-golf, donc les failles standard s'appliquent et la réponse la plus courte en octets gagne!

James
la source
Où est le cdans le testcase 9?
Leaky Nun
@KennyLau Désolé, c'est réparé maintenant.
James

Réponses:

8

CJam, 20 octets

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

Essayez-le en ligne .

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

Alternatives de 20/21 octets:

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

MATL , 23 octets

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

Essayez-le en ligne!

Celui-ci utilise un produit tensoriel Kronecker répété pour étendre le réseau, suivi d'une transposition. À chaque itération, de nouvelles colonnes contenant des zéros sont entrelacées avec les anciennes; ces zéros sont ensuite remplacés par la nouvelle valeur appropriée (qui augmente à chaque itération); et la matrice est transposée.

(Un octet a été gaspillé car le produit Kronecker d'Octave ne permet pas la saisie de caractères. Cela sera corrigé pour la prochaine version).

Explication

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
la source
3

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

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

En utilisant:

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

Non 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
la source
Bonté .... que signifie un drapeau si long?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Le -ldrapeau attribue à la $\ variable la valeur avec le code octal 0141(caractère ASCII a). Et l141est plus court que $\="a";.
Denis Ibaev
Oh, comme c'est intéressant!
Conor O'Brien
1

Pyth, 38 octets

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

Essayez-le ici!

Je m'attendrais à ce que ce soit facilement jouable au golf.

Bleu
la source
1

JavaScript (ES6), 114 octets

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
la source
oo, récursif. Agréable!
Conor O'Brien