順列の鳩の穴の原理


25

数独のゲームでは、多くのプレイヤーが各スクエアに入れることができる数字を「ペンシルイン」することを好みます。

数独行

上記の行は配列として表すことができます:

[[1,2,9], [6], [5], [7], [1,2,9], [1,2,9], [3], [1,2,4], [8]]

ここで、a 4が行くことができる場所が1つしかないことに注意してください。これにより、上記のリストを次のように単純化できます。

[[1,2,9], [6], [5], [7], [1,2,9], [1,2,9], [3], [4], [8]]

この課題の目的は、順列で可能な数のリストを取得し、どの可能性を排除できるかを推測することです。

別の例として、次の可能性の配列があるとしましょう。

[[0,1,3], [0,2,3], [1,2], [1,2]]

最後の2つの場所に 1と2を入力する必要あります。したがって、配列の最初の2つの要素からこれらの可能性を削除できます。

[[0,3], [0,3], [1,2], [1,2]]

別の例として:

[[0,1,2,3], [0,2], [0,2], [0,2]]

その不可能の両方のための唯一の1箇所がありますように、上記の可能性から順列を構築する13、あなたは空の配列を返すようにしたいでしょう。

可能性のリストを入力し、可能性の最大数が除去された後に残りの可能性を出力する必要があります。

  • 特定の配列が不可能な場合は、空の配列を返すか、サブ配列の1つが空の配列を返す必要があります。
  • 配列は整形式であり、少なくとも1つの要素があると想定できます。
  • サイズの配列が与えられたN場合、部分配列の数値は常に範囲内[0:N)にあると仮定できます。N <= 10
  • から0までのすべての数字N-1が存在するとは限りません
  • 単一のサブアレイ内の番号は一意であると想定できます。
  • サブアレイに単一の可能性のみが含まれる場合、可能性を配列で表すか、単独で表すことができます。 [[1],[2],[0]][1,2,0][[1,2],0,[1,2]]すべて有効です。
  • 適切な文字列形式またはリスト/配列形式のいずれかで配列を受け入れることができます。
  • サブ配列は任意の順序で指定できます。
  • 不規則な配列を処理する代わりに、空の場所にを埋め込むことができます-1

テストケース

[[0]]                                         -> [[0]]
[[1],[0]]                                     -> [[1],[0]]
[[1],[1]]                                     -> []
[[1],[0,1]]                                   -> [[1],[0]]
[[0,1,2],[1,2],[1,2]]                         -> [[0],[1,2],[1,2]]
[[0,1],[1,2],[0,2]]                           -> [[0,1],[1,2],[0,2]]
[[2,1],[1,2],[1,2]]                           -> []
[[0,3],[2,1],[3,0],[3,2]]                     -> [[0,3],[1],[0,3],[2]]
[[0,1],[0,1],[2,3],[2,3,0]]                   -> [[0,1],[0,1],[2,3],[2,3]]
[[0,1],[0,3],[3,2],[0]]                       -> [[1],[3],[2],[0]]
[[3,5,2],[0,2,4],[4,0],[0,1,3,5],[2,1],[2,4]] -> [[3,5],[0,2,4],[4,0],[3,5],[1],[2,4]]
[[6,9,8,4],[4,5],[5,3,6],[3,8,6,1,4],[3,1,9,6],[3,7,0,2,4,5],[9,5,6,8],[6,5,8,1,3,7],[8],[8,0,6,2,5,6,3]] -> [[6,9,4],[4,5],[5,3,6],[3,6,1,4],[3,1,9,6],[0,2],[9,5,6],[7],[8],[0,2]]
[[3,5,0],[5,7],[5,1,2],[1,3,0],[5,3],[5,0],[5,3,7,8,0,6],[7,5,0,1,8],[1,0,8],[0,6]] -> []
[[9,0,2,3,7],[0,7,6,5],[6,9,4,7],[9,1,2,3,0,5],[2,8,5,7,4,6],[6,5,7,1],[5,9,4],[5,9,3,8,1],[5,0,6,4],[0,7,2,1,3,4,8]] -> [[9,0,2,3,7],[0,7,6,5],[6,9,4,7],[9,1,2,3,0,5],[2,8,5,7,4,6],[6,5,7,1],[5,9,4],[5,9,3,8,1],[5,0,6,4],[0,7,2,1,3,4,8]]
[[2,6,0],[0,4,3],[0,6,2],[0,7],[0,9,2,3,6,1,4],[1,7,2],[2,7,8],[8,6,7],[6,5,2,8,0],[5,8,1,4]] -> [[2,6,0],[3],[0,6,2],[0,7],[9],[1],[2,7,8],[8,6,7],[5],[4]]
[[8],[8,0,6,5,7,2,4,1],[8,6,9,3,5,0,7],[3,9,1,0],[9],[9,2,6],[2,8,3],[3,1,6,8,2],[6],[6,4,5,3,0,7]] -> [[8],[5,7,4],[5,7],[0],[9],[2],[3],[1],[6],[4,5,7]]
[[8,1,0],[5,8,7,6,2,0],[6,8,2],[2,4,0,9],[4,1,7,3,6,8],[8,1],[8,0,3],[0,8,2],[0,8,3],[1,8,0]] -> []

これはので、できるだけ短く答えてください!


9より大きい数字は?
リーキー修道女

あなたは、9より大きい数をサポートする必要はありません
ネイサンメリル

サブアレイ内の重複を返しますか?
リーキー修道女

@LeakyNunいいえ。サブ配列には、一意の要素のみを含めることができます。
ネイサンメリル

4番目のテストケースに間違いがあると思います。サブリストの1つは二重括弧で囲まれています。
TheBikingViking

回答:


17

Brachylog、21バイト

:1fz:da|,[]
:2a#d
:Am

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

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

述語0(メイン述語)

:1fz:da|,[]
:1f            Find all solutions of Predicate 1 using Input as Input.
   z           Transpose
    :da        Deduplicate each.
       |,[]    If there is no solution, return [] instead.

述語1(補助述語1)

:2a#d
:2a     Each element of Output satisfies Predicate 2 with each element of Input as Input
   #d   Each element is different

述部2(補助述部2)

:Am     Output is member of Input

8

ゼリー、10バイト

Œp⁼Q$ÐfZQ€

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

Œp⁼Q$ÐfZQ€   Main chain, argument: z

Œp           Cartesian product
  ⁼Q$Ðf      Filter for those that remain unchanged when uniquified
       Z     Transpose
        Q€   Uniquify each subarray

Jellyがlatin1以外の文字を使用する場合、10バイトを要求するのは少し不誠実なようです。UTF-8として表される上記のシーケンスには16バイトが必要です。
クリス・ベッケ

1
@ChrisBecke Jellyには独自の文字セットがあります
ロビン

そしてまだ-私はそれをオンラインで試してみると!-16バイト送信する必要があります。
クリスベッケ

@ChrisBeckeはい。ただし、Jellyをダウンロードする場合は、10バイトのプログラムを作成するだけで済みます。
リーキー修道女

そして、Jelly以外では編集できないテキストファイルに保存しますか?Jellyがプログラムを圧縮した場合、その引数によって、圧縮されたバイトのみをカウントする必要がありますか?
クリスベッケ




2

Python 3、101 99バイト

-2バイトの@TLWに感謝

from itertools import*
lambda x:list(map(set,zip(*[i for i in product(*x)if len(i)==len(set(i))])))

リストのリストの引数を介して入力を受け取り、セットのリストを返す匿名関数。

使い方

from itertools import*        Import Python's library for iterator generation
lambda x                      Anonymous function with input possibilities x as a
                              list of lists
...for i in product(*x)...    For i in the Cartesian product of x, ie all candidate
                              arrangements:
[...if len(i)==len(set(i))]    Filter into list by non-duplicity (set removes
                               duplicates, so there are no duplicates if the length
                               of i is the same as the length of the set of
                               the elements of i)
zip(*...)                     Unpack and take the transpose, leaving the modified
                              possibilities with duplicates
map(set,...)                  Remove duplicates
:list(...)                    Return the modified possibilities as a list of sets

Ideoneでお試しください


list(map(set,短いですが、私は考える
TLW


0

PHP、245 231バイト

デカルト積関数には131 117、その他のものには114

function c($a){if ($a){if($u=array_pop($a))foreach(c($a)as$p)foreach($u as$v)yield $p+[count($p)=>$v];}else yield[];}
function p($a){foreach(c($a)as$i)if(max(array_count_values($i))<2)foreach($i as$k=>$v)$r[$k][$v]=$v;return$r?:[];}

デカルト積の再帰関数を使用して、いくつかのテストケースでメモリの問題に遭遇しました。とのより良い仕事を、この発電機クラスfunction c($a){$b=[];foreach($a as$i)$b[]=new \ArrayIterator($i);return new CartesianProductIterator($b);}
しかし、私のジェネレーターはより短く、同じ仕事をします。

しかし、大きな例では、マシン上でしばらくすると内部サーバーエラー(イテレーターとジェネレーターの両方で)が発生します。残念ながら、サーバーログを確認する時間はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.