「マッチ3」ゲームですぐに最高の動きを見つける


11

今日の課題は、次のような入力を行うことです。

fbcfbee
ffcabbe
debceec
bccabbe
edcfbcd
daeaafc
eebcbeb

そして、出力のように(資本金に注意し、三個の以上の文字にマッチします宝石をちりばめたようなゲームで可能な限り最高の動きBC)を:

fbcfbee
ffcabbe
deBCeec
bccabbe
edcfbcd
daeaafc
eebcbeb

完全な仕様:

  • 入力は、それぞれ小文字のn行ですnn任意の数字を使用できます)。
  • 出力は、マッチ3ゲームで行うことができる最高の動きになり、スワップしたい2文字を大文字にします。
  • 一致には次の優先順位が必要です(これらの例で.は、重要でない正方形を示します)。

    1. 五行

      xxYxx
      ..X..
      
    2. 壊れた五行

      X..
      Yxx
      x..
      x..
      

      または

      .X.
      xYx
      .x.
      .x.
      
    3. 四列

      xYxx
      .X..
      
    4. 三列

      xYx
      .X.
      

    最も高い優先度の一致を見つけて出力する必要があります。

  • 同じ優先度の一致が複数ある場合は、それらのいずれかを出力できます。
  • 常に少なくとも1つの一致が存在します(一致しない場合、または必要な操作を行うとプログラムが中断する可能性があります)。
  • I / Oは、任意の妥当な形式(stdin / out、ファイルの読み取りと書き込み、関数の引数/戻り値、ダイアログボックスなど)にすることができますが、ハードコードされていません(などx="[insert input here]")。
  • これはので、バイト単位の最短コードが優先されます。何らかの理由でネットワークアクセスを使用すると、ネットワークからダウンロードされたすべてのバイトがスコアにカウントされます。

1
+1、しかしタイトルに抗議します。より良い動きがあるかもしれません。たとえば、2つの5を作成するものや、ドロップにより多くのものを作成するものがあります。
ジャスティン14年

壊れた五行もカバーし..x.\nxxYX\n..x.ますか?
ピーターテイラー14年

@Peterはい、そうです。
ドアノブ

行パターンには、LパターンとTパターンの2つの壊れた5があります。両方を一致させる必要がありますか?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

@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)
ドアノブ

代わりに、2の(F、T)での使用は、(i、j)の比較- 778
オースティンヘイスティングス

F =(i、j)-> F = i、j シムズO Deglobalize 2 R / - 770
オースティンヘイスティングス

修正されたバグ:broken-5はtrue-5に勝てないはずです。
オースティンヘイスティングス14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.