Go kartında hareket etme


13

Bir Go oyunu için bir tahta pozisyonu ve oynama hamlesi verilir. Hareketin yasal olup olmadığını ve yeni kurulun yasal olması durumunda çıkmanız gerekir.

Go hamlelerinin kısa bir açıklaması: Oyun alternatif olarak siyah ve beyaz parçaları ("taşlar") kare bir tahtada boş yerlere yerleştirmekten oluşur. Birbirine bağlı (4-yollu) aynı renkteki parçalara grup denir. Tahta üzerinde bir gruba bitişik boş alanlar (ayrıca 4 yönlü) o grubun "özgürlükleri" olarak kabul edilir. Özgürlüğü 0 olan bir grup yakalanır (tahtadan çıkarılır). Kendi grubunun ele geçirilmesine neden olacak bir hareket ("intihar"), bir veya daha fazla rakibin grubunu ele geçirmedikçe (süreçte özgürlükler kazanması için fiilen yakalanmaması) yasadışıdır.

İlgili olanlar için, ko (ve superko) ile uğraşmanıza gerek yoktur, yani bir ko yakalamanın yasal olduğunu varsayabilirsiniz. Bunun ne anlama geldiğini bilmiyorsanız, yukarıdaki kuralları izlemeniz yeterlidir.

Girdi: tahta boyutunu temsil eden 2 ile 19 (dahil) arasında bir sayı, ardından tahta konumunu temsil eden 0 ile 2 (dahil) arasında n sayıda n satırı ve ardından yapılacak hareketi temsil eden boşlukla ayrılmış 3 sayı gelir. Tahta konumunda, 0 boş yer, 1 siyah taş ve 2 beyaz taş anlamına gelir. Hareket, taşın sütununu, sırasını ve rengini (1 veya 2) verir. Sütun ve satır 0 tabanlıdır, 0 ila n-1 (dahil) arasındadır ve kart girişi ile aynı sırada sayılır.

Verilen yönetim kurulu pozisyonunun yasal olduğunu varsayabilirsiniz (tüm grupların en az bir özgürlüğü vardır).

Çıktı: taşıma yasalsa veya değilse, 1 veya 0 (veya isterseniz doğru / yanlış) içeren bir satır, onu (yalnızca yasal bir hamle durumunda) girişle aynı formatta takip edin.

Puan: Tüm kaynak kodun bayt sayısı, daha küçüktür. Ascii olmayan karakterlerin kullanımı için% 20 ek ceza ve kodunuz serbestçe kullanılabilir yazılım kullanılarak Linux'ta test edilemezse% 20 ek ceza.

Kurallar: Ağ bağlantısı ve 3. taraf kitaplığı yok. Programınız standart giriş ve çıkış akışlarını veya programlama diliniz için standart eşdeğerini kullanmalıdır.

Örnekler:

1) Input:

2
10
01
1 0 2

Output:

0

2) Input:

2
10
11
1 0 2

Output:

1
02
00

3) Input:

5
22122
22021
11211
02120
00120
2 1 1

Output:

1
00100
00101
11011
02120
00120

4) Input:

6
000000
011221
121121
122221
011110
000000
4 0 1

Output:

1
000010
011221
121121
122221
011110
000000

Yanıtlar:


2

Python 3 (557 504 488)

import sys
s=sys.stdin
M=int(next(s))+1
j=Z=M*M-M
S=s.read(Z)
P=0
b=[0]*3
while j>0:j-=1+(j%M<1);b[int(S[j])]|=1<<j;P|=1<<j
N=lambda x:(x<<1|x>>1|x<<M|x>>M)&P&~x
def h(a,b):t=a|N(a)&b;return h(t,b)if t!=a else a
c,r,m=map(int,next(s).split())
o=m%2+1
p=1<<M*r+c
b[m]|=p
for n in(p<<1,p>>1,p<<M,p>>M):
 e=h(n&P,b[o])
 if~b[m]&N(e)<1<=n&b[o]:b[o]&=~e
_,B,W=b
g=~b[o]&N(h(p,b[m]))>=1>~_&p
print(+g)
q=''
while j<Z:
 r=1<<j
 if g*j%M>M-2:print(q);q=''
 else:q+='012E'[(r&B>0)+(r&W>0)*2]
 j+=1

Tahtayı temsil etmek için 3 bit alanı kullanır - her biri siyah, beyaz ve boş alanlar için. Bulma komşularını yapar Nve zincir hişlemlerini çok özlü hale getirir .

Çok sayıda yorum içeren ungolfed sürümü: https://gist.github.com/airfrog/8429006


Bir var LOT her satırın sonunda boşluk, dosya bunu 2732 bayt vardır yayınlanmıştır olarak.
aditsu bıraktı çünkü SE EVIL

@aditsu Şimdi düzeltilmesi gerekiyor
airfrog

Boyutu hala yanlış, şimdi 555 olmalı :) Ayrıca hala daha fazla noktalı virgül kullanarak birkaç bayt kaydedip kaydedemeyeceğinizi merak ediyorum.
aditsu bıraktı çünkü SE EVIL

Hata? Girdi: 6 000000 011221 121121 122221 011110 000000 4 0 1Çıktı: 0. Şimdi örnek 4 olarak eklendi.
SE, EVIL

Bu hata düzeltildi, ben de golf yaparken bir örnek olarak eklemek isteyebilirsiniz başka bir hata bulundu ve düzeltildi. Girdi: 5 22100 20211 12211 12120 01120 1 1 2Çıktı 0 olmalıdır.
airfrog

2

Python ( 912 1004)

def o():
 n=int(raw_input(''))
 i=[raw_input('') for r in range(n+1)]
 b=[map(int,list(r)) for r in i[:n]]
 u,v,w=map(int,i[n].split(' '))
 if b[v][u]!=0:return 0
 b[v][u]=w
 if w==1:q=2
 elif w==2:q=1
 else:return 0
 f=[[],[],[]]
 h=[[],[],[]]
 g=[range(z*n,(z+1)*n) for z in range(n)]
 d=[(1,0),(-1,0),(0,1),(0,-1)]
 m=lambda z:max(0,min(n-1,z))
 t=[0,1,2,0,1]
 for j,s in enumerate(t):
  for r in range(n):
   for c in range(n):
    for y,x in map(lambda p:(m(r+p[0]),m(c+p[1])),d):
     if s==0:
      if b[y][x]==b[r][c]:
       if g[y][x]!=min(g[y][x],g[r][c]):
        t.insert(j+1,0)
       g[y][x]=g[r][c]=min(g[y][x],g[r][c])
     elif s==1:
      if g[r][c] not in h[b[r][c]]:
       h[b[r][c]].append(g[r][c])
      if b[y][x]==0 and g[r][c] not in f[b[r][c]]:
       f[b[r][c]].append(g[r][c])
    if s==2:
     if b[r][c]==q and g[r][c] not in f[b[r][c]]:
      b[r][c]=0
 h[w].sort()
 f[w].sort()
 if h[w]!=f[w]:return 0
 return "1\n"+'\n'.join([''.join(map(str,r)) for r in b])
print o()

İçinden ilerleyin: girdiyi ayrıştırın, hareketin boş bir noktada olup olmadığını kontrol edin, hareket ettirin, "grup" ızgarasını başlatın, bitişik taşların rengini (s = 0) kontrol ederek grup ızgarasını basitleştirin / en aza indirin ve tamamen minimize edilene kadar tekrarlayın , kontrol edin grup özgürlükleri (s = 1) için, özgürlüğü olmayan gruplar (s = 2) için rakip taşları kaldırın, s = 0 ve s = 1 tekrarlayın, tüm oyuncu gruplarının özgürlükleri olup olmadığını kontrol edin, sonucu döndürün.

Bu muhtemelen önemli ölçüde kısaltılabilir ...

Etkileşimli Örnek:

2
10
01
1 0 2
0

2
10
11
1 0 2
1
02
00

5
22122
22021
11211
02120
00120
2 1 1
1
00100
00101
11011
02120
00120

6
000000
011221
121121
122221
011110
000000
4 0 1
1
000010
011221
121121
122221
011110
000000

1
Programınız hiçbir şey yapmaz, sadece bir işlevi tanımlar.
aditsu bırakıldı çünkü SE kötü 5

Etkileşimli olarak çalıştırın ve örnek çalıştırmada gösterildiği gibi baskı o () ile çağırın ...
jur

Hayır! Komut satırından çalıştırdığınız bağımsız bir program olması gerekir. Ayrıca, bu da kısaltır.
aditsu bıraktı çünkü SE EVIL

Son satıra o () ekleyerek düzeltildi
jur

Neden sadece işlev gövdesini (eski) kullanmıyorsunuz? Ve yeni eklenen örnek 4'te de başarısız olduğunu düşünüyorum.
aditsu çıkmak SE çünkü EVIL
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.