พิมพ์ตัวต่อ AdamN


11

Adam7เป็นอัลกอริทึมการเชื่อมโยงสำหรับภาพแรสเตอร์เช่น PNG มันถูกเรียกว่าอัลกอริทึม "Adam7" เพราะมันถูกคิดค้นโดย Adam M. Costello และมันถูกสร้างขึ้นโดยทำตามรูปแบบที่แน่นอน 7 ครั้ง หนึ่งในสิ่งที่ยอดเยี่ยมเกี่ยวกับอัลกอริทึม Adam7 ที่ทำให้มันสนุกสำหรับกอล์ฟรหัสคือรูปแบบนั้นสามารถทำซ้ำได้หลายครั้งโดยพลการตราบใดที่มันแปลก ย้อนกลับไปเมื่อปี 1996 เมื่อPNGมาตรฐานได้รับการพัฒนาการใช้การทำซ้ำเพียง 7 ครั้งก็ถือว่าเพียงพอเนื่องจากการทำซ้ำ 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" นี่คือตัวแทน ASCII ของไทล์ Adam7:

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

ตามปกตินี่คือ code-golf ดังนั้นจึงใช้ช่องโหว่มาตรฐานและคำตอบที่สั้นที่สุดในการชนะไบต์!


ที่ไหนcใน testcase สำหรับ9?
Leun Nun

@KennyLau ขออภัยตอนนี้ได้รับการแก้ไขแล้ว
James

คำตอบ:


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 tensor ซ้ำเพื่อขยายอาร์เรย์ตามด้วยการขนย้าย ในแต่ละการวนซ้ำคอลัมน์ใหม่ที่มีค่าศูนย์จะถูกรวมเข้ากับคอลัมน์เก่า ศูนย์เหล่านั้นจะถูกแทนที่ด้วยค่าใหม่ที่เหมาะสม (ซึ่งเพิ่มขึ้นในแต่ละรอบซ้ำ); และเมทริกซ์ถูกย้าย

(หนึ่งไบต์สูญเปล่าเพราะผลิตภัณฑ์ 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$=<++$%;$\=$_}{'

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

ไอดีโอ


ดีมาก .... ธงที่มีความยาวเช่นนี้แปลว่าอะไร?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴการ-lตั้งค่าสถานะกำหนด$\ ตัวแปรให้มีค่าด้วยรหัสฐานแปด0141(อักขระ ASCII a) และสั้นกว่าl141 $\="a";
เดนิส Ibaev

โอ้ช่างน่าสนใจจริงๆ!
Conor O'Brien


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.