Finden Sie den besten Sofortzug in einem „Match-3“ -Spiel

11

Ihre heutige Herausforderung besteht darin, folgende Beiträge zu leisten:

fbcfbee
ffcabbe
debceec
bccabbe
edcfbcd
daeaafc
eebcbeb

Und geben Sie den bestmöglichen Zug in einem Bejeweled-ähnlichen Spiel aus, das drei oder mehr Buchstaben wie folgt enthält (beachten Sie das Großbuchstaben Bund C):

fbcfbee
ffcabbe
deBCeec
bccabbe
edcfbcd
daeaafc
eebcbeb

Vollständige Spezifikationen:

  • Die Eingabe besteht aus nZeilen mit jeweils nKleinbuchstaben (wobei neine beliebige Zahl sein kann).
  • Die Ausgabe ist der beste Zug, den Sie in einem Match-3-Spiel machen können, wobei die beiden Buchstaben, die Sie tauschen möchten, groß geschrieben werden.
  • Übereinstimmungen sollten die folgende Priorität haben (in diesen Beispielen wird .ein Quadrat angezeigt, das keine Rolle spielt):

    1. Fünf in einer Reihe

      xxYxx
      ..X..
      
    2. Fünf in einer Reihe gebrochen

      X..
      Yxx
      x..
      x..
      

      oder

      .X.
      xYx
      .x.
      .x.
      
    3. Vier in einer Reihe

      xYxx
      .X..
      
    4. Drei in einer Reihe

      xYx
      .X.
      

    Sie müssen die Übereinstimmung mit der höchsten Priorität finden und ausgeben.

  • Wenn mehrere Übereinstimmungen mit derselben Priorität vorhanden sind, können Sie eine davon ausgeben.
  • Es wird immer mindestens eine Übereinstimmung geben (Ihr Programm kann unterbrochen werden, wenn keine Übereinstimmungen vorhanden sind, oder Sie können alles tun, was Sie wollen).
  • E / A kann in jedem vernünftigen Format (Standard / Ausgabe, Lesen und Schreiben von Dateien, Funktionsargumente / Rückgabewerte, Dialogfelder usw.) vorliegen, jedoch NICHT fest codiert (wie x="[insert input here]").
  • Dies ist so dass der kürzeste Code in Bytes gewinnt. Wenn Sie aus irgendeinem Grund einen Netzwerkzugriff verwenden, werden alle vom Netzwerk heruntergeladenen Bytes auf Ihre Punktzahl angerechnet.
Türknauf
quelle
1
+1, aber ich protestiere gegen den Titel; es könnte einen besseren Zug geben. Zum Beispiel eine, die zwei Fünfer erstellt, oder eine, bei der ein Tropfen mehr Material erstellt.
Justin
Deckt gebrochenes fünf in einer Reihe auch ab ..x.\nxxYX\n..x.?
Peter Taylor
@ Peter Ja, das tut es.
Türknauf
Es gibt 2 gebrochene 5 in einem Reihenmuster: das L-Muster und das T-Muster. Müssen beide übereinstimmen?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
@nhahtdh Ja, ich werde bearbeiten, um das zu klären.
Türknauf

Antworten:

2

Python3.4, 772

(Verwenden von Tabulatoren zum Einrücken anstelle von Leerzeichen.)

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])
Austin Hastings
quelle
Stattdessen [c for c in l]könnten Sie einfach tun list(l).
Türknauf
Verwenden Sie (i, j) in (F, T) anstelle von zwei Vergleichen - 778
Austin Hastings
F = (i, j) -> F = i, j. Deglobalize 2 r / o syms - 770
Austin Hastings
Behobener Fehler: Breaked-5 sollte True-5 nicht schlagen.
Austin Hastings