Encontre a melhor jogada imediata em um jogo de "match-3"


11

Seu desafio hoje é receber contribuições como esta:

fbcfbee
ffcabbe
debceec
bccabbe
edcfbcd
daeaafc
eebcbeb

E produza a melhor jogada possível em um jogo parecido com Bejeweled que corresponderá a três ou mais letras, como esta (observe a capital Be C):

fbcfbee
ffcabbe
deBCeec
bccabbe
edcfbcd
daeaafc
eebcbeb

Especificações completas:

  • A entrada será ncomposta por linhas de nletras minúsculas cada (onde npode haver qualquer número).
  • A saída será a melhor jogada que você poderia fazer em um jogo de combinação 3, com as duas letras que você deseja trocar em maiúsculas.
  • As correspondências devem ter a seguinte prioridade (nesses exemplos, .indica um quadrado que não importa):

    1. Cinco em linha

      xxYxx
      ..X..
      
    2. Cinco em linha quebrada

      X..
      Yxx
      x..
      x..
      

      ou

      .X.
      xYx
      .x.
      .x.
      
    3. Quatro em linha

      xYxx
      .X..
      
    4. Três em linha

      xYx
      .X.
      

    Você deve encontrar a correspondência da prioridade mais alta e produzi-la.

  • Se houver várias correspondências da mesma prioridade, você poderá produzir qualquer uma delas.
  • Sempre haverá pelo menos uma correspondência (seu programa pode interromper se não houver correspondências ou fazer o que você quiser).
  • A E / S pode estar em qualquer formato razoável (stdin / out, arquivos de leitura e gravação, argumentos de função / valores de retorno, caixas de diálogo etc.), mas NÃO codificado (como x="[insert input here]").
  • Este é o pelo que o código mais curto em bytes vence. Se você usar algum acesso à rede por algum motivo, todos os bytes baixados da rede serão contabilizados na sua pontuação.

1
+1, mas eu protesto o título; poderia haver uma jogada melhor. Por exemplo, um que cria dois cincos ou um que causa uma queda para criar mais coisas.
Justin Justin

A quebra de cinco em linha também cobre ..x.\nxxYX\n..x.?
Peter Taylor

@ Peter Sim, ele faz.
Maçaneta

Existem 2 padrões quebrados de 5 em linha: o padrão L e o padrão T. Você precisa que ambos sejam correspondidos?
precisa saber é o seguinte

@ nhahtdh Sim, vou editar para esclarecer isso.
Maçaneta

Respostas:


2

Python3.4, 772

(Usando guias para recuo, em vez de espaços.)

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])

Em vez de [c for c in l], você poderia simplesmente fazer list(l).
Maçaneta

Use (i, j) em (F, T) em vez de duas comparações - 778
Austin Hastings

F = (i, j) -> F = i, j. Deglobalize 2 r / o syms - 770
Austin Hastings

Corrigido o erro: broken-5 não deve bater true-5.
Austin Hastings
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.