Распечатать плитку AdamN

11

Adam7 - это алгоритм чередования растровых изображений, например PNG. Он называется алгоритмом «Адам7», потому что он был изобретен Адамом М. Костелло, и его генерируют, следуя определенной схеме 7 раз. Одна из замечательных особенностей алгоритма Adam7, которая делает его действительно увлекательным для гольф-кода, состоит в том, что шаблон можно повторять произвольное количество раз, если он нечетный. Когда в 1996 году PNGбыл разработан стандарт, использование только 7 итераций считалось достаточным, поскольку 9 итераций были слишком сложными, а 5 итераций не столь эффективны.

Вот первая итерация плитки:

a

Довольно просто Это плитка "Adam1". Вот как мы можем перейти к следующей итерации, плитке «Adam3».

Так как наш последний тайл был 1x1, мы удваиваем высоту и ширину, и следующий будет 2x2. Сначала мы начнем с буквы «а» в верхнем левом углу.

a-
--

Шаг 2, скопируйте этот шаблон справа и увеличьте букву, на которой мы находимся, на единицу.

ab
--

Шаг 3, такой же, как шаг 2, но скопируйте вместо правой.

ab
cc

Boom. Плитка "Адам3". Давайте также выполним «Adam5», чтобы вы могли увидеть, как работает алгоритм. Эта плитка, опять же, будет вдвое больше, поэтому 4x4. Опять же, мы начинаем с aв верхнем левом углу:

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

Удвойте этот шаблон, увеличьте букву и переместите ее вправо:

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

Опять на этот раз вниз.

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

Опять на этот раз направо.

adbd
----
cdcd
----

Опять на этот раз вниз.

adbd
eeee
cdcd
eeee

Это плитка "Adam5". Вот ASCII-представление плитки Adam7:

afdfbfdf
gggggggg
efefefef
gggggggg
cfdfcfdf
gggggggg
efefefef
gggggggg

И пока мы на этом, вот забавная анимация каждого шага плитки Adam7 (хотя она делает несколько плиток рядом):

введите описание изображения здесь

Соревнование

Учитывая положительное нечетное число N , выведите плитку "Адам N ". Вы можете использовать любой метод ввода / вывода по умолчанию . Поскольку вместо цифр мы используем алфавит, вам нужно обрабатывать ввод только до 25. Вы можете выбрать вывод символов нижнего или верхнего регистра, если вы укажете, и это будет согласованно.

Образец ввода-вывода

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*
Sp3000
источник
6

MATL , 23 байта

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

Попробуйте онлайн!

Это использует повторное тензорное произведение Кронекера для расширения массива с последующей транспозицией. На каждой итерации новые столбцы, содержащие нули, чередуются со старыми; эти нули затем заменяются соответствующим новым значением (которое увеличивается на каждой итерации); и матрица транспонируется.

(Один байт потрачен впустую, потому что продукт Octave Kronecker не позволяет вводить символы. Это будет исправлено в следующем выпуске).

объяснение

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$=<++$%;$\=$_}{'

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 .

Денис Ибаев
источник
Боже мой ... что означает такой длинный флаг?
Конор О'Брайен
@ 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)}
`)
Нил
источник
оо, рекурсивный. Ницца!
Конор О'Брайен