打印AdamN磁贴


11

Adam7是用于栅格图像(例如PNG)的隔行算法。之所以称为“ Adam7”算法,是因为它是Adam M. Costello发明的,并且是通过遵循一定的模式7次而生成的。Adam7算法令代码高尔夫真正有趣的一件很酷的事情是,只要奇怪,该模式就可以重复任意次。早在1996 PNG年制定标准时,仅9次迭代就足够了,因为9次迭代过于复杂,而5次迭代效率不高。

这是图块的第一次迭代:

a

很简单 这是一个“ Adam1”图块。这是我们进入下一个迭代的方式,即“ Adam3”图块。

由于上一张是1x1,我们将高度和宽度加倍,下一张将是2x2。首先,我们从左上角的“ a”开始。

a-
--

第2步,将此模式复制到右侧,然后将我们的字母增加一个。

ab
--

步骤3与步骤2相同,但请向下复制而不是向右复制。

ab
cc

繁荣。“ Adam3”图块。让我们也执行“ Adam5”,这样您就可以实际了解算法的工作原理。因此,此图块将再大一倍4x4。同样,我们从a左上角的a开始:

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

将此模式加倍,增加字母,然后将其移至右侧:

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

再次,这次下来。

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

同样,这次是在右边。

adbd
----
cdcd
----

再次,这次下来。

adbd
eeee
cdcd
eeee

这是“ Adam5”图块。这是Adam7磁贴的ASCII表示形式:

afdfbfdf
gggggggg
efefefef
gggggggg
cfdfcfdf
gggggggg
efefefef
gggggggg

而当我们使用它时,这是Adam7磁贴的每个步骤的有趣动画(尽管它并排执行了几个磁贴):

在此处输入图片说明

挑战

给定正奇数N,输出“ Adam N ”图块。您可以使用IO的任何默认方法。由于我们使用字母代替数字,因此您最多只需要处理25个输入即可。您可以选择输出小写或大写字符,只要您指定且一致即可。

样品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

像往常一样,这是代码高尔夫球,因此存在标准漏洞,并且最短答案以字节为单位!


哪里c的测试用例的9
Leaky Nun

@KennyLau抱歉,现在已修复。
2016年

Answers:


8

CJam,20个字节

Laq~{'a+_@f*\f+z}/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

20/21字节替代方案:

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

6

MATL,23字节

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

在线尝试!

这使用重复的Kronecker张量积来扩展阵列,然后进行转置。在每次迭代中,包含零的新列与旧列交织;然后将这些零替换为适当的新值(每次迭代都会增加);然后转置矩阵。

(浪费了一个字节,因为Octave的Kronecker产品不允许输入char。此问题将在下一版本中修复)。

说明

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(-p标志)= 88字节

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

使用:

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

取消高尔夫:

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 $\
}

伊迪恩


天哪……这么长的标志是什么意思?
科纳·奥布莱恩

@CᴏɴᴏʀO'Bʀɪᴇɴ该-l标志为$\ 变量分配具有八进制代码0141(ASCII字符a)的值。并且l141比短$\="a";
丹尼斯·伊巴耶夫

哦,真有趣!
科纳·奥布莱恩


1

JavaScript(ES6),114个字节

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,递归。真好!
科纳·奥布赖恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.