Знайдіть найкращий негайний хід у грі «матч-3»


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.
      

    Ви повинні знайти відповідність з найвищим пріоритетом і вивести її.

  • Якщо є кілька збігів одного і того ж пріоритету, ви можете вивести будь-яку з них.
  • Завжди буде щонайменше один матч (ваша програма може розірватися, якщо немає відповідностей, або робити все, що завгодно).
  • Введення / виведення може бути у будь-якому розумному форматі (stdin / out, читання та запис файлів, аргументи функцій / повернення значень, діалогові вікна тощо), але НЕ жорстко кодується (як x="[insert input here]").
  • Це тому найкоротший код в байтах виграє. Якщо ви використовуєте будь-який доступ до мережі з якоїсь причини, всі байти, завантажені з мережі, рахуються з вашим рахунком.

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

Чи покривається також розбита п'ять в ряд ..x.\nxxYX\n..x.?
Пітер Тейлор

@Peter Так, це так.
Дверна ручка

Існує 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. Деглобалізуйте 2 р / о syms - 770
Austin Hastings

Виправлена ​​помилка: зламаний-5 не повинен бити правду-5.
Остін Гастінгс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.