Bir "maç-3" oyununda en iyi hamleyi bulun


11

Bugünkü zorluğunuz şu şekilde girdi almak:

fbcfbee
ffcabbe
debceec
bccabbe
edcfbcd
daeaafc
eebcbeb

Ve çıkış bu (sermaye not gibi, üç veya daha fazla harf maç olacak oyun benzeri Bejeweled bir mümkün olan en iyi hamle Bve C):

fbcfbee
ffcabbe
deBCeec
bccabbe
edcfbcd
daeaafc
eebcbeb

Tüm özellikler:

  • Giriş, her biri küçük harfli nsatırlar olacaktır n( nherhangi bir sayı olabilir).
  • Çıktı, bir eşleştirme-3 oyununda yapabileceğiniz en iyi hamle olacak ve değiştirmek istediğiniz iki harf büyük olacak.
  • Eşleşmeler aşağıdaki önceliğe sahip olmalıdır (bu örneklerde .önemli olmayan bir kareyi belirtir):

    1. Beş-in-a-satır

      xxYxx
      ..X..
      
    2. Arka arkaya kırık beş

      X..
      Yxx
      x..
      x..
      

      veya

      .X.
      xYx
      .x.
      .x.
      
    3. Dört-in-a-satır

      xYxx
      .X..
      
    4. Üç sıra üstüste

      xYx
      .X.
      

    En yüksek önceliğin eşleşmesini bulmalı ve çıktısını almalısınız.

  • Aynı önceliğe sahip birden fazla eşleşme varsa, bunlardan herhangi birini çıktı alabilirsiniz.
  • Her zaman en az bir eşleşme olacaktır (eşleşme yoksa programınız bozulabilir veya istediğiniz herhangi bir şey yapılabilir).
  • G / Ç herhangi bir makul biçimde (stdin / out, dosyaları okuma ve yazma, işlev bağımsız değişkenleri / dönüş değerleri, iletişim kutuları vb.) Olabilir ancak sabit kodlanmış DEĞİL (gibi x="[insert input here]").
  • Bu yani bayt en kısa kod kazanır. Herhangi bir nedenle herhangi bir ağ erişimi kullanırsanız, ağdan indirilen tüm baytlar puanınıza karşılık gelir.

1
+1, ama başlığı protesto ediyorum; daha iyi bir hamle olabilirdi. Örneğin, iki beşleme oluşturan biri veya daha fazla öğe oluşturmak için bir damlaya neden olan biri.
Justin

Arka arkaya kırık beşi de kapsıyor ..x.\nxxYX\n..x.mu?
Peter Taylor

@Peter Evet, var.
Kapı tokmağı

Bir sıra deseninde 2 kırık 5 vardır: L deseni ve T deseni. Her ikisinin de eşleştirilmesini istiyor musunuz?
26h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@nhahtdh Evet, bunu açıklığa kavuşturmak için düzenleyeceğim.
Kapı tokmağı

Yanıtlar:


2

Python3.4, 772

(Girintiler için boşluk yerine sekmeleri kullanma.)

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

Bunun yerine, [c for c in l]sadece yapabilirsin list(l).
Kapı tokmağı

İki karşılaştırmak yerine (F, T) 'de (i, j) kullanın - 778
Austin Hastings

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

Hata giderildi: kırık-5 gerçek-5'i geçmemelidir.
Austin Hastings
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.