Роздрукуйте плитку AdamN


11

Adam7 - алгоритм переплетення растрових зображень, наприклад PNG. Його називають алгоритмом "Adam7", оскільки він був винайдений Адамом М. Костелло, і він генерується, дотримуючись певної моделі 7 разів. Один із цікавих моментів алгоритму Адама7, який робить його справді цікавим для кодового гольфу, - це те, що шаблон можна повторювати довільну кількість разів, поки це не дивно. Ще в 1996 році, коли PNGбув розроблений стандарт, було використано лише 7 ітерацій, оскільки 9 ітерацій були надто складними, а 5 ітерацій - не настільки ефективними.

Ось перша ітерація плитки:

a

Досить просто. Це плитка "Adam1". Ось як ми переходимо до наступної ітерації, плитки "Adam3".

Оскільки наша остання плитка була 1x1, ми подвоюємо висоту та ширину, і наступна буде 2x2. Спочатку ми починаємо з значка "a" у верхньому лівому куті.

a-
--

Крок 2, скопіюйте цей візерунок праворуч і збільшить літеру, на якій ми працюємо.

ab
--

Крок 3 - те саме, що є кроком 2, але скопіюйте його вниз, а не праворуч.

ab
cc

Бум. Плитка «Адам3». Давайте також зробимо "Adam5", щоб ви могли реально побачити, як працює алгоритм. Ця плитка, знову ж таки, буде вдвічі більшою, значить 4x4. Знову починаємо з aлівого верхнього кута:

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

Подвійно цей візерунок, збільши літеру та перемісти її праворуч:

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

Знову на цей раз вниз.

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

Знову на цей раз праворуч.

adbd
----
cdcd
----

Знову на цей раз вниз.

adbd
eeee
cdcd
eeee

Це плитка «Адам5». Ось представлення ASCII плитки Adam7:

afdfbfdf
gggggggg
efefefef
gggggggg
cfdfcfdf
gggggggg
efefefef
gggggggg

І поки ми це робимо, ось весела анімація кожного кроку плитки Adam7 (хоча це і кілька плиток поруч):

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

Змагання

Давши додатне непарне число N , виведіть плитку "Адам 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 Вибачте, це виправлено зараз.
Джеймс

Відповіді:


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 для розширення масиву з подальшим переміщенням. При кожній ітерації нові стовпці, що містять нулі, переплітаються зі старими; ці нулі потім замінюються відповідним новим значенням (яке збільшується при кожній ітерації); і матриця транспонується.

(Один байт був марний, оскільки продукт Kronecker Octave не дозволяє вводити символи. Це буде виправлено для наступного випуску).

Пояснення

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

Ідеон .


Боже .... що означає такий довгий прапор?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ -lПрапор присвоює $\ змінній значення з восьмеричним кодом 0141(символ ASCII a). І l141коротше, ніж $\="a";.
Денис Ібаєв

О, як цікаво!
Conor O'Brien


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)}
`)

оо, рекурсивна. Приємно!
Conor O'Brien
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.