AdamN döşemesini yazdır


11

Adam7 , PNG gibi tarama görüntüleri için bir araya getirme algoritmasıdır. "Adam7" algoritması olarak adlandırılır çünkü Adam M. Costello tarafından icat edilmiştir ve 7 kez belirli bir patern takip edilerek üretilmiştir. Kod golf için gerçekten eğlenceli hale getiren Adam7 algoritmasıyla ilgili harika şeylerden biri, desenin garip olduğu sürece keyfi sayıda tekrarlanabilmesidir. 1996 PNGstandardı geliştirildiği zaman, sadece 9 iterasyon çok karmaşık olduğundan ve 5 iterasyon o kadar etkili olmadığı için sadece 7 iterasyon kullanmak yeterli görülmüştür.

Döşemenin ilk yinelemesi:

a

Gayet basit. Bu bir "Adam1" kutucuğu. Bir sonraki yinelemeye, "Adam3" döşemesine nasıl ulaşacağımız aşağıda açıklanmıştır.

Son döşememiz olduğu için 1x1, yüksekliği ve genişliği ikiye katlıyoruz ve bir sonraki karo olacak 2x2. İlk olarak, sol üst köşede bir 'a' ile başlıyoruz.

a-
--

Adım 2, bu kalıbı sağa kopyalayın ve üzerinde bulunduğumuz harfi bir arttırın.

ab
--

Adım 3, adım 2 ile aynıdır, ancak sağ yerine kopyalayın.

ab
cc

Boom. "Adam3" kutucuğu. "Adam5" i de yapalım, böylece algoritmanın nasıl çalıştığını görebilirsiniz. Bu karo yine iki kat daha büyük olacak 4x4. Yine, asol üst köşede bir ile başlıyoruz :

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

Bu deseni ikiye katlayın, harfi artırın ve sağa doğru hareket ettirin:

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

Yine, bu sefer çöktü.

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

Yine, bu sefer sağa.

adbd
----
cdcd
----

Yine, bu sefer çöktü.

adbd
eeee
cdcd
eeee

Bu "Adam5" kutucuğu. Adam7 döşemesinin ASCII temsili:

afdfbfdf
gggggggg
efefefef
gggggggg
cfdfcfdf
gggggggg
efefefef
gggggggg

Ve işteyken, Adam7 döşemesinin her adımının eğlenceli bir animasyonu (yan yana birkaç fayans yapmasına rağmen):

resim açıklamasını buraya girin

Meydan okuma

Pozitif tek sayı N verildiğinde , "Adam N " döşemesi çıktı. IO'nun herhangi bir varsayılan yöntemini kullanabilirsiniz . Alfabeyi sayı yerine kullandığımız için, yalnızca 25'e kadar girişleri işlemeniz gerekir. Belirttiğiniz sürece ve büyük harflerle tutarlı küçük harf veya büyük harf karakterleri çıkarmayı seçebilirsiniz.

Örnek ES

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

Her zamanki gibi, bu kod golf, bu yüzden standart boşluklar geçerlidir ve bayt kazanma en kısa cevap kazanır!


cTest çantasında nerede 9?
Sızdıran Rahibe

@KennyLau Üzgünüz, Şimdi düzeltildi.
James

Yanıtlar:


8

CJam, 20 bayt

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

Çevrimiçi deneyin .

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 bayt alternatifleri:

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

6

MATL , 23 bayt

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

Çevrimiçi deneyin!

Bu dizi genişletmek için tekrarlanan Kronecker tensör ürünü kullanır, bunu transpozisyon takip eder. Her yinelemede, sıfır içeren yeni sütunlar eskisiyle araya eklenir; bu sıfırlar daha sonra uygun yeni değerle değiştirilir (her yinelemede artar); ve matris aktarılmıştır.

(Bir bayt boşa harcanır, çünkü Octave'nin Kronecker ürünü karakter girişine izin vermez. Bu, bir sonraki sürümde düzeltilecektir).

bir açıklama

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

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

Kullanımı:

> 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 .


Tanrım .... böyle uzun bir bayrak ne anlama geliyor?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ -lBayrak, $\ sekizli kod 0141(ASCII karakteri a) değerine sahip olmak için değişken atar . Ve l141daha kısadır $\="a";.
Denis Ibaev

Oh, ne kadar ilginç!
Conor O'Brien


1

JavaScript (ES6), 114 bayt

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, özyinelemeli. Güzel!
Conor O'Brien
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.