Zeminin En Basit Döşemesi


10

Zemini giriş ve çıkış olarak tanımlayan bir dize alan veya zeminin verilen desenini oluşturabilecek en basit meta döşemenin alanını döndüren bir program veya işlev yazmalısınız.

Zemin kare bir ızgaranın parçasıdır. Her kare biçiminde (ile temsil edilen ya mavisi veya siyah renkli olan ave bgirdi).

Örnek kat:

  aaaa
ababab
aaaaa

Bir meta döşeme

  • Bir inşa edilmiştir Ntarafından Mmasmavi ve siyah kareler dikdörtgen meta karo
  • kullanılan meta-döşemeler çeviriyle aynıdır (bunları döndüremez veya yansıtamazsınız)
  • iki meta döşemenin kenarları bağlıysa, tüm uzunlukları boyunca bağlanmalıdırlar (örn. meta döşemeler alanı ızgara benzeri bir şekilde döşer)

Örnek bir meta-kutucuk:

ba
aa

ve oluşturduğu meta döşeme:

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

Bu meta döşeme, sol harflerin gösterdiği gibi gösterilen üst katı oluşturur:

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

Meta döşemesi alanı daha küçükse, bir meta döşemesi diğerinden daha basittir. Örneğimiz, 2*2 = 4örnek kat için mümkün olan en küçük alana sahip bir alana sahiptir . Dolayısıyla çıktı 4örnek için olmalıdır .

Giriş

  • Karakterlerden oluşan a b spaceve newlineen az bir aveya içeren bir dize b.
  • Harfler ( ab) 4 bağlantılı (yan yana bağlı) bir şekil oluşturur.
  • Satırların önünde gereksiz boşluk olmayacaktır, yani aveya ile başlayan en az bir satır olacaktır b.
  • İki giriş biçimi arasından seçim yapabilirsiniz:

    • (Örneklerde görüldüğü gibi) satırların sonunda gereksiz boşluk yoktur.
    • Tüm satırları en uzun satırla aynı uzunlukta yapmak için satırların sağ tarafındaki boşluklar.
  • Sondaki satır başı isteğe bağlıdır.

Çıktı

  • Tek bir tamsayı, döşemesi giriş katını içeren mümkün olan en küçük meta döşemenin alanı.

Örnekler

Örnekler tire ile sınırlandırılmıştır. Bir örneğin üç kısmı girdi, çıktı ve olası en küçük meta döşemelerden biridir.

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

Bu kod golf yani en kısa giriş kazanır.


@Ypnypn Her köşenin diğer 3 köşeye dokunması gerekir (döşemenin kenarındaki meta döşemeler hariç). "İki meta döşemenin kenarları birbirine bağlıysa, tüm uzunlukları boyunca bağlanmaları gerekir" şeklinde ifade ettim. Yani verdiğiniz örnek yasadışı.
randomra

Yanıtlar:


3

C - 208 bayt

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

Golften önce eşdeğer kod:

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

Algoritma oldukça kaba kuvvettir, bu nedenle koda dayalı olarak nasıl çalıştığı makul olarak açık olmalıdır. İşte yine de birkaç yorum:

  • Girdinin, tüm satırların aynı uzunlukta olması için arka boşluklu forma sahip olması beklenir.
  • İlk döngü, genişliği ilk satırsonu karakterini arayarak bulur.
  • Dış döngü aday meta-karo boyutlarının üzerindedir q. A ile Çıkışlar returnzaman meta-seramik zemin kapsayabilir. Daima başka bir çıkış koşulu gerektirmediğine dikkat edin, çünkü her zaman bir çözüm vardır (en kötü durum girdi boyutudur).
  • İlk iç içe döngü ve sonraki ifbölüm, boyut için geçerli meta-karo genişlik / yükseklik kombinasyonlarını numaralandırır q.
  • Aday meta-karo boyutuyla eşleşen bir karakter dizisi sıfır başlatılır.
  • İç döngü zemindeki tüm karoları tekrarlar.
  • u meta döşemedeki yer döşemesine karşılık gelen dizindir.
  • Hem taban döşemesi hem de meta döşemeli döşemeyi aveya bfarklıysa (toplamı a = 97ve var b = 98ise 195), bir uyumsuzluk olur ve denenen boyutlara sahip meta döşemenin boyutu çalışmaz.
  • Aksi takdirde, yer döşemesi aveya bise, döşeme rengi aday meta döşemeye kopyalanır.
  • Başarılı eşleşme yapıldığında meta döşemenin boyutunu, yani denenen eşleşme başarısız olarak işaretlenmediyse döndürür.

Kullanılan test kodu:

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

Çıktı:

1
1
6
18
8
10
6
4
4
9
6
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.