数独のYウィング戦略


11

私は最近、本当に難しい数独を生成する新しい数独アプリを手に入れました。これは標準的な戦略では解決できません。それで、私はいくつかの新しいものを学ばなければなりませんでした。これらの戦略の1つはY-Wing戦略です。「厳しい戦略」の下にランク付けされていますが、実際はそれほど難しくありません。

この戦略では、4つのセルのみが重要です。したがって、画像内の他のセルはすべて無視しました。

各セルのすべての候補を調べます。次の例では、候補のあるセル3 7(つまり、同じ行に、同じ3x3ボックスに1 2 4 5 6 8 9あるなどの理由で候補をすでに拒否していることを意味します)、候補のあるセル、候補のあるセルと候補のあるセル。Y-Wing戦略は、正解セルの候補からを削除し、候補としてのみ残して、それを埋めることができることを示唆します。したがって、正しい数を見つけ、完全な数独を解決するための一歩近づいています。126 73 62 662

最初の例

なぜ6削除できるのですか?

説明

6が真のセルの正しい数であると仮定しましょう。今そこにある6ので、我々は削除することができ、この列に6のみ残し、右上のセルの候補から7、我々は埋めることができたし。同じことは、左下のセルで発生します。を削除して6に記入でき3ます。ここで、左上のセルを見ると矛盾が生じています。これ7は、同じ行と列に既にaが存在するため、候補のと3を削除し7て、3候補をまったく残さないようにするためです。これは明らかに不可能です。したがって、6は正しいセルの正しい数にはなりません。

より正確には:候補を持つセルが4つあり[A B] [A C] [C D] [B C](この順序または循環回転)、セルが(同じ行、同じ列、または同じ3x3ボックスを介して)円で接続されている(セル1がセル2に接続されている場合) 1セルに接続された4セルに接続されているセル3)に接続され、削除することができるよりも、Cより[C D]細胞。これは3個のセルという、非常に重要である[A B][A C][B C]2人のだけの候補者それぞれが含まれています。異なるセルには[C D]、多かれ少なかれ含まれている可能性があります(Dゼロ、1つ、またはさらに多くの候補が可能です)。

数字の代わりに文字を使用した例

どちらの方法でも接続できると明示的に述べたことに注意してください。次の例では、戦略が再び適用されていることがわかります。しかし、今回は4つのセルが長方形を形成していません。左下と右下のセルは、同じ3x3ボックス内にあるため、単純に接続されています。Y-Wingによると、1左上のセルの候補として削除できます。今回は、このセルにまだ2つの候補が残っているため、実際には新しい正しい番号が見つかりませんでした。しかし、それにもかかわらず、1さまざまな戦略への扉を開くことができます。

2番目の例、長方形ではない

戦略についての詳細が必要な場合、またはさらにいくつかの例が必要な場合は、sudokuwiki.orgにアクセスしてください

チャレンジ仕様

セルの候補を表す4つのリストを入力として受け取ります。4つのセルは円のように接続されます(セル1はセル2に接続され、セル2はセル3に接続され、セル3はセル4に接続され、セル4はセル1に接続されます)。各リストは昇順でソートされていると想定できます。

あなたの仕事は、(Y-Wing戦略を適用して)1人の候補者を削除し、結果の候補者リストを同じ順序で返すことです。戦略を適用できない場合は、同じ候補者リストを返すだけです。

2つの解決策がある場合(セルBのAを削除するか、セルDのCを削除することができます)、1つのソリューションのみを返します。どちらでもかまいません。

入力は、任意のネイティブリストまたは配列形式にすることができます。リストのリストなどを使用することもできます。STDIN、コマンドライン引数、プロンプトまたは関数引数を介して入力を受け取り、戻り値を介して、または単にSTDOUTに出力することで出力を返すことができます。

これはコードゴルフです。最短のコード(バイト単位)が優先されます。

テストケース

[3 7] [6 7] [2 6] [3 6]       => [3 7] [6 7] [2] [3 6]   # Example 1
[6 7] [2 6] [3 6] [3 7]       => [6 7] [2] [3 6] [3 7]   # Example 1, different order
[2 6] [3 6] [3 7] [6 7]       => [2] [3 6] [3 7] [6 7]   # Example 1, different order
[3 6] [3 7] [6 7] [2 6]       => [3 6] [3 7] [6 7] [2]   # Example 1, different order
[1 2 8] [1 8] [8 9] [1 9]     => [2 8] [1 8] [8 9] [1 9] # Example 2
[3 8] [4 8] [3 4 8] [3 4]     => [3 8] [4 8] [3 8] [3 4]
[1 3 6 7 8] [3 8] [3 4] [4 8] => [1 3 6 7] [3 8] [3 4] [4 8]
[7 8] [7 8] [4 7] [4 8]       => [7 8] [8] [4 7] [4 8] or [7] [7 8] [4 7] [4 8]
[4 7] [7 8] [4 8] [4]         => [4 7] [7 8] [4 8] []    # Fictional example
[3 7] [2 6] [6 7] [3 6]       => [3 7] [2 6] [6 7] [3 6] # Y-Wing can't be applied here
[4 7] [2 7 8] [4 8] [1 4]     => [4 7] [2 7 8] [4 8] [1 4] # -||-

単一の入力の複数のセットはまったく同じにできますか?
オプティマイザー

@Optimizerはい、たとえば8番目のテストケースで7 8は、1番目と2番目のセルの候補です。Y-Wing戦略は引き続き適用できます。
ジャクベ

@ジャクベああ、わかりませんでした。
オプティマイザー

複数の解決策が可能な場合、それらのいずれかを出力できますか?
オプティマイザー

はい、質問でそれを明確にしました。
ジャクベ

回答:


3

CJam、90バイト

うーん、他の3つのセルには候補が2つしかないという制約があるため、これは長すぎます。

l~_:_(a+2/::&_{,}$2>:&:Y;{:PY&Y{P1<}?~}%:X,3>1${,}$W=_,2>\Y&,1?*{X:_(+2/{~:I=}#)_2$=I-t}&p

これは、CJam形式のリストのリストとしての入力を想定しています。例:

[[2 6] [3 6] [3 7] [6 7]]

リスト形式のCJamリストで出力します:

[[2] [3 6] [3 7] [6 7]]

ゴルフが終わったら説明を追加します。

ここでオンラインで試す、ここでテストスイート全体を試します


3

Mathematica、124 110バイト

Cases[e@n_:>n]/@(Plus@@e/@#&/@#/.NestList[RotateLeft/@#&,{x:a_+b_,y:b_+c_,z:c_+a_,w:a_+_.}->{x,y,z,w-a+1},3])&

例:

In[1]:= yWing = Cases[e@n_:>n]/@(Plus@@e/@#&/@#/.NestList[RotateLeft/@#&,{x:a_+b_,y:b_+c_,z:c_+a_,w:a_+_.}->{x,y,z,w-a+1},3])& ;

In[2]:= yWing[{{3, 7}, {6, 7}, {2, 6}, {3, 6}}]

Out[2]= {{3, 7}, {6, 7}, {2}, {3, 6}}

In[3]:= yWing[{{4, 7}, {7, 8}, {4, 8}, {4}}]

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