In gạch AdamN


11

Adam7 là một thuật toán xen kẽ cho các hình ảnh raster, chẳng hạn như PNG. Nó được gọi là thuật toán "Adam7" bởi vì nó được phát minh bởi Adam M. Costello và nó được tạo ra bằng cách tuân theo một mẫu nhất định 7 lần. Một trong những điều thú vị về thuật toán Adam7 làm cho nó thực sự thú vị đối với môn đánh gôn, là mô hình có thể được lặp lại một số lần tùy ý, miễn là nó kỳ quặc. Trở lại năm 1996 khi PNGtiêu chuẩn được phát triển, chỉ sử dụng 7 lần lặp là đủ, vì 9 lần lặp quá phức tạp và 5 lần lặp không hiệu quả.

Đây là lần lặp đầu tiên của gạch:

a

Khá đơn giản. Đây là một lát "Adam1". Đây là cách chúng ta có được lần lặp tiếp theo, ô "Adam3".

Vì lát cuối cùng của chúng tôi là 1x1, chúng tôi tăng gấp đôi chiều cao và chiều rộng, và cái tiếp theo sẽ là 2x2. Đầu tiên, chúng tôi bắt đầu với một 'a' ở góc trên bên trái.

a-
--

Bước 2, sao chép mẫu này sang bên phải và tăng chữ cái chúng tôi viết lên.

ab
--

Bước 3, giống như bước 2, nhưng sao chép xuống thay vì phải.

ab
cc

Bùng nổ. Ngói "Adam3". Chúng ta cũng hãy thực hiện "Adam5", vì vậy bạn thực sự có thể thấy thuật toán hoạt động như thế nào. Gạch này sẽ, một lần nữa, sẽ lớn gấp đôi, vì vậy 4x4. Một lần nữa, chúng tôi bắt đầu với một aở góc trên bên trái:

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

Nhân đôi mẫu này, tăng chữ cái và di chuyển nó sang bên phải:

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

Một lần nữa, lần này xuống.

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

Một lần nữa, lần này là bên phải.

adbd
----
cdcd
----

Một lần nữa, lần này xuống.

adbd
eeee
cdcd
eeee

Đây là gạch "Adam5". Dưới đây là đại diện ASCII của ô Adam7:

afdfbfdf
gggggggg
efefefef
gggggggg
cfdfcfdf
gggggggg
efefefef
gggggggg

Và trong khi chúng ta đang ở đó, đây là một hình ảnh động thú vị về từng bước của ô Adam7 (mặc dù nó có một số ô cạnh nhau):

nhập mô tả hình ảnh ở đây

Các thách thức

Cho số lẻ N dương , xuất ra ô "Adam N ". Bạn có thể sử dụng bất kỳ phương pháp mặc định nào của IO . Vì chúng tôi đang sử dụng bảng chữ cái thay cho số, bạn chỉ cần xử lý các đầu vào tối đa 25. Bạn có thể chọn xuất các ký tự chữ thường hoặc chữ hoa miễn là bạn chỉ định và nó phù hợp.

IO mẫu

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

Như thường lệ, đây là môn đánh gôn, vì vậy các sơ hở tiêu chuẩn được áp dụng và câu trả lời ngắn nhất bằng byte sẽ thắng!


Trường hợp ctrong thử nghiệm cho 9?
Leaky Nun

@KennyLau Xin lỗi, giờ nó đã được sửa.
James

Câu trả lời:


8

CJam, 20 byte

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

Hãy thử trực tuyến .

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

Các lựa chọn thay thế 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

Hãy thử trực tuyến!

Điều này sử dụng sản phẩm tenx Kronecker lặp đi lặp lại để mở rộng mảng, tiếp theo là chuyển vị. Ở mỗi lần lặp, các cột mới chứa các số 0 được xen kẽ với các cột cũ; các số 0 sau đó được thay thế bằng giá trị mới thích hợp (tăng ở mỗi lần lặp); và ma trận được hoán vị.

(Một byte bị lãng phí vì sản phẩm Kronecker của Octave không cho phép nhập char. Điều này sẽ được sửa cho lần phát hành tiếp theo).

Giải trình

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

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

Sử dụng:

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

Ung dung:

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 .


Trời ơi .... một lá cờ dài như vậy có nghĩa là gì?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ -lCờ gán $\ biến có giá trị với mã bát phân 0141(ký tự ASCII a). Và l141ngắn hơn $\="a";.
Denis Ibaev

Ồ, thật là thú vị!
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, đệ quy. Đẹp!
Conor O'Brien
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.