"match-3"게임에서 가장 즉각적인 움직임을 찾으십시오


11

오늘 당신의 도전은 다음과 같이 입력하는 것입니다.

fbcfbee
ffcabbe
debceec
bccabbe
edcfbcd
daeaafc
eebcbeb

그리고 다음과 같이 3 개 이상의 글자와 일치하는 Bejeweled와 같은 게임에서 가능한 최고의 움직임을 출력하십시오 (대문자 BC).

fbcfbee
ffcabbe
deBCeec
bccabbe
edcfbcd
daeaafc
eebcbeb

전체 사양 :

  • 입력이있을 것이다 n라인 n소문자 각 ( n될 수있는 임의의 수).
  • 결과는 경기 3 게임에서 할 수있는 가장 좋은 움직임이며 대문자로 바꾸려는 두 글자가 있습니다.
  • 일치는 다음 우선 순위를 가져야합니다 (이 예에서는 .중요하지 않은 사각형을 나타냄).

    1. 5 행

      xxYxx
      ..X..
      
    2. 깨진 5 행

      X..
      Yxx
      x..
      x..
      

      또는

      .X.
      xYx
      .x.
      .x.
      
    3. 한 줄에

      xYxx
      .X..
      
    4. 3 행

      xYx
      .X.
      

    우선 순위가 가장 높은 것을 찾아서 출력해야합니다.

  • 우선 순위가 동일한 여러 개의 일치 항목이있는 경우 그 중 하나를 출력 할 수 있습니다.
  • 일치하는 항목이 항상 하나 이상 있습니다 (일치하는 항목이 없으면 프로그램이 중단되거나 원하는 작업을 수행 할 수 있음).
  • I / O는 합리적인 형식 (stdin / out, 파일 읽기 및 쓰기, 함수 인수 / 반환 값, 대화 상자 등) 일 수 있지만 하드 코딩되지는 않습니다 (예 :) x="[insert input here]".
  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다. 어떤 이유로 든 네트워크 액세스를 사용하는 경우 네트워크에서 다운로드 한 모든 바이트가 점수에 포함됩니다.

1
+1이지만 제목에 항의합니다. 더 나은 움직임이있을 수 있습니다. 예를 들어, 두 개의 파이브를 생성하는 하나 또는 한 방울이 더 많은 물건을 생성하게하는 하나입니다.
Justin

깨진 5 행도 포함 ..x.\nxxYX\n..x.됩니까?
피터 테일러

@ 피터 예, 그렇습니다.
Doorknob

행 패턴에는 2 개의 깨진 5가 있습니다 : L 패턴과 T 패턴. 둘 다 일치해야합니까?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@nhahtdh 예, 명확히하기 위해 편집하겠습니다.
Doorknob

답변:


2

파이썬 3.4, 772

공백 대신 들여 쓰기를 위해 탭 사용.

import sys,itertools as I
B=[]
for l in sys.stdin:
    l=l.rstrip()
    B.append(list(l))
Z=len(B[0])
F=T=None
R=range
N=min
X=max
P=I.product
S=0
def C(I,J,K,L):
    global F,T,S
    if K<0 or K>=Z or L<0 or L>=Z: return
    B[I][J],B[K][L]=B[K][L],B[I][J]
    h=v=1
    m=B[K][L]
    for i in R(K+1,N(Z,K+5)):
        if B[i][L]!=m:break
        v+=1
    for i in R(K-1,X(0,K-5),-1):
        if B[i][L]!=m:break
        v+=1
    for j in R(L+1,N(Z,L+5)):
        if B[K][j]!=m:break
        h+=1
    for j in R(L-1,X(0,L-5),-1):
        if B[K][j]!=m:break
        h+=1
    c=X(h,v)*2
    if N(h,v)>=3:c+=N(h,v)
    if c>S:S=c;F=I,J;T=K,L
    B[I][J],B[K][L]=B[K][L],B[I][J]
for i,j in P(reversed(R(Z)),R(Z)):
    for d,e in (1,0),(0,-1),(0,1),(-1,0):
        C(i,j,i+d,j+e)
for i,j in P(R(Z),R(Z)):
    c=B[i][j]
    if (i,j)in(F,T):c=c.upper()
    print(c,end=('',"\n")[j==Z-1])

대신 [c for c in l], 당신은 할 수 있습니다 list(l).
Doorknob

두 가지 비교 대신 (i, j) in (F, T)를 사용하십시오-778
Austin Hastings

F = (i, j)-> F = i, j. 2 r / o syms를 세계화 해제-770
Austin Hastings

버그 수정 : broken-5가 true-5를 이길 수 없습니다.
Austin Hastings
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.