ナインメンズモリスのカウントミルズ


21

前書き

Nine Mens's Morris(Millsとも呼ばれます)は、次のボードでプレイされる2人用のボードゲームです(リンクされているウィキペディアのページからの画像)。

ミルボード

各プレイヤーには、黒と白の色の9人の男性がいます。具体的なルールはこの課題にとって重要ではありませんが、興味があればウィキペディアのページをご覧ください

チャレンジ

特定のボード状態を表すグリッドを入力として指定し、で合計ミルカウントmを出力し0<=m<=8ます。
同じ色の3人の男性が接続ポイントの直線の列にいるとき、工場を形成します。 b2to f2は男性ではないため、工場ではありません。またd2するd53点を接続する必要があるため工場を形成しないでしょう。
上の画像のボードには、たとえば2つのミルが含まれています。からf2f61つ、からe3に1つe5

入力

ボードは、上記のサンプル画像に示すように接続された24ポイントの2Dグリッドとして表されます。この例ではa-g、列にfrom 1-7を、行にfrom numberを使用していますが、24の一意の座標を次の状態のいずれかにマッピングする限り、任意の妥当な入力形式を選択できます。

  • 空の
  • 黒で撮影
  • 白で撮影

具体的な表現はあなた次第で、色の「b」または「w」に制限されません。

これに加えて、入力には追加情報が含まれない場合があります。

その他の注意事項

  • どのような種類の値でもポイントをマップする必要はありません。入力を2D配列として取得する場合も同様です。ただし、すべてのポイントが使用されているわけではなく、それらの間の接続を考慮する必要があることに注意してください。
  • 入力が空の場合、ゼロを出力する必要があります(空のボード->ミルなし)。
  • 各プレイヤーには9人の男性がいるため、入力には18を超える獲得ポイントは含まれません。
  • 入力の空のポイントを除外することができます。したがって、取得される入力ポイントのみを除外できます。
  • 入力は任意の方法で注文できます。特定の順序に依存することはできません。
  • 入力は常に有効であると仮定することができます。これは、各色の男性が9人を超えないこと、および各ポイントが一意になることを意味します。

ルール

  • ソリューションで使用する入力形式を明確にします。プログラムの実行例を提供することを強くお勧めします。
  • 機能または完全なプログラムが許可されます。
  • 入出力のデフォルト規則
  • 標準の抜け穴が適用されます。
  • これはなので、バイト数が最小になります。Tiebreakerは以前の提出です。

テストケース

ここでの入力形式は、上の例のような座標が最初の要素であり、ポイントの状態が2番目の要素であるタプルのリストです。白で撮影されたポイントは「w」、黒で撮影されたポイントは「b」としてマークされます。他のすべてのポイントは省略され、空になります。

[( "a4"、 "w")、( "b2"、 "b")、( "b4"、 "b")、( "c4"、 "b")、( "d1"、 "w") 、( "d2"、 "w")、( "e3"、 "w")、( "e4"、 "w")、( "e5"、 "w")、( "f2"、 "b") 、( "f4"、 "b")、( "f6"、 "b")、( "g4"、 "w")]-> 2
[( "a1"、 "b")、( "a4"、 "b")、( "a7"、 "b")、( "b4"、 "b")、( "c4"、 "b") 、( "d3"、 "w")、( "d2"、 "w")、( "d1"、 "w")]-> 3
[]-> 0
[( "b4"、 "b")、( "a4"、b ")、(" c4 "、w")]-> 0
[( "b4"、 "b")、( "a4"、b ")、(" c4 "、b")]-> 1
[( "a1"、 "b")、( "a4"、 "b")、( "a7"、 "b")、( "b2"、 "b")、( "b4"、 "b") 、( "b6"、 "b")、( "c3"、 "b")、( "c4"、 "b")、( "c5"、 "b")、( "e3"、 "w") 、( "e4"、 "w")、( "e5"、 "w")、( "f2"、 "w")、( "f4"、 "w")、( "f6"、 "w") 、( "g1"、 "w")、( "g4"、 "w")、( "g7"、 "w")]-> 8

ハッピーコーディング!



色は整列されているだけでなく、連続している必要があると思いますが、少し不明瞭です。たとえば、同じ色のd2、d3、d5はミルを形成しますか?
ロバートベンソン

@RobertBensonいいえ、接続されていないためd3d5接続されません。ルールは言う: Three men of the same color form a mill when they are in a straight row of connected points.。このセクションにいくつかの例を追加して、明確にするために、コメントをありがとう!
デンカー

回答:


4

APL(Dyalog Classic)26 25バイト

-1 FrownyFrogに感謝

≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢

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

引数は、1(黒)、¯1(白)、および0(空)の3x3x3配列です。最初の次元は、同心正方形の入れ子の深さに沿っています。他の2つの次元は、垂直軸と水平軸に沿っています。

000---------001---------002
 |           |           |
 |  100-----101-----102  |
 |   |       |       |   |
 |   |  200-201-202  |   |
 |   |   |       |   |   |
010-110-210     212-112-012
 |   |   |       |   |   |
 |   |  220-221-222  |   |
 |   |       |       |   |
 |  120-----121-----122  |
 |           |           |
020---------021---------022

最初の軸に沿って合計するときに4つのコーナーを破棄する必要がある3場合¯3を除き、任意の軸に沿った合計がa またはを生成する場合は常にミルがあります。

{} 暗黙的な引数を持つ関数です

↓⍵あるスプリット -私達の場合には、ネストされた長さ3のベクトルの3x3の行列に3×3×3キューブを回します

⍵⍪↓⍵ 元の立方体を取り、その下に3つのベクトルの3x3行列を接着します。したがって、スカラーとベクトルの4x3x3混合配列を取得します。

+/最後の軸に沿って合計します。これには、元の立方体を最後の軸+/⍵に沿って合計し(+/↓⍵)、分割したために中央の軸に沿って合計する()複合効果があります。

ここで、最初の軸の特殊なケースに注意する必要があります。

+⌿⍵ 最初の軸に沿って合計し、3x3行列を返します

4 2⍴ ただし、角を数えてはならないため、次のように4x2行列に整形し直します。

ABC      AB
DEF  ->  CD
GHI      EF
         GH  ("I" disappears)

今は最後の列(BDFH)のみに関心があるので、イディオムを使用します⊢/

,BDFH2番目と3番目の軸について前に取得した行列に連結します(BDFH行列の先頭の次元はたまたま4です)

これまでに取得したすべてを単一のベクトルにフラット化します

| 絶対値を取る

{ }∩≢ 3のみをフィルタリングします-入力の長さ(≢)は常に3です

それらを数えます


へえ、私はちょうどそれを提案しようとしていました。
アダム


≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢1つ短いです:)
FrownyFrog

@FrownyFrogありがとう!で編集
NGN

4

JavaScriptの(ES6)、276の 228 125 117 105バイト

a=>btoa`i·yø!9%z)ª»-ºü1j;ÝÈ%¥·¡ªÜ"·ç¹Ê1`.replace(/.../g,b=>(a[b[0]]+a[b[1]]+a[b[2]])/3&1||'').length

(上記には、ここには表示されない印刷不可能なASCII文字が含まれているため、btoaコピーして実行できるなしのバージョンがあります)

a=>'abcdefghijklmnopqrstuvwxajvdksglpbehqtwimrfnucox'.replace(/.../g,b=>(a[b[0]]+a[b[1]]+a[b[2]])/3&1||'').length

参照文字列を、ミルグループキーと一致する文字のトリプレットに分割します。入力はオブジェクトの形式で、キーは文字a-xで、左下から始まり、右上で終わり、最初に左から右に移動します。値は1、白、-1黒、および0空白用です。

{b:1,d:-1,e:1,f:-1,i:1,k:-1,l:-1,m:1,n:-1,r:1,u:-1} => 2
{j:1,d:-1,k:-1,l:-1,b:1,e:1,i:1,m:1,r:1,f:-1,n:-1,u:-1,o:1} => 2
{a:-1,j:-1,v:-1,k:-1,l:-1,h:1,e:1,b:1} => 3
{} => 0
{k:-1,j:-1,l:1} => 0
{k:-1,j:-1,l:1} => 1
{a:-1,j:-1,v:-1,d:-1,k:-1,s:-1,g:-1,l:-1,p:-1,i:1,m:1,r:1,f:1,n:1,u:1,c:1,o:1,x:1} => 8

これらの例は、OPの例から取得され、文字キーおよび数値オブジェクトに変換されます。最初はサンプル画像からのもので、他はサンプルセットからのものです。


1
良くやった!で大きな文字列を圧縮できますatob
ETHproductions

@ETHproductionsありがとう!ただし、印刷できないアスキー文字を使用しているようですので、アスキー文字も含めずに含めますbtoa。また、さらにそれをダウンさせるいくつかの他の改善を発見しました。
Mwr247

2

Mathematica、217 131バイト

これは特に競争力のあるものではないと確信していますが、ここにエントリがあります。

Count[Total/@{{a1,d1,g1},{b2,d2,f2},{c3,d3,e3},{a4,b4,c4},{e4,f4,g4},{c5,d5,e5},{b6,d6,f6},{a7,d7,g7},{a1,a4,a7},{b2,b4,b6},{c3,c4,c5},{d1,d2,d3},{d5,d6,d7},{e3,e4,e5},{f2,f4,f6},{g1,g4,g7}}/.#/.{"w"->1,"b"->2},3|6]&

入力例:

{a4 -> "w", b2 -> "b", b4 -> "b", c4 -> "b", d1 -> "w", d2 -> "w", e3 -> "w", e4 -> "w", e5 -> "w", f2 -> "b", f4 -> "b", f6 -> "b", g4 -> "w"}

単一文字の座標名を使用すると、51文字を簡単にゴルフで除外できるため、これは166バイトのソリューションになります。「w」と「b」ではなく、プレーヤー1と2に名前を付けると、さらに17人のキャラクターがオフになります。

だから私たちは得る

Count[Total/@{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,a,j,v,d,k,s,g,l,p,b,e,h,q,t,w,r,i,m,f,u,n,c,o,x}~Partition~3,3|6]/.#&

入力書式ルールを正しく理解していれば、as 1およびとしてそれらを使用できるはず2です。この例ではwandを使用しbていますが、これに限定されないことは確かです。
Mwr247

@ Mwr247そのとおりです。追加情報を追加しない限り、任意の形式を使用できます。私は家にいるときにこれを明確にします。
デンカー

1

APL(Dyalog Unicode)、50バイト

「オブジェクトのソリューション」

@ngnのソリューション よりも長い(29文字)一方で、完全に異なるアプローチを使用します。入力はそのソリューションと同じ全体構造を持ちますが、すべてのスロットはオブジェクトとして表されます。空のスロット(存在しない中央の列を含む)は空のオブジェクトでなければなりません。すべての黒人男性は「黒人」オブジェクトへの参照でなければならず、すべての白人男性は「白人」オブジェクトへの参照でなければなりません。すべてのオブジェクトは、必要に応じて素敵な持ってDを isplay F ORMの読みやすさのために、そして中央の列は、必要に応じて見えないようにすることができますので。

+/1=(≢¨(,∪/,∪⌿⍤2),(⊢/4 2⍴∪⌿))

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

+/ 合計

1=(…中の) もの

≢¨() のタリー

  , ほつれた(平らな)

  ∪/ ユニークなセット

  , に連結

  ∪⌿⍤2 ユニークなセットダウン

,(…に) 連結

  ⊢/ の右端の列

  4 2⍴ the、4行2列に再形成、

  ∪⌿ ユニークな円柱セット

頂上としてAGL(付属のオペレータが、ä)、27文字までの長さをもたらします

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