바닥의 ​​가장 간단한 타일링


10

바닥을 입력으로 출력하고 출력하거나 주어진 바닥 패턴을 만들 수있는 가장 간단한 메타 타일링 영역을 반환하는 프로그램 또는 함수를 작성해야합니다.

바닥은 사각형 격자의 일부입니다. 모든 정사각형 타일 (로 표현 중 하나 푸른 또는 검은 색 착색 ab입력에서).

예시 층 :

  aaaa
ababab
aaaaa

메타 타일링

  • 에서 구축 N으로 M푸른 검은 사각형의 사각형 메타 타일
  • 사용 된 메타 타일은 번역과 동일합니다 (회전하거나 미러링 할 수 없음)
  • 두 개의 메타 타일의 측면이 연결되어 있으면 전체 길이를 따라 연결해야합니다 (즉, 메타 타일은 그리드와 같은 방식으로 공간을 타일링합니다)

메타 타일의 예 :

ba
aa

그리고 그것에 의해 만들어진 메타 타일링 :

       .
       .
       .
    babababa
    aaaaaaaa
... babababa ...
    aaaaaaaa    
    babababa
    aaaaaaaa
       .
       .
       .

이 메타 타일링은 왼쪽 글자가 보여 주듯이 상단 바닥을 만듭니다.

       .
       .
       .
    ********
    ***aaaa*
... *ababab* ...
    *aaaaa**    
    ********
    ********
       .
       .
       .

메타 타일의 면적이 더 작 으면 메타 타일링이 다른 타일보다 간단합니다. 우리 예제는 2*2 = 4예제 플로어에서 가능한 가장 작은 영역을 가지고 있습니다. 따라서 출력은 4예제입니다.

입력

  • 문자열 문자로 구성 a b space하고 newline적어도 하나의 포함 a또는 b.
  • 문자 ( ab)는 하나의 4 연결 (병렬 연결) 모양을 형성합니다.
  • 행 앞에 불필요한 공간이 없습니다. 즉 a또는로 시작하는 행이 하나 이상 b있습니다.
  • 두 가지 입력 형식을 선택할 수 있습니다.

    • 행 끝에 불필요한 공백이 없습니다 (예제 참조).
    • 행의 오른쪽에 공백을 두어 모든 행을 가장 긴 행과 동일한 길이로 만듭니다.
  • 후행 줄 바꿈은 선택 사항입니다.

산출

  • 타일링에 입력 플로어가 포함 된 가장 작은 메타 타일의 영역 인 단일 정수입니다.

예는 대시로 구분됩니다. 예제의 세 부분은 입력, 출력 및 가능한 가장 작은 메타 타일 중 하나입니다.

a

1

a
-----------------
 aaaa
aaa
a

1

a
-----------------
aabaab
abaa
aaba

6

aab
aba
-----------------
aabaab
a  a a
aabab

18

aabaab
aaaaaa
aababa
-----------------
ba
aaab

8

baaa
aaab
-----------------
 aaaa
ababb
aaaa

10

aaaaa
ababb
-----------------
 a aa
ab ba
 aba

6

aa
ab
ba
-----------------
 aaaa
abab
aaaa

4

aa
ab
-----------------
ba
 ba
  b

4

ba
ab
-----------------
baa
aba
aab

9

baa
aba
aab
-----------------
 aaaa
aabaa
aaaa

6

aaa
aab

이것은 코드 골프이므로 가장 짧은 참가작이 승리합니다.


@Ypnypn 모든 코너는 3 개의 다른 코너를 터치해야합니다 (타일링 가장자리의 메타 타일 제외). 나는 "두 개의 메타 타일의 측면이 연결되어 있으면 전체 길이를 따라 연결해야합니다"라고 말했습니다. 따라서 귀하의 예는 불법입니다.
randomra

답변:


3

C-208 바이트

w,q,n,m,r,g,u;t(char*f){for(w=0;f[w++]-10;);for(q=1;;q++)for(n=1;m=q/n,n<=q;++n)if(n*m==q){char t[q];bzero(t,q);r=q;for(g=0;f[g];++g){u=g/w%m*n+g%w%n;r=t[u]+f[g]-195?r:0;if(f[g]&64)t[u]=f[g];}if(r)return r;}}

골프 전의 해당 코드 :

#include <stdio.h>
#include <strings.h>

int t(char* f) {
    int w = 0;
    for ( ; f[w++] - 10; );

    for (int q = 1; ; q++) {
        char t[q];
        for (int n = 1; n <= q; ++n) {
            int m = q / n;
            if (n * m == q) {
                bzero(t, q);
                int r = q;
                for (int g = 0; f[g]; ++g) {
                    int u = g / w % m * n + g % w % n;
                    if (t[u] + f[g] == 195) {
                        r = 0;
                    }
                    if (f[g] & 64) {
                        t[u] = f[g];
                    }
                }
                if (r) {
                    return r;
                }
            }
        }
    }
}

알고리즘은 상당히 무차별 적이므로 코드를 기반으로 작동하는 방식이 합리적으로 분명해야합니다. 어쨌든 몇 가지 의견이 있습니다.

  • 입력은 모든 행의 길이가 동일하도록 후행 공백이있는 형식이어야합니다.
  • 첫 번째 루프는 첫 번째 줄 바꿈 문자를 찾아 너비를 찾습니다.
  • 외부 루프는 후보 메타 타일 크기를 초과합니다 q. return메타 타일이 바닥을 덮을 수있을 때로 종료 합니다. 항상 솔루션이 있기 때문에 루프에는 다른 종료 조건이 필요하지 않습니다 (가장 최악의 경우 입력 크기 임).
  • 첫 번째 중첩 루프 및 다음 if은 size에 대한 유효한 메타 타일 너비 / 높이 조합을 열거합니다 q.
  • 후보 메타 타일 크기와 일치하는 문자 배열은 0으로 초기화됩니다.
  • 내부 루프는 바닥의 모든 타일을 반복합니다.
  • u 바닥 타일에 해당하는 메타 타일의 인덱스입니다.
  • 바닥 타일 메타 마루 타일 모두있는 경우 a또는 b다른 (합계 a = 97하고 b = 98있다 195), 시도하지 않을 것이다 치수 작업과의 불일치, 및 메타 - 타일 크기가있다.
  • 그렇지 않으면 바닥 타일이 a또는 b인 경우 타일 색상이 후보 메타 타일에 복사됩니다.
  • 성공적으로 일치했을 때, 즉 시도한 일치가 실패한 것으로 표시되지 않은 경우 메타 타일의 크기를 반환합니다.

사용 된 테스트 코드 :

#include <stdio.h>

extern int t(char* s);

int main()
{
    printf("%d\n", t(
        "a\n"
    ));
    printf("%d\n", t(
        " aaaa\n"
        "aaa  \n"
        "a    \n"
    ));
    printf("%d\n", t(
        "aabaab\n"
        "abaa  \n"
        "aaba  \n"
    ));
    printf("%d\n", t(
        "aabaab\n"
        "a  a a\n"
        "aabab \n"
    ));
    printf("%d\n", t(
        "ba  \n"
        "aaab\n"
    ));
    printf("%d\n", t(
        " aaaa\n"
        "ababb\n"
        "aaaa \n"
    ));
    printf("%d\n", t(
        " a aa\n"
        "ab ba\n"
        " aba \n"
    ));
    printf("%d\n", t(
        " aaaa\n"
        "abab \n"
        "aaaa \n"
    ));
    printf("%d\n", t(
        "ba \n"
        " ba\n"
        "  b\n"
    ));
    printf("%d\n", t(
        "baa\n"
        "aba\n"
        "aab\n"
    ));
    printf("%d\n", t(
        " aaaa\n"
        "aabaa\n"
        "aaaa \n"
    ));
    return 0;
}

산출:

1
1
6
18
8
10
6
4
4
9
6
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.