Найдите лучший немедленный ход в игре «три в ряд»


11

Ваша задача сегодня состоит в следующем:

fbcfbee
ffcabbe
debceec
bccabbe
edcfbcd
daeaafc
eebcbeb

И выведите наилучший возможный ход в игре, подобной Bejeweled, которая будет соответствовать трем или более буквам, например так (обратите внимание на заглавную Bи C):

fbcfbee
ffcabbe
deBCeec
bccabbe
edcfbcd
daeaafc
eebcbeb

Полные технические характеристики:

  • Входными данными будут nстроки из nстрочных букв каждая (где nможет быть любое число).
  • Вывод будет лучшим ходом, который вы можете сделать в игре «матч-3», с двумя буквами, которые вы хотите поменять местами.
  • Совпадения должны иметь следующий приоритет (в этих примерах .указывается квадрат, который не имеет значения):

    1. Пять-в-ряд

      xxYxx
      ..X..
      
    2. Сломанный пять в ряд

      X..
      Yxx
      x..
      x..
      

      или же

      .X.
      xYx
      .x.
      .x.
      
    3. Четыре-в-ряд

      xYxx
      .X..
      
    4. Три-в-строке

      xYx
      .X.
      

    Вы должны найти совпадение с наивысшим приоритетом и вывести его.

  • Если есть несколько совпадений с одинаковым приоритетом, вы можете вывести любое из них.
  • Всегда будет хотя бы одно совпадение (ваша программа может прерваться, если совпадений нет, или делать все, что вы захотите).
  • Ввод / вывод может быть в любом приемлемом формате (стандартный ввод / вывод, чтение и запись файлов, аргументы функций / возвращаемые значения, диалоговые окна и т. Д.), Но НЕ может быть жестко закодирован (как x="[insert input here]").
  • Это поэтому выигрывает самый короткий код в байтах. Если по какой-либо причине вы используете какой-либо доступ к сети, все загруженные из сети байты засчитываются в ваш счет.

1
+1, но я протестую против названия; может быть лучший ход. Например, тот, который создает две пятерки, или тот, который вызывает падение, чтобы создать больше вещей.
Джастин

Разрывная пятерка в ряд также покрывает ..x.\nxxYX\n..x.?
Питер Тейлор

@ Петр Да, это так.
Ручка двери

В строке есть 2 разбитых 5: L-образный и T-образный. Вы требуете, чтобы оба соответствовали?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@nhahtdh Да, я отредактирую, чтобы уточнить это.
Ручка двери

Ответы:


2

Python3.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).
Дверная ручка

Используйте (i, j) в (F, T) вместо двух сравнений - 778
Остин Гастингс

F = (i, j) -> F = i, j. Deglobalize 2 r / o syms - 770
Остин Гастингс

Исправлена ​​ошибка: битый-5 не должен бить истинный-5.
Остин Гастингс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.