ค้นหาความเคลื่อนไหวที่ดีที่สุดในเกม "จับคู่ 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.
      

    คุณจะต้องค้นหาการจับคู่ของลำดับความสำคัญสูงสุดและส่งออก

  • หากมีการจับคู่ที่มีลำดับความสำคัญเท่ากันหลายรายการคุณสามารถส่งออกรายการใดรายการหนึ่งได้
  • จะมีการแข่งขันอย่างน้อยหนึ่งครั้งเสมอ (โปรแกรมของคุณสามารถแตกถ้าไม่มีการแข่งขันหรือทำอะไรก็ได้ที่คุณต้องการ)
  • I / O สามารถอยู่ในรูปแบบที่เหมาะสม (stdin / out, การอ่านและการเขียนไฟล์, ข้อโต้แย้งการทำงาน / ค่าส่งคืน, กล่องโต้ตอบ, ฯลฯ ) แต่ไม่ฮาร์ดโค้ด (เช่นx="[insert input here]")
  • นี่คือสั้นที่สุดในหน่วยไบต์ หากคุณใช้การเข้าถึงเครือข่ายด้วยเหตุผลบางอย่างไบต์ทั้งหมดที่ดาวน์โหลดจากเครือข่ายจะนับรวมกับคะแนนของคุณ

1
+1 แต่ฉันประท้วงชื่อเรื่อง อาจมีการเคลื่อนไหวที่ดีขึ้น ตัวอย่างเช่นสิ่งที่สร้างสองห้าหรือหนึ่งที่ทำให้การวางเพื่อสร้างสิ่งเพิ่มเติม
Justin

ห้าในแถวที่แตกก็ครอบคลุม..x.\nxxYX\n..x.หรือไม่
Peter Taylor

@Peter ใช่มันเป็นเช่นนั้น
Doorknob

รูปแบบของแถวมี 2 อันที่แตก 5: รูปแบบ L และรูปแบบ T คุณต้องการจับคู่ทั้งสองหรือไม่
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@nhahtdh ใช่ฉันจะแก้ไขให้ชัดเจน
Doorknob

คำตอบ:


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

ใช้ (i, j) ใน (F, T) แทนการเปรียบเทียบสองแบบ - 778
Austin Hastings

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

แก้ไขข้อผิดพลาด: หัก -5 ไม่ควรชนะจริง -5
Austin Hastings
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.