探求者


19

私は最近、本当に奇妙な不規則なチェス盤を手に入れました。正方形はあちこちにあり、すべてがつながっているわけでもありません。少なくとも通常のグリッドに配置されています。チェスのルールを調整してボード上でプレイできるようにしたいのですが、まずは実際にボード上のどこにでも行けるピースが必要です。それはリーパーが最善の策だと思われます。

リーパーは、騎士の妖精のチェスの一般化です。Leapersは、二つの整数でパラメータ化されたm個及びN及び移動することができるM個の、別の一方向に正方形をし、n個のいずれかの垂直方向に正方形。標準的なナイトでは、(m、n)=(2、1)があります。移動全体は単一のジャンプと見なされるため、ターゲットに向かう途中のマスは空である必要はなく、存在する必要さえありません。

チャレンジ

ボードの一部である正方形を表す正の2D整数座標のリストの形式で「チェス盤」が与えられます。あなたの仕事は、十分な動きがあれば、ボード上の任意のマスに到達できるリーパーを見つけることです。

いくつかの例を見てみましょう。標準のチェス盤は、8x8の正方形の規則的なグリッドを使用します(このチャレンジでは、白い正方形と黒い正方形を区別しません)。

########
########
########
########
########
########
########
########

標準のナイトはそれらすべてに到達できるため(2, 1)、有効な出力になります。ただし、(1, 1)たとえば、このようなピースはどこから開始しても正方形の半分にしか到達できないため、有効ではありません。(1, 0)一方、すべての正方形は直交して接続されているため、有効な出力にもなります。

次のような不規則なボードがある場合:

#   #
 # # #
  # # #
 # #
    #

そして、可能な解決策がある(1, 1)(3, 1)。次のような完全に切断された領域を持つボードを使用することもできます。

#### ####
#### ####
#### ####
#### ####

標準の騎士(2, 1)は、ここですべての正方形に到達できますが、実際には唯一の解決策です。

最後に、次の単純なボードには、跳躍者が完全に到達することはできません。

#
 ##

入力形式はASCII表現ではなく、代わりに座標のリストになることに注意してください。たとえば、上記の2番目の例は次のように指定できます。

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

ルール

プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。

入力座標は、任意の便利なリスト形式(フラットリスト、ペアのリスト、複雑な整数のリスト、一貫した区切り文字を含む文字列など)で取得できます。

出力は、解が存在する場合にリーパーを識別する2つの整数mおよびnである必要があります(2つの別個の整数、リスト、非数値区切り文字付きの文字列など)。解決策が存在しない場合は、有効なリーパーになる可能性のない一貫した値を出力できます。これには、(0, 0)通常の形式の整数のペアと、負でない整数のペアではないものが含まれます。

プログラムは、1分以内にテストケースを処理する必要があります。これはやや曖昧な制限ですが、常識を使用します:マシンで2分かかる場合、他の人で1分以内に実行されると想定できると思いますが、20分かかるとは考えにくいでしょう。各テストケースを数秒で解決するのは難しいことではないので、このルールは単純なブルートフォースを除外するためにのみ機能します。

標準の規則が適用されます。

テストケース

各テストケースの形式はboard => all valid leapersです。これらのいずれかを出力するだけでよいことに注意してください。リーパーのリストが空の場合は、有効なリーパーではないものを必ず返してください。

Examples above:
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [4, 8], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [6, 8], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7], [7, 8], [8, 1], [8, 2], [8, 3], [8, 4], [8, 5], [8, 6], [8, 7], [8, 8]] => [[0, 1], [1, 2], [1, 4], [2, 3], [3, 4]]
[[1, 1], [5, 1], [2, 2], [4, 2], [6, 2], [3, 3], [5, 3], [7, 3], [2, 4], [4, 4], [5, 5]] => [[1, 1], [1, 3]]
[[1, 1], [2, 2], [3, 2]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => [[1, 2]]

Square boards:
[[1, 1], [1, 2], [2, 1], [2, 2]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [2, 3]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7]] => [[0, 1], [1, 2], [2, 3]]

Miscellaneous:
[[1, 1], [2, 1]] => [[0, 1]]
[[1, 1], [1, 2]] => [[0, 1]]
[[1, 1], [12, 35]] => [[11, 34]]
[[1, 1], [1, 2], [2, 1], [2, 2], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 5], [3, 6], [4, 1], [4, 2], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [1, 4]]
[[2, 2], [2, 4], [2, 6], [2, 8], [4, 2], [4, 4], [4, 6], [4, 8], [6, 2], [6, 4], [6, 6], [6, 8], [8, 2], [8, 4], [8, 6], [8, 8]] => [[0, 2], [2, 4]]

Random boards:
[[1, 5], [1, 9], [2, 6], [2, 8], [2, 10], [2, 12], [3, 5], [3, 7], [3, 9], [3, 11], [3, 13], [4, 2], [4, 4], [4, 6], [4, 8], [4, 14], [5, 1], [5, 3], [5, 5], [5, 7], [6, 2], [6, 4], [7, 1], [8, 2]] => [[1, 1], [1, 3]]
[[1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 6], [3, 7], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 3], [5, 4], [5, 6]] => [[0, 1], [1, 2]]
[[1, 8], [2, 6], [2, 10], [3, 3], [3, 4], [3, 8], [4, 1], [4, 11], [5, 3], [5, 9], [6, 12], [8, 11], [10, 10], [11, 12], [12, 6], [12, 8], [13, 6], [13, 8], [13, 10], [13, 11], [14, 5], [14, 7], [14, 8], [14, 13], [14, 14], [15, 7], [15, 9], [15, 11], [15, 12], [16, 6], [16, 7], [16, 9], [16, 13], [16, 14], [17, 10], [17, 12], [18, 8], [18, 12], [20, 9], [21, 11], [22, 13], [23, 10], [23, 11], [23, 15], [24, 12]] => [[1, 2]]
[[1, 17], [1, 21], [3, 11], [3, 15], [3, 19], [3, 23], [5, 13], [5, 21], [7, 11], [7, 15], [7, 19], [9, 1], [9, 13], [9, 17], [11, 3], [11, 7], [11, 15], [11, 19], [13, 5], [13, 9], [13, 13], [13, 17], [13, 21], [15, 11], [15, 15], [15, 19], [17, 13], [17, 17]] => [[2, 2], [2, 6], [2, 10]]
[[1, 3], [2, 4], [2, 5], [3, 6], [4, 1], [5, 3], [5, 6], [5, 7], [6, 12], [6, 14], [6, 21], [7, 9], [7, 19], [8, 9], [8, 15], [8, 17], [8, 18], [8, 24], [9, 12], [9, 19], [10, 12], [10, 14], [10, 17], [10, 21], [11, 22], [12, 15], [12, 17], [12, 24], [13, 16], [14, 20], [14, 21], [14, 26], [15, 13], [15, 19], [16, 18], [16, 23], [17, 16], [17, 24]] => [[2, 3]]
[[1, 11], [3, 13], [4, 10], [6, 14], [8, 12], [9, 9], [9, 15], [12, 8], [13, 5], [13, 19], [13, 21], [14, 8], [15, 1], [15, 17], [16, 4], [16, 14], [16, 18], [16, 20], [17, 21], [18, 2], [18, 16], [18, 18], [19, 9], [19, 13], [19, 15], [20, 12], [21, 1], [21, 17], [22, 4], [22, 10], [23, 7]] => [[1, 3]]
[[1, 39], [6, 37], [8, 32], [10, 27], [11, 31], [11, 35], [12, 22], [16, 21], [16, 29], [16, 33], [18, 34], [21, 3], [21, 9], [21, 19], [23, 8], [23, 14], [23, 22], [23, 24], [23, 36], [24, 6], [25, 13], [25, 17], [26, 1], [26, 11], [28, 6], [28, 20], [28, 26], [28, 30], [28, 34], [30, 11], [30, 15], [30, 21], [32, 6], [33, 28], [33, 32], [35, 13], [35, 23]] => [[2, 5]]

特別な場合として、1つのセルのみで構成されるボードでは、すべてのリーパーが機能しますが、出力は実際のリーパーに対応する必要があるため、[0, 0]有効な出力ではないことに注意してください。


簡単な質問。騎士はどう(2,1)ですか?私が間違っている場合は修正しますが、騎士は1つの方向に3つの正方形を移動し、前の方向に垂直な任意の方向に1つの正方形を移動できると確信しています(3,1)
R.ガプス

1
@ R.Kapあなたは間違っています。;)en.wikipedia.org/wiki/Knight_
chess

@DLoscわかりました、すごい。私はそうだったと思います。それをありがとう!
R.ガプス

すべての有効な跳躍者をリストに出力できますか?もしそうなら、次のような同等の跳躍者を出力でき[[1, 0], [0, 1]]ますか?
FryAmTheEggman

@FryAmTheEggmanそのうちの1つだけをお願いします。
マーティンエンダー

回答:


12

Pyth、 41 35

hfqQu@+G+VM*s_BM*F_BMTGQ]hQ)maVhQdt

有効なリーパーがいない場合はエラーで終了し、STDERRが無視されると空の文字列を返します。

ここで試してみるか、テストスイートを実行してください

isaacgのおかげで6バイト節約されました!基本的には、最初のタイルから他のタイルまでの有効な各リーパーを選択することで、すべてのリーパー候補を見つけます。次に、これらのそれぞれについて[x, y]、リーパーが取ることができるオフセットの8つの構成すべてを作成します。次に、移動の後に続く最初のタイルから始まるすべての移動を検索し、入力にないものを破棄します。結果が変わらなくなるまでこれを繰り返します。この最終リストが入力と同じ場合、跳躍者は有効でした。

標準チェスボードは、テスト中に最も時間がかかりましたが、あまり印象的なコンピューターでは約3秒かかりました。

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