15パズルは、配列の半分だけの可能な状態が解けるあることに特有のものです。14タイルと15タイルを反転させると、ブロックをスライドさせて元に戻すことができません。
あなたの仕事は、タイルの配置の状態を表す、選択した形式の整数のリスト(0から15までの各数値のインスタンスを1つだけ含む)を受け入れるプログラムを構築することです。 4x4グリッド。グリッドが解決可能かどうかを決定する単一のブール値を出力します。
これをあらゆる言語で行うための最短のコードが優先されます。
15パズルは、配列の半分だけの可能な状態が解けるあることに特有のものです。14タイルと15タイルを反転させると、ブロックをスライドさせて元に戻すことができません。
あなたの仕事は、タイルの配置の状態を表す、選択した形式の整数のリスト(0から15までの各数値のインスタンスを1つだけ含む)を受け入れるプログラムを構築することです。 4x4グリッド。グリッドが解決可能かどうかを決定する単一のブール値を出力します。
これをあらゆる言語で行うための最短のコードが優先されます。
回答:
Œc>/€;TSḂ
0
解決可能な1
場合とそうでない場合(¬
コードの右側にこれを追加するために)を生成する、左から右と右から左に交互になる行優先順で読み取る整数のリストを受け入れるモナディックリンク。
オンラインでお試しください!(この例は、12が所定の位置にスライドする必要があるボードです)
John Dvorakの回答と同様に、パリティを計算し、ヘビのような入力順序を使用してチェッカーボードのパリティを簡略化しますが、パリティの等価性をチェックする代わりに、順序外の数をゼロ以外のインデックスと合計し、それがそうであるかどうかをテストします奇数:
Œc>/€;TSḂ - Link: list of integers
Œc - unordered pairs
€ - for each:
/ - reduce with:
> - greater than?
T - truthy indices (i.e. [1..16] without 1-indexed index of 0)
; - concatenate
S - sum
Ḃ - is odd?
((C.!.2=_1^i.&0)&.".&.stdin''
入力順序は行優先で、行はテーブル全体で1つのパスで左から右、右から左に交互に読み取られます。ゼロは左上隅に属すると仮定します。
Windowsでの使用:
<nul set /p="0 1 2 3 7 6 5 4 8 9 10 11 15 14 13 12" | jconsole c:\...\15.jhs
説明:
<nul set /p=
入力中に改行、予防するために使用されてecho
いることを生成".
好きではないが。もちろん、Unixはをサポートしていますecho /n
。v&.".&.stdin''
「入力の下で構文解析」を意味する「入力、次に入力を解析してから、vを実行してから、解析を元に戻し(=形式)、次に入力を元に戻す(=出力)」と読み取ります。1!:1]3
1文字短いですが、定義された逆はありません。C.!.2
「置換パリティ」を意味します。1
(偶数パリティ)または_1
(奇数パリティ)を返します。あれは、_1^inversions
_1^i.&0
「-1から0の指数乗」を意味します。C.!.2=_1^i.&0
「置換パリティはホール位置パリティと同じですか?」を意味します。これは4x4ボードで機能しますが、目的の終了位置が行優先の左から右である場合、解決された位置の順列は奇数の反転を持ち、奇数のパリティを持ちます。また、目的の穴の位置が左上から右下に移動すると、パリティが反転します(任意の入力順)。どちらの場合も、修正は1文字です。-
後=
に追加して、予期されるパリティを逆にします。
正当性の証明:
各移動の後、ゼロは位置をある数と交換し、置換パリティを反転させます。ゼロはまた、白と黒のチェッカーボードの位置を交互に示し、入力順序の奇数と偶数の位置で示されます。したがって、この状態は必須です。それはまた、カウンティングの議論によって十分です:ポジションのちょうど半分が解けることは常識です。この条件では、可能な位置のちょうど半分が除外されます。