在“三消”游戏中找到最佳即时动作


11

今天的挑战是要像这样输入信息:

fbcfbee
ffcabbe
debceec
bccabbe
edcfbcd
daeaafc
eebcbeb

并在类似“宝石迷阵”的游戏中输出可能的最佳动作,该动作将匹配三个或更多字母,如下所示(请注意大写字母BC):

fbcfbee
ffcabbe
deBCeec
bccabbe
edcfbcd
daeaafc
eebcbeb

完整规格:

  • 输入将是每nn小写字母(n可以是任何数字)。
  • 输出将是您在三消游戏中可以采取的最佳举措,其中两个您想交换的字母都大写。
  • 匹配项应具有以下优先级(在这些示例中,.表示无关紧要的正方形):

    1. 一排五

      xxYxx
      ..X..
      
    2. 断五行

      X..
      Yxx
      x..
      x..
      

      要么

      .X.
      xYx
      .x.
      .x.
      
    3. 四排

      xYxx
      .X..
      
    4. 三排

      xYx
      .X.
      

    您必须找到最高优先级的匹配并输出。

  • 如果存在多个具有相同优先级的匹配项,则可以输出其中任何一个。
  • 总会有至少一场比赛(如果没有比赛,或者您想做任何事情,您的程序可能会中断)。
  • I / O可以采用任何合理的格式(stdin / out,读写文件,函数自变量/返回值,对话框等),但不可以进行硬编码(如x="[insert input here]")。
  • 这是因此以字节为单位的最短代码获胜。如果您出于某种原因使用任何网络访问,则从网络下载的所有字节都将计入您的分数。

1
+1,但我抗议标题;可能会有更好的举动。例如,一个创造两个5,一个创造一个下降以创造更多东西的一个。
贾斯汀

破五行也能掩盖..x.\nxxYX\n..x.吗?
彼得·泰勒

@Peter是的,确实如此。
门把手

连续模式中有2个折断的5个:L模式和T模式。您是否要求两者都匹配?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2014年

@nhahtdh是的,我将进行编辑以澄清这一点。
门把手

Answers:


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)in(F,T)代替两个比较-778
奥斯丁·黑斯廷斯

F =(i,j)-> F = i,j 取消全球化2个r / o符号-770
奥斯汀·黑斯廷斯

修复了错误:破5不能超过真5。
奥斯丁·黑斯廷斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.