AdamNタイルを印刷する


11

Adam7は、PNGなどのラスターイメージ用のインターレースアルゴリズムです。Adam M. Costelloによって発明されたため、「Adam7」アルゴリズムと呼ばれ、特定のパターンを7回たどることによって生成されます。コードゴルフを本当に楽しくするAdam7アルゴリズムの素晴らしい点の1つは、パターンが奇数である限り、任意の回数だけ繰り返すことができることです。1996年にPNG標準が開発されたとき、9回の反復は複雑すぎ、5回の反復は効率的ではなかったため、7回の反復で十分であると見なされていました。

タイルの最初の反復は次のとおりです。

a

ものすごく単純。これは「Adam1」タイルです。次の反復である「Adam3」タイルに到達する方法を次に示します。

最後のタイルがだったので1x1、高さと幅が2倍になり、次のタイルはになります2x2。まず、左上隅の「a」から始めます。

a-
--

ステップ2、このパターンを右にコピーし、現在の文字を1つ増やします。

ab
--

ステップ3、ステップ2と同じですが、右ではなく下にコピーします。

ab
cc

ブーム。「Adam3」タイル。「Adam5」も実行してみましょう。実際にアルゴリズムがどのように機能するかを確認できます。このタイルもまた2倍の大きさになり4x4ます。繰り返しますが、a左上隅のから始めます。

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

このパターンを2倍にし、文字を増やして、右に移動します。

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か?
漏れの修道女

@KennyLau申し訳ありませんが、現在修正済みです。
ジェームズ

回答:


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

オンラインでお試しください!

これは、配列を拡張するために繰り返しクロネッカーテンソル積を使用し、その後に転置を行います。各反復で、ゼロを含む新しい列は古い列と交互に配置されます。これらのゼロは適切な新しい値に置き換えられます(各反復で増加します)。行列が転置されます。

(OctaveのKronecker製品は文字入力を許可しないため、1バイトが無駄になります。これは次のリリースで修正される予定です)。

説明

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フラグ$\ は、8進コード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)}
`)

ああ、再帰的。いいね!
コナーオブライエン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.