AdamN 타일 인쇄


11

Adam7 은 PNG와 같은 래스터 이미지에 대한 인터레이스 알고리즘입니다. Adam M. Costello가 발명했기 때문에 "Adam7"알고리즘이라고하며 특정 패턴을 7 번 수행하여 생성됩니다. 코드 골프에 정말 재미있는 Adam7 알고리즘의 멋진 점 중 하나는 패턴이 홀수 인 한 임의의 횟수만큼 반복 될 수 있다는 것입니다. 1996 년 PNG표준이 개발 되었을 때, 9 번의 반복이 너무 복잡하고 5 번의 반복이 효율적이지 않기 때문에 7 번의 반복 만 사용하는 것으로 충분했습니다.

다음은 타일의 첫 번째 반복입니다.

a

꽤 간단합니다. 이것은 "Adam1"타일입니다. 다음 반복 인 "Adam3"타일을 얻는 방법은 다음과 같습니다.

마지막 타일은이므로 1x1높이와 너비를 두 배로 늘리고 다음 타일은 2x2입니다. 먼저 왼쪽 상단에서 'a'로 시작합니다.

a-
--

2 단계,이 패턴을 오른쪽으로 복사하고 글자를 1 씩 늘립니다.

ab
--

3 단계, 2 단계와 동일하지만 오른쪽 대신 복사하십시오.

ab
cc

팔. "Adam3"타일. "Adam5"도 해봅시다. 실제로 알고리즘이 어떻게 작동하는지 볼 수 있습니다. 이 타일은 다시 두 배로 커 4x4집니다. 다시 a왼쪽 상단에서 a 로 시작합니다 .

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

이 패턴을 두 배로 늘리고 글자를 늘리고 오른쪽으로 이동하십시오.

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

삼:

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 죄송합니다. 이제 해결되었습니다.
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

온라인으로 사용해보십시오!

이것은 배열을 확장하기 위해 반복 된 크로네 커 텐서 제품을 사용하고 조옮김을 수행합니다. 각 반복에서 0을 포함하는 새 열은 이전 열과 인터리브됩니다. 그런 다음이 0은 적절한 새 값 (각 반복마다 증가)으로 대체됩니다. 행렬이 바뀝니다.

(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

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

Ideone .


선한 .... 그런 긴 깃발은 무엇을 의미합니까?
코너 O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ -l플래그 $\ 는 8 진 코드 0141(ASCII 문자 a)로 값을 가지도록 변수를 지정 합니다 . 그리고 l141보다 짧습니다 $\="a";.
Denis Ibaev

오, 정말 재미 있어요!
코너 오브라이언


1

자바 스크립트 (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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.