Ốp lát đơn giản nhất của sàn


10

Bạn nên viết một chương trình hoặc hàm nhận chuỗi mô tả sàn là đầu vào và đầu ra hoặc trả về diện tích của lát gạch meta đơn giản nhất có thể tạo ra mô hình sàn đã cho.

Sàn là một phần của lưới vuông. Mỗi ô vuông được tô màu xanh hoặc đen (đại diện bởi abtrong đầu vào).

Một ví dụ sàn:

  aaaa
ababab
aaaaa

Ốp lát

  • được xây dựng từ một siêu hình chữ nhật Ncủa Mhình vuông màu xanh và hình vuông màu đen
  • các siêu gạch được sử dụng giống hệt với bản dịch (bạn không thể xoay hoặc phản chiếu chúng)
  • nếu các cạnh của hai gạch meta được kết nối, chúng sẽ kết nối dọc theo toàn bộ chiều dài của chúng (tức là gạch lát gạch meta không gian theo kiểu lưới)

Một ví dụ meta-gạch:

ba
aa

và ốp lát được tạo bởi nó:

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

Ốp lát meta này tạo ra tầng hiển thị phía trên như các chữ cái bên trái hiển thị:

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

Một lát gạch meta đơn giản hơn so với cái khác nếu diện tích của siêu gạch của nó nhỏ hơn. Ví dụ của chúng tôi có diện tích 2*2 = 4nhỏ nhất có thể cho tầng ví dụ. Vì vậy, đầu ra nên là 4ví dụ.

Đầu vào

  • Một chuỗi bao gồm các ký tự a b spacenewlinechứa ít nhất một ahoặc b.
  • Các chữ cái ( ab) tạo thành một hình dạng 4 kết nối (kết nối song song).
  • Sẽ không có khoảng trắng không cần thiết ở phía trước các hàng tức là sẽ có ít nhất một hàng bắt đầu bằng ahoặc b.
  • Bạn có thể chọn hai định dạng đầu vào:

    • Không có khoảng trắng không cần thiết ở cuối hàng (như đã thấy trong các ví dụ).
    • Khoảng cách ở bên phải của các hàng để làm cho tất cả các hàng có cùng độ dài với hàng dài nhất.
  • Trailing newline là tùy chọn.

Đầu ra

  • Một số nguyên duy nhất, diện tích của gạch meta nhỏ nhất có thể có lát gạch chứa tầng đầu vào.

Ví dụ

Ví dụ được phân định bằng dấu gạch ngang. Ba phần của một ví dụ là đầu vào, đầu ra và một trong những gạch meta nhỏ nhất có thể.

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

Đây là mã golf nên mục ngắn nhất sẽ thắng.


@Ypnypn Mỗi góc phải chạm vào 3 góc khác (ngoại trừ gạch meta trên cạnh của ốp lát). Tôi đã nói nó là "nếu các cạnh của hai gạch meta được kết nối thì chúng sẽ kết nối dọc theo toàn bộ chiều dài của chúng". Vì vậy, ví dụ đưa ra của bạn là bất hợp pháp.
ngẫu nhiên

Câu trả lời:


3

C - 208 byte

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;}}

Mã tương đương trước khi chơi golf:

#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;
                }
            }
        }
    }
}

Thuật toán này khá mạnh, vì vậy nó phải rõ ràng một cách hợp lý cách nó hoạt động dựa trên mã. Dưới đây là một vài bình luận:

  • Đầu vào dự kiến ​​sẽ có dạng với các khoảng trắng ở cuối để tất cả các dòng có cùng độ dài.
  • Vòng lặp đầu tiên tìm thấy chiều rộng bằng cách tìm kiếm ký tự dòng đầu tiên.
  • Vòng lặp bên ngoài là trên kích thước gạch meta ứng cử viên q. Thoát ra returnkhi một gạch meta có thể bao phủ sàn nhà. Lưu ý rằng vòng lặp không cần điều kiện thoát khác vì luôn có giải pháp (trường hợp xấu nhất là kích thước của đầu vào).
  • Vòng lặp lồng nhau đầu tiên và sau đây ifliệt kê các kết hợp chiều rộng / chiều cao gạch hợp lệ cho kích thước q.
  • Một mảng ký tự phù hợp với kích thước gạch meta ứng cử viên được khởi tạo bằng không.
  • Vòng lặp bên trong lặp đi lặp lại trên tất cả các gạch trong sàn.
  • u là chỉ số trong gạch meta tương ứng với gạch lát sàn.
  • Nếu cả gạch lát sàn và gạch lát nền meta đều ahoặc bkhác nhau (tổng a = 97b = 98195), có sự không phù hợp và kích thước gạch meta với kích thước đã thử sẽ không hoạt động.
  • Mặt khác, nếu lát sàn là ahoặc b, màu gạch được sao chép vào gạch meta ứng cử viên.
  • Trả về kích thước của gạch meta khi kết hợp thành công, nghĩa là nếu trận đấu đã thử không được đánh dấu là thất bại.

Mã kiểm tra được sử dụng:

#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;
}

Đầu ra:

1
1
6
18
8
10
6
4
4
9
6
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.