Pentomino Validator

9

Sebagai seseorang yang tidak mau repot-repot melihat pentominos mereka untuk melihat apakah itu membuat bentuk persegi panjang, saya telah memutuskan untuk membuat Anda menulis sebuah program yang melakukannya.

Tugas Anda

Diberikan beberapa input split oleh baris baru yang berisi 12 karakter unik, putuskan apakah itu solusi yang valid.

Solusi yang valid HARUS

  • Memiliki 5 karakter masing-masing (kecuali baris baru)
  • Setiap set karakter harus terhubung sepenuhnya
  • Setiap rangkaian karakter harus memiliki bentuk yang unik
  • Berada dalam bentuk persegi panjang biasa

Jika itu adalah solusi yang valid, output nilai kebenaran, jika tidak output nilai palsu.

Program Anda mungkin sebuah fungsi atau program penuh tetapi harus mengambil input dari stdin dan output ke stdout.

Uji kasus

Solusi yang valid

000111
203331
203431
22 444
2   46
57 666
57769!
58779!
58899!
5889!!

00.@@@ccccF111//=---
0...@@c))FFF1//8===-
00.ttttt)))F1/8888=-

Konfigurasi tidak valid

invalid (doesn't contain 12 unique characters)

111112222233333444445555566666
77777888889999900000qqqqqwwwww (Each set has the same shape)

1234567890qw
w1234567890q
qw1234567890
0qw123456789
90qw12345678 (None of the characters are connected)

1234567890qw (Not 5 characters in every set)

1111122222333334444455555666666
77777888889999900000qqqqqwwwwww (More than 5 characters in some sets)

00
0                   
00.@@@ccccF111//=---
 ...@@c))FFF1//8===-
  .ttttt)))F1/8888=- (Doesn't form a rectangular shape)
Biru
sumber
1. Apakah pantulan pentomino memiliki bentuk yang sama dengan aslinya? 2. Bisakah kita menganggap input terdiri dari karakter dan baris ASCII yang dapat dicetak?
Dennis
@Dennis Ya dan Ya
Biru
@ DigitalTrauma Ini bukan duplikat dari jarak jauh. BTW itu pertanyaan yang luar biasa, sayang sekali aku tidak punya waktu untuk menjawabnya ketika baru saja ditanya.
Level River St
@veveverill kau benar - aku tidak membaca pertanyaan ini dengan benar
Digital Trauma

Jawaban:

3

JavaScript (ES6), 237 235 222 byte

f=p=>(m=[],s=[],d=0,l=p.indexOf`
`+1,[...p].map((c,i)=>(i+1)%l&&!m[i]?g=d-2<s.indexOf((t=a=>m[a]|p[a]!=c?r=0:(m[a]=y.push(a),n=a<n?a:n,t(a+1)+t(a-1)+t(a+l)+t(a-l)+1))(n=i,y=[])!=5?g=0:s[d++]=y.map(a=>r+=a-n)|r):0),d==12&g)

2 byte disimpan berkat @DankMemes !

Pemakaian

f(`000111
203331
203431
22 444
2   46
57 666
57769!
58779!
58899!
5889!!`);
=> true

Penjelasan

Beberapa catatan tentang solusi ini:

  • Mungkin saja jawaban ini tidak valid. Ini tidak benar-benar memeriksa apakah pentomino yang diputar memiliki bentuk yang sama, namun saya mencoba tetapi tidak dapat menemukan persegi panjang pentomino yang memenuhi persyaratan dalam aturan dan termasuk dua atau lebih dari bentuk yang sama diputar. Tapi saya bukan ahli pentomino jadi jika Anda menemukan kombinasi valid yang gagal dengan ini, beri tahu saya.
  • Aturan juga memerlukan jawaban untuk menggunakan STDINdan STDOUTuntuk input dan output tetapi prompt()hanya dirancang untuk input baris tunggal dan komputer (Windows) saya secara otomatis menempatkan \r\nkarakter di setiap baris baru ketika menempel jadi saya membuatnya menjadi fungsi yang menerima string.
f=p=>(
  m=[],                      // m = map of checked characters
  s=[],                      // s = list of shapes found (stored as integer)
  d=0,                       // d = number shapes found
  l=p.indexOf`
`+1,                         // l = length of each line (including newline character)
  [...p].map((c,i)=>         // iterate through each character of the input
    (i+1)%l&&                // skip newline characters
      !m[i]?                 // skip the character if it has already been mapped
        g=                   // g = pentomino is valid
          d-2<s.indexOf(     // check if shape already existed before just now
            (t=a=>           // t() checks if character is part of the shape then maps it
              m[a]|          // skip if character is already mapped
                p[a]!=c      //    or if the current character is part of the shape
              ?r=0:(
                m[a]=        // mark the character as mapped
                  y.push(a), // y = list of shape character indices
                n=a<n?a:n,   // n = minimum index of all characters in the shape
                t(a+1)+      // check and map adjacent characters
                t(a-1)+
                t(a+l)+
                t(a-l)+
                1
              )
          )(n=i,y=[])
            !=5?g=0:         // make sure there are only 5 characters in the shape
            s[d++]=          // add the shape to the list
              y.map(a=>      // sum of (index of each character in the shape - minimum
                r+=a-n)|r    //     index) = unique integer representing the shape
        ):0
  ),
  d==12&g                    // ensure there is 12 shapes and return the 'is valid' result
)
pengguna81655
sumber
1
Anda dapat menyalahgunakan template yang ditandai dengan l=p.indexOf`<newline here>`untuk menyimpan 2 byte
DankMemes
@DankMemes Terima kasih atas tangkapannya! Saya benar-benar lelah ketika saya menulis ini dan saya belum memeriksanya. : P
user81655