ペントミノバリデーター


9

ペントミノを見て長方形になっているかどうかわからない人のために、それを行うプログラムを作成することにしました。

あなたのタスク

12個の一意の文字を含む改行で分割された入力がある場合、それが有効なソリューションであるかどうかを判断します。

有効な解決策は

  • 各文字が5つある(改行を除く)
  • キャラクターの各セットは完全に接続されている必要があります
  • キャラクターの各セットには固有の形状が必要です
  • 通常の長方形である

有効なソリューションである場合は、真の値を出力し、そうでない場合は、偽の値を出力します。

プログラムは関数でも完全なプログラムでもかまいませんが、stdinから入力を受け取り、stdoutに出力する必要があります。

テストケース

有効なソリューション

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

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

無効な構成

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.ペントミノの反射は元の形と同じですか?2.入力が印刷可能なASCII文字と改行で構成されると想定できますか?
デニス

@Dennisはい、はい
ブルー

@DigitalTraumaそれはリモートでそれの複製ではありません。ところで、それは素晴らしい質問でした。新しく質問されたときに答える時間がなかったのは残念です。
Level River St

@steveverillあなたは正しい-私はこの質問を正しく読みませんでした
Digital Trauma

回答:


3

JavaScript(ES6)、237 235 222バイト

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のおかげで2バイト節約されました!

使用法

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

説明

このソリューションに関するいくつかのメモ:

  • この回答が無効である可能性があります。回転したペントミノが同じ形状であるかどうかは実際にはチェックしませんが、ルールの要件を満たし、回転した同じ形状を2つ以上含む有効なペントミノ長方形を見つけましたが見つかりませんでした。しかし、私はペントミノの専門家ではないので、これが失敗する有効な組み合わせを見つけたら、私に知らせてください。
  • ルールには、使用STDINSTDOUT入力と出力の回答も必要ですがprompt()、1行入力用にのみ設計されており、私の(Windows)コンピューターは\r\n貼り付けるときに自動的に新しい行ごとに文字を配置するため、文字列を受け入れる関数にしました。
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バイトを節約するためにタグ付きテンプレートを乱用することができます
DankMemes

@DankMemesキャッチありがとうございます!これを書いたときは本当に疲れていて、まだ確認していません。:P
user81655
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.