Trouvez le meilleur coup immédiat dans un jeu de «match-3»


11

Votre défi aujourd'hui est de recueillir des commentaires comme celui-ci:

fbcfbee
ffcabbe
debceec
bccabbe
edcfbcd
daeaafc
eebcbeb

Et produisez le meilleur coup possible dans un jeu de type Bejeweled qui correspondra à trois lettres ou plus, comme ceci (notez la capitale Bet C):

fbcfbee
ffcabbe
deBCeec
bccabbe
edcfbcd
daeaafc
eebcbeb

Spécifications complètes:

  • L'entrée sera constituée de nlignes de nlettres minuscules chacune (où npourrait être n'importe quel nombre).
  • La sortie sera le meilleur coup que vous puissiez faire dans un match-3, avec les deux lettres que vous souhaitez échanger en majuscule.
  • Les correspondances doivent avoir la priorité suivante (dans ces exemples, .indique un carré qui n'a pas d'importance):

    1. Cinq de suite

      xxYxx
      ..X..
      
    2. Cinq cassés de suite

      X..
      Yxx
      x..
      x..
      

      ou

      .X.
      xYx
      .x.
      .x.
      
    3. Quatre en ligne

      xYxx
      .X..
      
    4. Trois de suite

      xYx
      .X.
      

    Vous devez trouver la correspondance de la plus haute priorité et la produire.

  • S'il existe plusieurs correspondances de la même priorité, vous pouvez générer n'importe laquelle d'entre elles.
  • Il y aura toujours au moins une correspondance (votre programme peut s'arrêter s'il n'y a pas de correspondance ou faire ce que vous voulez).
  • Les E / S peuvent être dans n'importe quel format raisonnable (stdin / out, lecture et écriture de fichiers, arguments de fonction / valeurs de retour, boîtes de dialogue, etc.) mais PAS codées en dur (comme x="[insert input here]").
  • C'est le donc le code le plus court en octets gagne. Si vous utilisez un accès réseau pour une raison quelconque, tous les octets téléchargés à partir du réseau comptent pour votre score.

1
+1, mais je proteste contre le titre; il pourrait y avoir un meilleur mouvement. Par exemple, un qui crée deux cinq, ou un qui provoque une goutte pour créer plus de choses.
Justin

Est-ce que le cinq-en-ligne cassé couvre également ..x.\nxxYX\n..x.?
Peter Taylor

@Peter Oui, c'est vrai.
Poignée de porte

Il y a 2 5 cassés dans un modèle de ligne: le modèle L et le modèle T. Avez-vous besoin que les deux soient appariés?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@nhahtdh Oui, je vais modifier pour clarifier cela.
Poignée de porte

Réponses:


2

Python3.4, 772

(Utilisation des tabulations pour l'indentation, au lieu des espaces.)

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

Au lieu de [c for c in l], vous pouvez simplement le faire list(l).
Poignée de porte

Utilisez (i, j) dans (F, T) au lieu de deux comparaisons - 778
Austin Hastings

F = (i, j) -> F = i, j. Déglobaliser 2 symétries de r / o - 770
Austin Hastings

Correction d'un bug: broken-5 ne devait pas battre true-5.
Austin Hastings du
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.