4色のトリオミノでチェス盤を並べます


11

仕事:

問題を考えてみましょう:「チェス盤に1つの正方形が欠けている場合、それを21個のL-トリオミノにカットします」。これは、2の累乗である任意の正方形のチェス盤サイズで実行できるというよく知られた建設的な証拠があります。チェス盤を、穴のある小さなチェス盤と1つの大きなトリオミノに分割し、そのトリオミノを4つのトリオミノに再帰的に切断できることを確認します。

このタスクでは、8x8のチェス盤をL字型のトリオミノにカットし、隣接する2つのトリオミノが同じ色にならないように4色で着色する必要があります。

仕様:

入力は、穴の位置であり、整数のペアとして指定されます。列インデックスと行インデックスを選択できます。それぞれが0から開始するか、1から開始し、どのコーナーから増加するかを選択できます。0..7または1..8の代わりに、最初の座標としてA..Hが必要な場合があります。また、両方の座標を辞書式順序(行優先または列優先、左から右または右から左、上から下または下から上)で単一の整数0..63または1..64にパックすることもできます。完全なプログラムまたは関数を記述できます。

タイルをASCII、色付きASCII、またはグラフィックプリミティブとして出力できます。ASCII出力を選択した場合、4色を表す印刷可能なASCII文字を4つ選択できます。色付きのASCIIを選択した場合、任意の4つの印刷可能なASCII文字またはスペース以外の1文字のみを選択できます。穴はスペース文字で表す必要があります。キャラクターの1つがスペースキャラクターである場合、穴に隣接するまたはチェス盤の端にあるトリオミノは、この色ではありません。

色付きASCIIまたはグラフィック出力を選択する場合、#000、#00F、#0F0、#0FF、#F00、#F0F、#FF0、#FFF、またはご使用の環境で利用可能な最も近いものから任意の4色を選択できます。グラフィカル出力を選択する場合、グラフィカルプリミティブは、サイズが少なくとも32x32ピクセルの正方形で塗りつぶされ、他の色の2ピクセル以下で区切られている必要があります。上記が環境の画面解像度を超える場合、最小サイズ要件は、画面に収まる最大の正方形サイズに緩和されます。

指定されたチェスボードの有効なタイルを選択できます。選択したタイルの4色を選択できます。4色の選択はすべての出力で同じでなければなりませんが、すべての出力ですべての色を使用する必要はありません。

例:

入力の可能な出力= [0、0](左上隅)

 #??##??
##.?#..?
?..#??.#
??##.?##
##?..#??
#.??##.?
?..#?..#
??##??##

同じプログラムの別の可能な出力(入力= [0、7]):

??#??#?
?##?##??
..xx..xx
.?x#.?x#
??##??##
..xx..xx
.?x#.?x#
??##??##

「D1」の入力用に別のプログラムが生成される場合もあります(非標準ですが、チェスボードの向きに注意してください)。

AABBCCAA
ACBACBAC
CCAABBCC
 ABBAADD
AABDABDC
BBDDBBCC
BABBACAA
AABAACCA

4
入力がある場合、それは実際にはコルモゴロフの複雑さではありません
ジョナサンアラン

@JonathanAllanタグの説明では、入力を取るコルモゴロフの複雑さの質問の例として、誰がそのポケモンかを使用してます。64個の定数ソリューションのセットを圧縮するか、チェスボードをタイル表示してから色を付ける手順を実装するかは、ユーザー次第です。
ジョンドヴォルザーク


1
3色では足りませんか?
アーナルド

1
@Arnauldそれを許可します。編集します。
ジョンドヴォルザーク

回答:


22

JavaScript(ES6)、 184 ... 171  163バイト

入力を受け取り(x)(y)と、と。3色(としてマークされた文字列として出力、及び)。0x70y7012

h=>v=>(a=[...'3232132031021010'],a[5+(v&4|h>3)]^=3,a[v/2<<2|h/2]=v%2*2+h%2,g=x=>y&8?'':(x<8?x-h|y-v?a[y/2<<2|x/2]^y%2*2+x%2?(x^y)&2:1:' ':`
`)+g(-~x%9||!++y))(y=0)

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

方法

トリオミノの行列で作業します。4×4

(t0t1t2t3t4t5t6t7t8t9t10t11t12t13t14t15)

各トリオミノは次のいずれかです。

トリオミノ

マトリックスの初期構成は次のとおりです。

(3232132031021010)

チェス盤で行うように、最初の2色を交互に切り替えます。

マトリックス0

次の手順は次のとおりです。

  1. 穴が位置する象限に従って、4つの中央トリオミノ(、、または)の1つを180° 回転させます。t5t6t9t10
  2. 穴が配置されていないように、穴が配置されているトリオミノを回転します(ステップ1と同じトリオミノである場合があります)。
  3. 穴を3番目の色で塗りつぶします(「実際の」穴を除く)。

たとえば、穴があると仮定すると、次のようになります。(3,0)

マトリックス1

そして、その場合、最終的なマトリックスは次のとおりです。

(3132102031021010)

コメント済み

h => v => (                       // (h, v) = hole coordinates
  a = [...'3232132031021010'],    // a[] = flat representation of the 4x4 matrix
  a[5 + (v & 4 | h > 3)] ^= 3,    // first rotation, achieved by XOR'ing with 3
  a[v / 2 << 2 | h / 2] =         // second rotation according to the
    v % 2 * 2 + h % 2,            // position of the hole within the triomino's square
  g = x =>                        // g is a recursive function that converts the 4x4
                                  // matrix into a 8x8 ASCII art
    y & 8 ?                       // if y = 8:
      ''                          //   stop recursion and return an empty string
    :                             // else:
      ( x < 8 ?                   //   if this is not the end of the row:
          x - h | y - v ?         //     if this is not the position of the hole:
            a[y / 2 << 2 | x / 2] //       if this part of the triomino located at this
            ^ y % 2 * 2 + x % 2 ? //       position is 'solid':
              (x ^ y) & 2         //         use either color #0 or color #2
            :                     //       else:
              1                   //         use color #1
          :                       //     else:
            ' '                   //       the hole is represented with a space
        :                         //   else:
          `\n`                    //     append a linefeed
      ) + g(-~x % 9 || !++y)      //   append the result of a recursive call
)(y = 0)                          // initial call to g with x = y = 0

グラフィカル出力

写真をクリックして、穴の位置を設定します。


3色が常に十分であるという建設的な証拠、非常に素晴らしい!
ジョンドヴォルザーク

6
クリック可能なグラフィック出力が大好きです!
ケビンCruijssen

3

、78バイト

NθNη”{⊞⊟¦≦⁶q×fΣ\⊙t×_⊟✳-Y⁴℅=⁶υ”≔›θ³ζ≔›η³εFζ≦⁻⁷θFε≦⁻⁷ηJ⊕÷θ²⊕÷η²§#$⁺ⅈⅉJθη Fζ‖Fε‖↓

オンラインでお試しください!リンクは、コードの詳細バージョンです。#$%文字を使用して出力します。説明:

NθNη

空白の正方形の座標を入力します。

”{⊞⊟¦≦⁶q×fΣ\⊙t×_⊟✳-Y⁴℅=⁶υ”

圧縮された文字列を出力します。これには改行が含まれているため、この説明の流れが途切れないように、答えの最後に文字列があります。

≔›θ³ζ≔›η³εFζ≦⁻⁷θFε≦⁻⁷η

いずれかの座標がより大きい場合3、その事実を覚えて、7から座標を引きます。

J⊕÷θ²⊕÷η²§#$⁺ⅈⅉ

sの%左上の正方形の最も近くにジャンプし、必要に応じ%#またはで上書き$します。(ただし、これが既にこの正方形にあった場合は、空白で上書きされます。)

Jθη Fζ‖Fε‖↓

縮小された座標で正方形を空白にし、必要に応じて出力を反映して、空白を元の位置に戻します。

##$$##$$
#%%$#%%$
$%%#$$%#
$$##%$##
##$%%#$$
#%$$##%$
$%%#$%%#
$$##$$##

%中央のs の正方形から始めて、目的の座標に到達しようとしましたが、90バイトかかりました。

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