Stampa la tessera AdamN


11

Adam7 è un algoritmo di interlacciamento per immagini raster, come PNG. Si chiama algoritmo "Adam7" perché è stato inventato da Adam M. Costello e viene generato seguendo un certo schema 7 volte. Una delle cose interessanti dell'algoritmo Adam7 che lo rende davvero divertente per il golf del codice, è che il pattern può essere ripetuto un numero arbitrario di volte, purché sia ​​strano. All'inizio del 1996, quando PNGfu sviluppato lo standard, l'uso di solo 7 iterazioni era considerato sufficiente, poiché le 9 iterazioni erano troppo complesse e 5 iterazioni non erano altrettanto efficienti.

Ecco la prima iterazione della piastrella:

a

Abbastanza semplice. Questa è una tessera "Adam1". Ecco come arriviamo alla prossima iterazione, il riquadro "Adam3".

Poiché la nostra ultima tessera era 1x1, raddoppiamo l'altezza e la larghezza, e la prossima sarà 2x2. Innanzitutto, iniziamo con una "a" nell'angolo in alto a sinistra.

a-
--

Passo 2, copia questo schema a destra e aumenta la lettera su cui ci troviamo.

ab
--

Passaggio 3, uguale al passaggio 2, ma copia verso il basso anziché a destra.

ab
cc

Boom. La tessera "Adam3". Facciamo anche "Adam5", così puoi effettivamente vedere come funziona l'algoritmo. Questa tessera sarà, di nuovo, due volte più grande, quindi 4x4. Ancora una volta, iniziamo con un anell'angolo in alto a sinistra:

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

Raddoppia questo motivo, aumenta la lettera e spostala verso destra:

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

Ancora una volta, questa volta.

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

Ancora una volta, questa volta a destra.

adbd
----
cdcd
----

Ancora una volta, questa volta.

adbd
eeee
cdcd
eeee

Questa è la tessera "Adam5". Ecco la rappresentazione ASCII del riquadro Adam7:

afdfbfdf
gggggggg
efefefef
gggggggg
cfdfcfdf
gggggggg
efefefef
gggggggg

E mentre ci siamo, ecco un'animazione divertente di ogni passaggio della tessera Adam7 (sebbene faccia diverse tessere fianco a fianco):

inserisci qui la descrizione dell'immagine

La sfida

Dato un numero dispari positivo N , emette il riquadro "Adam N ". È possibile utilizzare qualsiasi metodo predefinito di IO . Dato che stiamo usando l'alfabeto al posto dei numeri, devi solo gestire input fino a 25. Puoi scegliere di produrre caratteri minuscoli o maiuscoli purché tu specifichi e sia coerente.

IO di esempio

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

Come al solito, si tratta di code-golf, quindi si applicano scappatoie standard e vince la risposta più breve in byte!


Dov'è cil testcase 9?
Leaky Nun,

@KennyLau Siamo spiacenti, ora è stato risolto.
James,

Risposte:


8

CJam, 20 byte

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

Provalo 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

Alternative a 20/21 byte:

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

6

MATL , 23 byte

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

Provalo online!

Questo utilizza ripetuti prodotti tensore di Kronecker per estendere l'array, seguito dalla trasposizione. Ad ogni iterazione, le nuove colonne contenenti zeri sono interlacciate con la vecchia; tali zeri vengono quindi sostituiti dal nuovo valore appropriato (che aumenta ad ogni iterazione); e la matrice viene trasposta.

(Un byte è sprecato perché il prodotto Kronecker di Octave non consente l'immissione di caratteri. Questo problema verrà risolto per la prossima versione).

Spiegazione

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

3

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

#!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 .


Bontà .... cosa significa una bandiera così lunga?
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Il -lflag assegna $\ alla variabile il valore con codice ottale 0141(carattere ASCII a). Ed l141è più corto di $\="a";.
Denis Ibaev,

Oh, che interessante!
Conor O'Brien,

1

Pyth, 38 byte

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

Provalo qui!

Mi aspetto che questo sia facilmente giocabile a golf.


1

JavaScript (ES6), 114 byte

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)}
`)

oo, ricorsivo. Bello!
Conor O'Brien,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.