グリッドをグリッドに分割する


22

前書き

少数の家と空の畑だけの小さな村があります。地元の官僚は、各ロットに正確に1つの家が含まれるように村をロットに分割し、ロットの境界がすてきな直線グリッドを形成することを望んでいます。あなたの仕事は、これが可能かどうかを判断することです。

タスク

入力は、ビットの長方形の2D配列です。1は家を表し、0は空のフィールドを表します。そのサイズは少なくとも1×1であり、少なくとも1つ1を含みます。任意の妥当な形式(ネストされた整数のリスト、文字列のリスト、複数行の文字列など)で入力を取得できます。

プログラムは、各グリッドセルに正確に1つが含まれるように、水平および垂直の直線を使用して配列をグリッドセルに分割できるかどうかを決定するものとします。ラインは、配列の一方の端から反対側の端まで実行する必要があります。

たとえば、次は配列の有効な分割です。

00|0010|01|1
01|0000|00|0
--+----+--+-
00|0000|00|1
01|0010|01|0
--+----+--+-
01|1000|10|1

一方、次の区分は有効ではありません。1を持たないグリッドセルまたは1を超えるグリッドセルがあるためです。

00|0010|01|1
--+----+--+-
01|0000|00|0
00|0000|00|1
01|0010|01|0
--+----+--+-
00|1000|10|1

有効な部門が存在する場合、真理値を出力し、それ以外の場合は偽値を出力します。

ルールとスコアリング

完全なプログラムまたは関数を作成できます。最も低いバイトカウントが優先されます。

テストケース

[[1]] -> True
[[0,1],[1,0]] -> True
[[1,1],[1,0]] -> False
[[1,0,1],[0,1,0]] -> True
[[1,0],[0,1],[0,1]] -> True
[[1,0,0],[0,0,1],[0,1,1]] -> True
[[1,1,1],[1,1,1],[1,1,1]] -> True
[[1,0,1],[0,1,0],[1,0,0]] -> True
[[1,0,0],[1,0,0],[0,1,1]] -> False
[[0,0,0,0,1],[1,0,0,1,0],[0,0,0,1,0]] -> False
[[0,0,1,0,1],[0,0,0,1,0],[0,0,0,0,0]] -> True
[[1,1,0,0,0],[0,0,0,0,0],[1,0,1,0,0]] -> True
[[1,1,0,1,1],[0,1,0,1,1],[1,0,0,0,0]] -> True
[[0,0,0,0,0,0,0],[0,1,1,1,0,1,0],[0,1,0,0,1,0,0],[0,0,0,0,0,0,1],[0,0,1,0,0,0,1],[1,1,0,1,1,0,0]] -> False
[[1,1,0,0,0,0,0],[1,0,1,1,0,1,0],[0,0,0,0,1,0,0],[0,1,0,1,1,0,0],[1,0,0,0,1,1,0],[0,0,0,0,0,1,0]] -> False
[[0,1,0,1,1,1,0],[0,0,0,0,1,0,0],[0,0,0,0,0,0,0],[1,0,0,1,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,1]] -> True
[[0,1,0,0,1,0,1],[1,0,0,0,1,0,1],[0,0,1,0,1,0,1],[1,0,0,0,1,1,0],[0,0,0,1,1,1,0],[0,1,0,0,1,0,1]] -> True
[[0,1,0,0,1,0,0,1,0],[0,0,0,0,1,1,0,1,0],[1,1,0,0,1,0,0,0,0],[0,0,1,0,1,0,1,0,0],[0,0,1,0,1,0,1,0,0],[0,1,0,0,0,1,0,0,1],[0,1,0,0,0,0,1,0,0]] -> False
[[1,0,1,0,0,1,1,0,1],[0,1,1,0,0,1,1,0,1],[1,0,0,0,0,1,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,1,0,0,0,0,1,1],[0,1,1,0,1,0,1,0,1],[1,0,1,0,0,1,1,0,1]] -> True

[[0,0,1,0,1]、[1,0,0,1,0]、[0,0,0,1,0]]に分割できます:3X1、2X1、3X2、2X1、この方法で2X1の長方形かどうか?001 | 01 --- +-100 | 10 +-000 | 10
officialaimm

4
@officialaimmいいえ、それは無効です。グリッド線は、アレイの片側から反対側までずっと走らなければなりません。
-Zgarb

提案されたテストケース:[[1, 0, 1], [0, 1, 0], [1, 0, 0]]それは、私の新しいアプローチが失敗していた唯一の3x3マトリックスでした。
デニス

@Dennisありがとう、追加しました。
ズガルブ

回答:


7

Pyth、30 29 26 24 23バイト

sm.Asmmq1ssbCkds./MC./M

オンラインでお試しください。

これはもっと短くなると確信しています。これはO(2 mnで、mnはアレイの幅と高さですが、バッテリーを搭載したラップトップ(パフォーマンスが制限されているi5-5200U)で45秒以内に最後の2つのテストケースを完了します。

ソリューションの数を出力します。

説明

5次元配列は本当に楽しいです。</ sarcasm>説明があっても、これがどのように機能するかを理解することはできません。

                    ./M    Find all partitions of each row. Now we have a list of rows,
                           each containing the ways to split the row, each containing
                           the parts of the split (3D).
                   C       Transpose. Now we have a list of ways to split the columns,
                           each containing the rows, each containing the parts of the
                           row (3D).
                ./M        Find all partitions of each row list. Now we have a list of
                           ways to split the columns, each containing the ways to split
                           the rows, each containing the bunch of rows, each containing 
                           the rows in the bunch, each containing the parts of the row
                           (6D).
               s           Combine the ways to split rows & columns into one array (5D).
 m            d            Do the following for each way to split rows & columns (4D):
     m       k                 Do the following for each bunch of rows (3D):
            C                      Transpose the array. We now have a list of column
                                   groups, each containing the row parts (3D).
      m    b                       Do the following for each column group (2D):
          s                            Combine the row parts in the column group. We now
                                       have the list of cells in this row/column group
                                       (1D).
         s                             Sum the cells.
       q1                              Check if the sum is one.
                                   We now have the list of booleans that tell if each
                                   row/column group is valid (1D).
                               We now have the 2D list of booleans that tell if each
                               row/column group in each bunch of rows is valid. (2D)
    s                          Combine the 2D list of booleans to 1D.
  .A                           Check if all values are truthy; if the split is valid.
                           We now have the validity of each split.
s                          Sum the list to get the number of valid solutions.


2

Haskell、116バイト

import Data.List
m(a:b)=[a:e|e<-m b]++[zipWith(+)a d:e|d:e<-m b];m e=[e]
d=(any$any$all$all(==1)).map(m.transpose).m

オンラインでお試しください!


1
これはコンパイルされません。修正されるまで回答を削除してください。また、多くのゴルフの可能性もあります。に名前mergerowsを変更しmます。
ライコニ

私は、Pythのビートの難しさのために競争に打ち勝つことを計画しており、インデントブレースを台無しにした可能性があることを見つけた@Laikoniに感謝します。
ローマンチボラ

2
これにより、が誤ってFalseになり[[1,0],[0,1],[1,0]]ます。問題は、貪欲な崩壊が後のより良い崩壊の邪魔になる可能性があることです。
-xnor

実際、私の [[1,1],[1,0]]崩壊は[[1],[1],[1]]ソリューションを誤って妨害します。これで寝てもいいですか、削除しますか?
ローマンチボラ


1

ゼリー、20バイト

ŒṖS€€ỊȦ$ÐfZ€µ⁺€Ȧ€€FS

これは依然として総当たり的なソリューションですが、TIOの最後の2つのテストケースに対処できない他の回答よりもかなり高速で、すべてのテストケースを最大4秒で処理します。

オンラインでお試しください!

使い方

ŒṖS€€ỊȦ$ÐfZ€µ⁺€Ȧ€€FS  Main link. Argument: M (matrix, array of rows)

ŒṖ                    Compute all partitions, i.e., all groupings of M's rows.
  S€€                 Map sum over all individual groupings, collapsing the grouped
                      rows into a single row.
        Ðf            Filter; keep only those partially collapsed matrices for
                      which the link to the left returns a truthy value.
       $                Group the two links to the left into a monadic chain.
     Ị                    Insignificant; map 0 and 1 to 1, greater integers to 0.
      Ȧ                   All; return 1 iff the matrix contains no zeroes.
          Z€          Zip/transpose all kept matrices,
            µ         Combine all links to the left into a monadic chain.
             ⁺€       Duplicate the chain and map it over the individual results
                      from the first call. We now have all possible combinations
                      of row and column groupings (represented by the corresponding
                      matrices of collapsed rows and columns) that do not have a
                      2 anywhere. However, they still may contain zeroes.
               Ȧ€€    Map the all atom over the matrices, returning 1 only for
                      matrices that consist entirely of ones.
                  FS  Flatten and sum, counting the number of valid divisions.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.