Pentomino Doğrulayıcı


9

Pentominoslarına dikdörtgen bir şekil yapıp yapmadığını görmek için rahatsız edilemeyen biri olarak, bunu yapan bir program yazmaya karar verdim.

Senin görevin

12 benzersiz karakter içeren yeni satırlara göre bazı girdi bölgeleri göz önüne alındığında, geçerli bir çözüm olup olmadığına karar verin.

Geçerli bir çözüm ZORUNLU

  • Her karakterden 5 tane olsun (yeni satırlar hariç)
  • Her karakter kümesi tamamen bağlı olmalıdır
  • Her karakter kümesinin benzersiz bir şekli olmalıdır
  • Düzenli dikdörtgen şeklinde olun

Geçerli bir çözümse, doğruluk değeri verin, aksi takdirde yanlış bir değer verin.

Programınız bir işlev veya tam bir program olabilir ancak girdiyi stdin'den çıktıya stdout'a götürmelidir.

Test senaryoları

Geçerli çözümler

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

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

Geçersiz yapılandırmalar

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)

1. Pentomino yansıması orijinaliyle aynı şekle sahip mi? 2. Girdinin yazdırılabilir ASCII karakterleri ve yeni satırlardan oluşacağını varsayabilir miyiz?
Dennis

@Dennis Evet ve Evet
Mavi

@DigitalTrauma Uzaktan bir kopyası değil. Harika bir soru olan BTW, yeni sorulduğunda cevaplamak için zamanım olmadı.
Level River St

@steveverill haklısın - Bu soruyu düzgün okumadım
Digital Trauma

Yanıtlar:


3

JavaScript (ES6), 237 235 222 bayt

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)

@DankMemes sayesinde 2 bayt kaydedildi !

kullanım

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

açıklama

Bu çözüm hakkında birkaç not:

  • Bu cevabın geçerli olmaması mümkündür. Döndürülmüş pentominoların aynı şekil olup olmadığını gerçekten kontrol etmez, ancak denedim, ancak kurallardaki gereksinimleri karşılayan ve döndürülen aynı şeklin iki veya daha fazlasını içeren geçerli bir pentomino dikdörtgen bulamadım. Ama pentomino uzmanı değilim, bu yüzden başarısız olan geçerli bir kombinasyon bulursanız bana bildirin.
  • Kuralları da kullanım cevaplarını gerektiren STDINve STDOUTgiriş ve çıkış için ama prompt()sadece tek satır giriş ve otomatik benim (Windows) bilgisayarın koyar için tasarlanmıştır \r\nben bir dize kabul eden bir işlev yapılan böylece yapıştırırken her yeni çizgisinde karakter.
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
)

1
l=p.indexOf`<newline here>`2 bayt kaydetmek için etiketli şablonları kötüye kullanabilirsiniz
DankMemes

@DankMemes Yakaladığınız için teşekkürler! Bunu yazarken gerçekten yorgundum ve henüz iki kez kontrol etmedim. : P
user81655
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.