Znajdź najlepszy natychmiastowy ruch w grze „dopasuj 3”


11

Twoim wyzwaniem jest dziś:

fbcfbee
ffcabbe
debceec
bccabbe
edcfbcd
daeaafc
eebcbeb

I uzyskaj najlepszy możliwy ruch w grze podobnej do Bejeweled, która będzie pasować do trzech lub więcej liter, takich jak ten (zwróć uwagę na wielką Bi C):

fbcfbee
ffcabbe
deBCeec
bccabbe
edcfbcd
daeaafc
eebcbeb

Pełna specyfikacja:

  • Wprowadzane będą nwiersze z nmałymi literami (gdzie nmoże być dowolna liczba).
  • Wynik będzie najlepszym ruchem, jaki możesz wykonać w grze typu „dopasuj 3”, z dwiema literami, które chcesz zamienić na wielkie litery.
  • Mecze powinny mieć następujący priorytet (w tych przykładach .wskazuje kwadrat, który nie ma znaczenia):

    1. Pięć z rzędu

      xxYxx
      ..X..
      
    2. Złamany pięć z rzędu

      X..
      Yxx
      x..
      x..
      

      lub

      .X.
      xYx
      .x.
      .x.
      
    3. Cztery z rzędu

      xYxx
      .X..
      
    4. Trzy z rzędu

      xYx
      .X.
      

    Musisz znaleźć dopasowanie o najwyższym priorytecie i wygenerować je.

  • Jeśli istnieje wiele dopasowań o tym samym priorytecie, możesz wyprowadzić dowolny z nich.
  • Zawsze będzie co najmniej jedno dopasowanie (twój program może się zepsuć, jeśli nie ma żadnych dopasowań lub zrobić coś, co chcesz).
  • Wejścia / wyjścia mogą być w dowolnym rozsądnym formacie (standardowe wejście / wyjście, odczyt i zapis plików, argumenty funkcji / zwracane wartości, okna dialogowe itp.), Ale NIE na sztywno (jak x="[insert input here]").
  • To jest więc wygrywa najkrótszy kod w bajtach. Jeśli z jakiegoś powodu korzystasz z dostępu do sieci, wszystkie bajty pobrane z sieci liczą się do twojego wyniku.

1
+1, ale protestuję przeciwko tytułowi; może być lepszy ruch. Na przykład taki, który tworzy dwa piątki lub taki, który powoduje, że drop tworzy więcej rzeczy.
Justin

Czy obejmuje również zepsute pięć w rzędzie ..x.\nxxYX\n..x.?
Peter Taylor

@Peter Tak, to prawda.
Klamka

Istnieją 2 łamane 5 w rzędzie: wzór L i wzór T. Czy chcesz dopasować oba elementy?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳

@nhahtdh Tak, zmienię, aby to wyjaśnić.
Klamka

Odpowiedzi:


2

Python3.4, 772

(Używanie tabulatorów do wcięcia zamiast spacji).

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

Zamiast tego [c for c in l]możesz po prostu zrobić list(l).
Klamka

Użyj (i, j) w (F, T) zamiast dwóch porównuje - 778
Austin Hastings

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

Naprawiony błąd: broken-5 nie powinien przekraczać wartości true-5.
Austin Hastings
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.