ทำการย้ายบนกระดาน Go


13

คุณได้รับตำแหน่งกระดานสำหรับเกมโกและย้ายไปเล่น คุณต้องแสดงผลว่าการเคลื่อนไหวนั้นถูกกฎหมายหรือไม่และตำแหน่งบอร์ดใหม่หากถูกกฎหมาย

คำอธิบายโดยย่อเกี่ยวกับการเคลื่อนไหวของ Go: เกมประกอบด้วยการวางหมากขาวดำ ("หิน") ในที่ว่างบนกระดานสี่เหลี่ยม ชุดชิ้นส่วนที่มีสีเดียวกันซึ่งเชื่อมต่อกัน (4 ทิศทาง) เรียกว่ากลุ่ม สถานที่ว่างบนกระดานที่อยู่ติดกับกลุ่ม (เช่นเดียวกับ 4 ทาง) ถือเป็น "เสรีภาพ" ของกลุ่มนั้น กลุ่มที่มี 0 เสรีภาพจะถูกจับ (ลบออกจากกระดาน) การเคลื่อนไหวที่จะทำให้กลุ่มของตัวเองถูกจับ ("การฆ่าตัวตาย") ถือเป็นเรื่องผิดกฎหมายเว้นแต่ว่าจะทำการจับภาพกลุ่มของฝ่ายตรงข้ามตั้งแต่หนึ่งกลุ่มขึ้นไป (ได้รับเสรีภาพในกระบวนการ

สำหรับผู้ที่เกี่ยวข้องคุณไม่จำเป็นต้องจัดการกับ ko (และ superko) นั่นคือคุณสามารถสันนิษฐานได้ว่าการจับ ko นั้นถูกกฎหมาย หากคุณไม่ทราบว่าหมายถึงอะไรเพียงทำตามกฎด้านบนและจะใช้ได้

อินพุต:ตัวเลขระหว่าง 2 ถึง 19 (รวม) เป็นตัวแทนของขนาดกระดานตามด้วยหมายเลข n บรรทัดระหว่าง 0 และ 2 (รวม) เป็นตัวแทนตำแหน่งกระดานตามด้วยหมายเลข 3 คั่นด้วยช่องว่างแทนการย้ายที่จะทำ ในตำแหน่งกระดาน 0 หมายถึงที่ว่าง 1 หมายถึงหินสีดำและ 2 หมายถึงหินสีขาว การย้ายให้คอลัมน์แถวและสี (1 หรือ 2) ของหินที่จะวาง คอลัมน์และแถวเป็นแบบอิง 0 ตั้งแต่ 0 ถึง n-1 (รวมแล้ว) และนับตามลำดับเดียวกับอินพุตบอร์ด

คุณสามารถสันนิษฐานได้ว่าตำแหน่งของบอร์ดที่กำหนดนั้นถูกกฎหมาย (ทุกกลุ่มมีอย่างน้อยหนึ่งเสรีภาพ)

เอาท์พุท:บรรทัดที่มี 1 หรือ 0 (หรือจริง / เท็จหากคุณต้องการ) หากการย้ายถูกกฎหมายหรือไม่ตาม (เฉพาะในกรณีที่มีการย้ายกฎหมาย) ตามตำแหน่งบอร์ดใหม่ในรูปแบบเดียวกับอินพุต

คะแนน:จำนวนไบต์ของซอร์สโค้ดสมบูรณ์เล็กกว่าดีกว่า ปรับเพิ่มอีก 20% สำหรับการใช้อักขระที่ไม่ใช่ ASCII และการลงโทษเพิ่มเติม 20% หากรหัสของคุณไม่สามารถทดสอบใน Linux โดยใช้ซอฟต์แวร์ที่มีให้ฟรี

กฎ:ไม่มีการเชื่อมต่อเครือข่ายและไม่มีห้องสมุดของบุคคลที่สาม โปรแกรมของคุณควรใช้สตรีมอินพุตและเอาต์พุตมาตรฐานหรือเทียบเท่ามาตรฐานสำหรับภาษาการเขียนโปรแกรมของคุณ

ตัวอย่าง:

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

คำตอบ:


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

ใช้ 3 บิตฟิลด์เพื่อเป็นตัวแทนคณะกรรมการแต่ละอันมีพื้นที่สีดำขาวและว่างเปล่า ทำให้เพื่อนบ้านค้นหาNและได้รับhการดำเนินงานในเครือที่รัดกุมมาก

รุ่นที่ไม่ได้รับความนิยมพร้อมความคิดเห็นมากมาย: https://gist.github.com/airfrog/8429006


คุณมีช่องว่างจำนวนมากในตอนท้ายของแต่ละบรรทัดไฟล์ที่คุณโพสต์มีขนาด 2732 ไบต์
aditsu ออกจากเพราะ SE เป็นความชั่วร้าย

@aditsu นั่นควรได้รับการแก้ไขแล้ว
airfrog

ขนาดยังไม่ถูกต้องควรเป็น 555 ตอนนี้ :) ฉันยังสงสัยว่าคุณยังสามารถบันทึกได้สองสามไบต์โดยใช้เครื่องหมายอัฒภาคมากขึ้นหรือไม่
aditsu ออกจากเพราะ SE นั้นชั่วร้าย

ข้อผิดพลาด? อินพุต: 6 000000 011221 121121 122221 011110 000000 4 0 1เอาท์พุท: 0. เพิ่มตอนนี้เป็นตัวอย่าง 4
aditsu ออกเนื่องจาก SE เป็นความชั่วร้าย

ฉันพบและแก้ไขข้อผิดพลาดอื่นขณะเล่นกอล์ฟที่คุณอาจต้องการเพิ่มเป็นตัวอย่าง อินพุต: 5 22100 20211 12211 12120 01120 1 1 2เอาต์พุตควรเป็น 0
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()

เดินผ่าน: การแยกวิเคราะห์ตรวจสอบว่าการเคลื่อนไหวอยู่ในที่ว่างทำการย้ายเริ่มต้น "กลุ่ม" กริดลดความซับซ้อน / ลดกริดกลุ่มโดยการตรวจสอบสีของหิน adjacant (s = 0) และทำซ้ำจนกว่ามันจะลดลงอย่างเต็มที่ตรวจสอบ สำหรับกลุ่ม liberties (s = 1) ให้เอาก้อนหินของฝ่ายตรงข้ามออกสำหรับกลุ่มที่ไม่มี liberties (s = 2), ทำซ้ำ s = 0 และ s = 1, ตรวจสอบว่ากลุ่มผู้เล่นทุกคนมีเสรีภาพ, ส่งคืนผลลัพธ์

นี่อาจสั้นลงอย่างมาก ...

ตัวอย่างแบบโต้ตอบทำงาน:

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
โปรแกรมของคุณไม่ได้ทำอะไรมันแค่กำหนดฟังก์ชั่น
aditsu ออกจากเพราะ SE นั้นชั่วร้าย

เรียกใช้การโต้ตอบและเรียกว่าพิมพ์ o () ดังแสดงในตัวอย่างการทำงาน ...
Jur

Nope มันควรจะเป็นโปรแกรมแบบสแตนด์อโลนที่คุณเรียกใช้จากบรรทัดคำสั่ง นอกจากนี้นั่นก็จะทำให้สั้นลง
aditsu ออกจากเพราะ SE นั้นชั่วร้าย

แก้ไขได้โดยการเพิ่มการพิมพ์ o () ในบรรทัดสุดท้าย
jur

ทำไมไม่ลองใช้ฟังก์ชั่นฟังก์ชั่น (ล้าสมัย)? และฉันคิดว่าคุณล้มเหลวตัวอย่างที่เพิ่มเข้ามาใหม่ 4
aditsu ออกเพราะ SE นั้นชั่วร้าย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.