카탄의 정착민-가장 긴 길!


16

이것은 Catan의 정착민의 최종 게임 보드입니다.

카탄 보드

배경:

길 (긴 막대기 조각)과 정착지 (및 도시)는 작은 오두막집으로 렌더링됩니다. 다음 구성표를 사용하여 이러한 조각의 배치를 인코딩합니다. 맨 위에서부터 도로를 배치 할 수있는 가로 가로 정점과 가장자리가 있습니다. 그런 다음 우리는 도로 등의 기둥을 가지고 있습니다. 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 개의 인접 도로 네트워크가 있으며, 이는 다른 플레이어 정착지 / 도시 (정점 빌딩)에 의해 분리되거나 분리되지 않을 수 있습니다. 샘플 이미지의 오른쪽에있는 빨간색 도로를 분리하는 주황색 정착지를 확인하십시오.
    • 각 도로 네트워크에는 하나 이상의 정산이 보장됩니다.
  • 모든 거주지와 도시는 가장 가까운 다른 거주지 / 도시 (귀하 또는 다른 곳)로부터 최소 두 개의 모서리를 보장합니다.
  • 한 명의 플레이어는 게임 보드에 15 개의 도로 만 가질 수 있습니다.
  • Catan 애호가의 경우 :이 문제의 목적으로 정착촌과 도시가 구분되지 않으므로 입력 문자열을 구분하지 않습니다.

이 모든 것은 "입력"문자열을 지정하기위한 것입니다.

가장 긴 도로 :

정착민에서 플레이어는 "가장 긴 길"로 2 점을 얻습니다. 이것은 시작 지점에서 끝 지점까지의 가장 긴 연속 단일 경로 (도로에서 측정)로, 상대방의 합의 또는 도시에 의해 분리되지 않습니다 . 하나의 특정 시작점에서 하나의 특정 끝점까지의 경로를 추적 할 수있는 한 사이클은 괜찮습니다. 따라서 6 개의 도로와 1 개의 도로 분기 사이의 루프는 길이 7이지만, 반대쪽에 6 개의 도로 루프에서 2 개의 분기와 1 개의 분기는 여전히 7의 가치가 있습니다.

예제 맵에서 오른쪽의 빨간색 도로는 보드의 오른쪽에있는 주황색 정착지로 인해 잘리지 않기 때문에 4의 가치가 있습니다 (그 때문에 정착지가 전혀 포함되지 않음). 파란색은 길이가 13이고 주황색은 길이가 12입니다. 빨강의 최상위 도로는 그 옆에있는 두 개의 단일 도로에 연결되지 않기 때문에 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 누군가 전에 저에게 그런 짓을 한 적이 있습니다!
Jerry Jeremiah

1
이미지의 주황색과 빨간색은 실제로 비슷합니다. 다른 색을 골랐어 야합니다.
mbomb007

답변:


3

파이썬 2, 445 400 바이트

저는 Settlers의 팬이므로이 도전은 재미있었습니다.

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.