カタンの開拓者-最長の道!


16

これは、カタンの開拓者の終盤ボードです。

カタンボード

バックグラウンド:

道路(長い棒の部分)と集落(および都市)は、小さな小屋によってレンダリングされます。次のスキームを使用して、これらのピースの配置をエンコードします。上から、道路を配置できる行の水平頂点とエッジがあります。次に、道路のみの列などがあります。赤にR、オレンジにO、青にBを使用し、_を使用しない場合、写真のボードは次のようにエンコードされます。

________RR_R_
__R_
__RR_R_RRR_____R_
B___R
_B_________B__OO_OOR_
B__B_R
BB_BBB_____B____RR_R_
OBB_O
OO__BB_BB__OOO_OO
O_O_
_O_OOO_O_____

このようなボードが入力文字列になります。どんな手紙でも[A-Z]もプレーヤーの色を示すことができますが、最大4色(空を含む)があります。それ以外の場合、ボードは入植者の規則に従って有効であることが保証されます。

  • 各色には、最大で2つの連続した道路網があり、他のプレイヤーの居住地/都市(頂点の建物)によって分割される場合と分割されない場合があります。サンプル画像の右側のオレンジ色の集落が赤い道路をバラバラにしているのを見てください。
    • 各道路網には、少なくとも1つの集落があることが保証されています。
  • すべての集落と都市は、少なくとも 、最も近い他の集落/都市(あなたのものまたはそうでないもの)から 2つの
  • 1人のプレイヤーは、ゲームボード上に15の道路しか持てません。
  • カタン愛好家の場合:この問題の目的のために集落と都市の区別はないため、入力文字列では区別しません。

これはすべて、「入力」文字列を指定するためのものです。

最長の道:

入植者では、プレイヤーは「最長の道」を持つことで2つの勝利ポイントを獲得します。これは次のように定義されます:開始地点から終了地点までの最長の連続した単一の経路(道路で測定)。敵の集落または都市によって分割されない。特定の開始点から特定の終了点までのパスをトレースできる限り、サイクルは問題ありません。したがって、6本の道路と分岐する1本の道路のループは長さ7ですが、反対側の6本の道路ループから分岐する2本のループはまだ7の価値しかありません。

例のマップでは、右側の赤い道路は4の価値しかありません。ボードの右側のオレンジの集落によって彼が切り離されているためです(そのため、集落はまったく含まれません)。青には長さ13の道路があり、オレンジには長さ12の道路があります。赤の一番上の道路は、その隣の2つの単一道路に接続していないため、7の価値があります。

出力:

最長の道路(同点の場合は複数になる可能性があります)があり、その後に空白またはアンダースコアで区切られた道路があるすべてのプレイヤーは、その道路の長さのベース10でカウントされます。

したがって、サンプルボードの出力は次のようになります。

B 13

問題ステートメント:

プログラムまたは関数を記述し、STDIN経由で、または関数への文字列引数として入力ボードを受け取ります。関数は、上記の出力を文字列として返すか、STDOUT(または最も近い代替)に出力します。オプションで、出力に単一の末尾の改行を含めることができます。

これは、最短のプログラムが勝ちます。もちろん、標準的な抜け穴は禁止されています。


2
本当の問題声明:オレンジ色のプレーヤーはジャークです。
corsiKa

From the top, we have a row horizontal vertices and edges where a road can be placed. Then we have a column of only roads, and so forth. これが何を意味するのかを理解するのに数分かかりました。水平の行には決済と決済場所も含まれていることをより明確に説明する必要があります。
DLosc

@corsiKa以前に誰かにそれをさせてもらいました!
ジェリーエレミヤ

1
画像のオレンジと赤は本当に似ています。別の色を選択する必要があります。
mbomb007

回答:


3

Python 2、445 400バイト

私は入植者のファンなので、この挑戦​​は楽しかったです。

T="^"
Z=26
A=T*52
for i in range(11):A+=(T*(i%2)*3).join(x for x in raw_input()).center(Z,T)
A+=T*52
def f(c,p=0,l=0,B=A):
 b=l;C=B[0:p]+T+B[p+1:];n=(Z,1)[p%2]
 for i in(p<1)*range(390):
    if(i/Z%2<1&i%2>0)|(i/Z%2>0&i%2<1):b=max(b,f(c,i))
 for i in(p-n,p+n)*(B[p]==c):
    for j in(i-Z,i-1,i+1,i+Z)*(B[i]in c+"_"):b=max(b,f(c,j,l+1,C))
 return b
i=l=0
for x in A:
 if x<T:i=f(x)
 if i>l:c=x;l=i
print c,l

スコアは、4つのスペースが出現するたびにタブで置き換えることを反映しています。

説明

関数定義の前の行は入力を読み取り、正規化されたボードを単一の文字列変数に構築します。プロセスは、垂直道路セグメントを表す短い線に「^」文字を挿入します。また、ボードに「^」文字を埋め込みます。

^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^________RR_R_^^^^^^^
^^^^^^_^^^_^^^R^^^_^^^^^^^
^^^^__RR_R_RRR_____R_^^^^^
^^^^B^^^_^^^_^^^_^^^R^^^^^
^^_B_________B__OO_OOR_^^^
^^B^^^_^^^_^^^B^^^_^^^R^^^
^^BB_BBB_____B____RR_R_^^^
^^^^O^^^B^^^B^^^_^^^O^^^^^
^^^^OO__BB_BB__OOO_OO^^^^^
^^^^^^O^^^_^^^O^^^_^^^^^^^
^^^^^^_O_OOO_O_____^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^

デフォルトのパラメータで呼び出されると、関数は指定された色の道路の長さを返します。最初のループは、位置(p)パラメーターが指定された場合にのみアクティブになります。有効な各道路位置で道路の長さを再帰的に検索し、最も長い道路の位置を追跡します。位置パラメータに道路がある場合、関数は同じ色の隣接する道路の長さを再帰的に追加します。ボードの作業コピーでは、道路が「〜」に置き換えられ、既にカウントされているセグメントが再カウントされないようにします。

関数定義に続くコードは、ボードの各色の関数を呼び出し、最高のスコアの色と長さを印刷します。

ここでデモ

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