Cetak ubin AdamN


11

Adam7 adalah algoritma interlacing untuk gambar raster, seperti PNG. Ini disebut algoritma "Adam7" karena diciptakan oleh Adam M. Costello, dan dihasilkan dengan mengikuti pola tertentu 7 kali. Salah satu hal keren tentang algoritma Adam7 yang membuatnya sangat menyenangkan untuk kode golf, adalah bahwa polanya dapat diulang beberapa kali secara acak, asalkan aneh. Kembali ketika 1996 ketika PNGstandar dikembangkan, hanya menggunakan 7 iterasi dipandang cukup, karena iterasi 9 terlalu kompleks, dan 5 iterasi tidak seefisien.

Berikut ini adalah iterasi pertama ubin:

a

Cukup mudah. Ini adalah ubin "Adam1". Inilah cara kami mencapai iterasi berikutnya, ubin "Adam3".

Karena ubin terakhir kami adalah 1x1, kami menggandakan tinggi dan lebar, dan yang berikutnya akan menjadi 2x2. Pertama, kita mulai dengan 'a' di sudut kiri atas.

a-
--

Langkah 2, salin pola ini ke kanan, dan tingkatkan huruf kita satu per satu.

ab
--

Langkah 3, sama seperti langkah 2, tetapi salin bukan yang benar.

ab
cc

Ledakan. Ubin "Adam3". Mari kita lakukan "Adam5" juga, sehingga Anda benar-benar dapat melihat bagaimana algoritma bekerja. Ubin ini, sekali lagi, akan menjadi dua kali lebih besar, jadi 4x4. Sekali lagi, kita mulai dengan adi sudut kiri atas:

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

Gandakan pola ini, tambah suratnya, dan pindahkan ke kanan:

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

Sekali lagi, kali ini turun.

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

Sekali lagi, kali ini ke kanan.

adbd
----
cdcd
----

Sekali lagi, kali ini turun.

adbd
eeee
cdcd
eeee

Ini adalah ubin "Adam5". Berikut adalah representasi ASCII dari ubin Adam7:

afdfbfdf
gggggggg
efefefef
gggggggg
cfdfcfdf
gggggggg
efefefef
gggggggg

Dan sementara kita melakukannya, ini adalah animasi yang menyenangkan dari setiap langkah ubin Adam7 (meskipun ada beberapa ubin berdampingan):

masukkan deskripsi gambar di sini

Tantangan

Diberikan angka ganjil positif N , menampilkan ubin "Adam N ". Anda dapat menggunakan metode IO standar apa pun . Karena kami menggunakan alfabet sebagai pengganti angka, Anda hanya perlu menangani input hingga 25. Anda dapat memilih untuk menampilkan karakter huruf kecil atau huruf besar selama Anda tentukan dan konsisten.

Contoh 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

Seperti biasa, ini adalah kode-golf, jadi celah standar berlaku, dan jawaban tersingkat dalam byte menang!


Untuk apa cdi dalam testcase 9?
Leaky Nun

@ KennyLau Maaf, Sudah diperbaiki sekarang.
James

Jawaban:


8

CJam, 20 byte

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

Cobalah 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

Alternatif 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

Cobalah online!

Ini menggunakan produk tensor Kronecker berulang untuk memperluas array, diikuti oleh transposisi. Pada setiap iterasi, kolom baru yang berisi nol disatukan dengan yang lama; angka-angka tersebut kemudian digantikan oleh nilai baru yang sesuai (yang meningkat pada setiap iterasi); dan matriks ditransformasikan.

(Satu byte terbuang karena produk Kronecker Octave tidak memungkinkan input char. Ini akan diperbaiki untuk rilis berikutnya).

Penjelasan

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 ( -pflag) = 88 byte

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

Menggunakan:

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

Tidak Disatukan:

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 .


Astaga .... apa arti bendera panjang itu?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ -lBendera menetapkan $\ variabel untuk memiliki nilai dengan kode oktal 0141(karakter ASCII a). Dan l141lebih pendek dari $\="a";.
Denis Ibaev

Oh, betapa menarik!
Conor O'Brien


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, rekursif. Bagus!
Conor O'Brien
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.