相互攻撃の女王


26

8x8のチェス盤を2つの異なる値で表し、1つの値を空の正方形、もう1つの値をクイーンとします。次の例では、空の四角形として0を使用し、クイーンとして1を使用します。例えば:

チェス盤の女王

によって与えられます

1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1

少なくとも1スクエア離れたそれぞれを攻撃しているクイーンのペアの数を考慮します(リマインダーとして、クイーンは直交して斜めに攻撃します)。上記の例では、次の信じられないい図がこれらすべてのペアを矢印として示しています。

攻撃の女王

上記の43のペアがあり、次のテストケースを示します。

Input:
1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1
Output: 43

チャレンジ

2つの異なる値で表されるボードの状態が与えられると、少なくとも1つの正方形を挟んで互いに攻撃するクイーンのペアの数を出力するプログラムを作成します。

  • 空の四角とクイーンを表すのに2つの値を使用する最も便利な形式で入力できます。たとえば、空の四角には64「。」の文字列、下から上に行ごとのクイーンには「Q」の文字列、8x8ソリューションで説明されている限り、ブール値のマトリックス、整数0および1などのリストのリスト
  • 出力は整数です
  • 標準I / O方法が適用され、標準の抜け穴は禁止されています
  • これはコードゴルフなので、バイト単位の最短回答が勝ちます

テストケース:

0と1の形式を使用します。0は空の正方形で、1はクイーンです。

Input:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Output: 0

Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 0

Input:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 1 0 0 0 0 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Output: 1

Input:
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 1 0 0 0 0 1 0
0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0
0 0 0 1 0 0 1 0
0 0 0 0 0 0 0 0
Output: 10

Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 4

Input:
1 1 0 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 11

2番目のバージョンを投稿する前に質問する必要がありました。クイーンの場合は254、空の正方形の場合は0が入力値として受け入れられますか?
アーナウルド

@Arnauld 空の正方形とクイーンを表すために2つの値を使用する最も便利な形式で入力できます。確かにそれは問題ありません
-JMigst

ありがとう。私は、このルールは文字通りに取られると少し寛容すぎるかもしれないと思うので尋ねました。クイーンのJSコードのほとんどを含む文字列を渡すように要求し、プログラムでそれを評価することができます。(しかし、それはデフォルトの抜け穴によって防がれるかもしれません。私には
わかり

回答:


14

Python 2、105バイト

lambda b:sum(b[i+d::d][:(8,7-i%8,i%8)[d%8%5]].find('1')*int(c)>0for i,c in enumerate(b)for d in[1,7,8,9])

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

説明

入力を64文字の文字列'0'またはとして受け取ります'1'。ステップスライスを使用して、遭遇するすべてのクイーンから4つの「視線」をキャストします。たとえば、i = 10およびd = 7の場合、クイーンを♥としてマークし、タイルb[i+d::d]を█として選択します。

1 0 1 1 1 0 0 0
1 0  0 1 0 1 1
1  1 0 1 1 0 1
 1 0 1 0 1 0 
0 1 1 0 0 1  1
1 0 0 0 1  0 0
0 1 0 0  1 1 1
0 1 1  0 1 0 1

明らかに、私たちは実際にビジョンがこのようにボードを包み込むことを望んでいません。したがって、ボードの端が各方向にどれだけ離れているかを計算し、タイルをb[i+d::d][:…]ます。

タイルと方向のペアごとに、以下をカウントします。

ray.find('1')*int(c)>0

これはいつでも失敗します

  • c女王ではありません。または
  • このレイが見るクイーンは近すぎます(find 0を返します)。または
  • この光線にはクイーンが見えません(find-1を返します)。

光線は常に「前の」女王から「後の」女王へと読み取り順で前方にキャストされるため、女王の各ペアは1回だけチェックされます。


10

JavaScript(ES7)、86バイト

入力をクイーンの場合は254、空の正方形の場合は0の64個の整数の配列として受け取ります。

a=>[s=0,6,7,8].map(d=>a.map(g=(n,p)=>(p%8-(p+=~d)%8)**2<n%4?a[p]?s+=n&1:g(n/2,p):0))|s

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

このバージョンでは、算術アンダーフローを悪用して、再帰部分で停止条件を取得します。


JavaScript(ES7)、89バイト

入力を64ビットの配列として受け取ります。

a=>[s=0,6,7,8].map(d=>a.map(g=(n,p,x)=>(p%8-(p+=~d)%8)**2>1|p<0?0:a[p]?s+=!x&n:g(n,p)))|s

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

どうやって?

指定されたコールバック関数を再帰的に呼び出してmap()、指定された方向に正方形を歩きます。コールバックの3番目のパラメーター(配列map()が呼び出された)の内容は実際には必要ありませんが、それでも間接的に使用して、最初の反復かどうかを確認します。

arr.map(function callback(currentValue [、index [、array]])

これは、コード内のx変数です。

a =>                        // given the input array a[]
  [ s = 0,                  // initialize the sum s to 0
    6, 7, 8 ].map(d =>      // for each direction d in [0, 6, 7, 8]:
    a.map(g = (n, p, x) =>  //   for each square n at position p in a[]:
      (                     //     we are out of the board if:
        p % 8 -             //       - abs(p % 8 - p' % 8) is greater than 1
        (p += ~d) % 8       //         where p' = p - (d + 1)
      ) ** 2 > 1 |          //         (squaring is shorter than using Math.abs)
      p < 0 ?               //       - or p' is less than 0
        0                   //       if so, stop recursion
      :                     //     else:
        a[p] ?              //       if there's a queen on the target square:
          s +=              //         increment s if:
            !x &            //           x is undefined (this is not the 1st iteration)
            n               //           and n = 1 (there's a queen on the source square)
        :                   //       else:
          g(n, p)           //         do a recursive call to g(), with x undefined
    )                       //   end of inner map()
  ) | s                     // end of outer map(); return s

8

カタツムリ、14バイト

A
rdaa7\1\0+\1

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

入力は、行内にスペースを含まない0/1形式です。

Snailsは、2Dパターンマッチング言語設計PPCGチャレンジ用作成されました。最も重要なことは、デフォルトで見つかった一致の数を出力することで、この課題に最適です。


A 「すべてのパス」オプションを設定して、クイーンが複数のペアになっている場合、それらのペアのそれぞれが一致を生成するようにします。

rdaa7一致方向をS、SE、E、およびNEに設定します。すべての方向(z)に設定すると、二重にカウントされます。

\1\0+\1a 1、次に1つ以上0のs、次にanotherに一致し1ます。


6

APL(Dyalog Classic)41 39 32バイト

(+/+⌿-⌈⌿)2<⌿0⍪⊢,⍉,8 31⍴⊢,≠⍨,⌽,≠⍨

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

≠⍨ 「それ自体と等しくない」-8x8のすべてゼロの行列

⊢,≠⍨,⌽,≠⍨-元の行列がの場合ABC...、この式は次を返します。

A B C D E F G H 0 0 0 0 0 0 0 0 H G F E D C B A 0 0 0 0 0 0 0 0
I J K L M N O P 0 0 0 0 0 0 0 0 P O N M L K J I 0 0 0 0 0 0 0 0
Q R S T U V W X 0 0 0 0 0 0 0 0 X W V U T S R Q 0 0 0 0 0 0 0 0
Y Z A B C D E F 0 0 0 0 0 0 0 0 F E D C B A Z Y 0 0 0 0 0 0 0 0
G H I J K L M N 0 0 0 0 0 0 0 0 N M L K J I H G 0 0 0 0 0 0 0 0
O P Q R S T U V 0 0 0 0 0 0 0 0 V U T S R Q P O 0 0 0 0 0 0 0 0
W X Y Z A B C D 0 0 0 0 0 0 0 0 D C B A Z Y X W 0 0 0 0 0 0 0 0
E F G H I J K L 0 0 0 0 0 0 0 0 L K J I H G F E 0 0 0 0 0 0 0 0

8 31⍴ 行優先順で要素を再利用して、8x32から8x31に再整形します。

A B C D E F G H 0 0 0 0 0 0 0 0 H G F E D C B A 0 0 0 0 0 0 0
0 I J K L M N O P 0 0 0 0 0 0 0 0 P O N M L K J I 0 0 0 0 0 0
0 0 Q R S T U V W X 0 0 0 0 0 0 0 0 X W V U T S R Q 0 0 0 0 0
0 0 0 Y Z A B C D E F 0 0 0 0 0 0 0 0 F E D C B A Z Y 0 0 0 0
0 0 0 0 G H I J K L M N 0 0 0 0 0 0 0 0 N M L K J I H G 0 0 0
0 0 0 0 0 O P Q R S T U V 0 0 0 0 0 0 0 0 V U T S R Q P O 0 0
0 0 0 0 0 0 W X Y Z A B C D 0 0 0 0 0 0 0 0 D C B A Z Y X W 0
0 0 0 0 0 0 0 E F G H I J K L 0 0 0 0 0 0 0 0 L K J I H G F E

⊢,⍉, 元の行列とその転置を追加します(わかりやすくするために余分なスペースがあります)。

A B C D E F G H  A I Q Y G O W E  A B C D E F G H 0 0 0 0 0 0 0 0 H G F E D C B A 0 0 0 0 0 0 0
I J K L M N O P  B J R Z H P X F  0 I J K L M N O P 0 0 0 0 0 0 0 0 P O N M L K J I 0 0 0 0 0 0
Q R S T U V W X  C K S A I Q Y G  0 0 Q R S T U V W X 0 0 0 0 0 0 0 0 X W V U T S R Q 0 0 0 0 0
Y Z A B C D E F  D L T B J R Z H  0 0 0 Y Z A B C D E F 0 0 0 0 0 0 0 0 F E D C B A Z Y 0 0 0 0
G H I J K L M N  E M U C K S A I  0 0 0 0 G H I J K L M N 0 0 0 0 0 0 0 0 N M L K J I H G 0 0 0
O P Q R S T U V  F N V D L T B J  0 0 0 0 0 O P Q R S T U V 0 0 0 0 0 0 0 0 V U T S R Q P O 0 0
W X Y Z A B C D  G O W E M U C K  0 0 0 0 0 0 W X Y Z A B C D 0 0 0 0 0 0 0 0 D C B A Z Y X W 0
E F G H I J K L  H P X F N V D L  0 0 0 0 0 0 0 E F G H I J K L 0 0 0 0 0 0 0 0 L K J I H G F E

2<⌿0⍪上に0を追加<し、その下の要素に対してすべての要素を使用して比較します。したがって、1のすべての垂直グループの先頭の1に対して1を取得し、他のすべての場所で0を取得します

+⌿-⌈⌿ 列ごとの合計から列ごとの最大値を引いたもの-すべての列の1グループ間のギャップの数を計算します。ない場合は0を計算します

+/



3

網膜0.8.260の 58バイト

1
¶1$';___¶
_
$n$%`7$*_
(.)(?=.*;(_)*)(?<-2>.)*
$1
m`^10+1

オンラインでお試しください!入力を8つのコンマ区切りの8文字のバイナリ文字列として受け取りますが、ヘッダーは提供された形式を変換します。説明:

1
¶1$';___¶

クイーンから始まるボードのすべての部分文字列を作成します。各サブストリングにマーカー値を付けます。編集:いくつかのゴミ文字列を残して2バイトを保存しました。これらは事実上無視されます。

_
$n$%`7$*_

各マーカーを包括的範囲に分割し、非ゼロ要素に7を追加します。

(.)(?=.*;(_)*)(?<-2>.)*
$1

マーカーの長さに等しい文字のすべての実行を削除します。これは、各女王からの東、南西、南、または南東の光線を見つけることと同じです。

m`^10+1

別の女王に会う前に、少なくとも1つの空の広場を通過するすべての光線を数えます。


3

JavaScript(ES6)+ SnakeEx、38バイト

s=>snakeEx.run('m:<*>10+1',s).length/2

フォームの入力を受け取ります'10111000\n10101011\n10101101\n01010100\n01100101\n10001000\n01000111\n01110101'。結局のところ、SnakeExは元のチャレンジ以外でも引き続き使用できます!


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