Di chuyển trên một bảng đi


13

Bạn được trao một vị trí bảng cho trò chơi cờ vây và di chuyển để chơi. Bạn cần đưa ra liệu di chuyển có hợp pháp hay không, và vị trí hội đồng quản trị mới nếu đó là hợp pháp.

Một lời giải thích ngắn gọn về di chuyển Go: trò chơi bao gồm xen kẽ các mảnh màu đen và trắng ("đá") ở những chỗ trống trên một bảng vuông. Các tập hợp các mảnh có cùng màu được kết nối với nhau (4 chiều) được gọi là các nhóm. Các vị trí trống trên bảng liền kề với một nhóm (cũng là 4 chiều) được coi là "quyền tự do" của nhóm đó. Một nhóm có 0 tự do được bắt giữ (xóa khỏi bảng). Một động thái sẽ khiến nhóm của chính họ bị bắt ("tự sát") là bất hợp pháp, trừ khi họ đang bắt giữ một hoặc nhiều nhóm của đối thủ (đạt được tự do trong quá trình để nó không thực sự bị bắt).

Đối với những người quan tâm, bạn không cần phải đối phó với ko (và superko), tức là bạn có thể cho rằng việc bắt giữ ko là hợp pháp. Nếu bạn không biết điều đó có nghĩa là gì, chỉ cần làm theo các quy tắc trên và nó sẽ ổn thôi.

Đầu vào: một số n trong khoảng từ 2 đến 19 (đã bao gồm) đại diện cho kích thước bảng, theo sau là n dòng của n số từ 0 đến 2 (bao gồm) đại diện cho vị trí bảng, theo sau là 3 số cách nhau bởi khoảng trắng, đại diện cho việc di chuyển. Ở vị trí bảng, 0 có nghĩa là chỗ trống, 1 có nghĩa là đá đen và 2 có nghĩa là đá trắng. Việc di chuyển cho cột, hàng và màu (1 hoặc 2) của đá để đặt. Cột và hàng dựa trên 0, từ 0 đến n-1 (đã bao gồm) và được tính theo thứ tự giống như đầu vào bảng.

Bạn có thể giả định rằng vị trí hội đồng đã cho là hợp pháp (tất cả các nhóm có ít nhất một quyền tự do).

Đầu ra: một dòng chứa 1 hoặc 0 (hoặc đúng / sai nếu bạn thích) nếu di chuyển là hợp pháp hay không, theo sau (chỉ trong trường hợp di chuyển hợp pháp) bởi vị trí bảng mới có cùng định dạng với đầu vào.

Điểm: Số byte của mã nguồn hoàn chỉnh, nhỏ hơn là tốt hơn. Hình phạt bổ sung 20% ​​cho việc sử dụng các ký tự không phải mã ascii và 20% hình phạt bổ sung nếu mã của bạn không thể được kiểm tra trong Linux bằng phần mềm có sẵn miễn phí.

Quy tắc: Không có kết nối mạng và không có thư viện bên thứ 3. Chương trình của bạn nên sử dụng các luồng đầu vào và đầu ra tiêu chuẩn hoặc tương đương tiêu chuẩn cho ngôn ngữ lập trình của bạn.

Ví dụ:

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

Câu trả lời:


2

Con trăn 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

Sử dụng 3 bitfield để đại diện cho bảng - mỗi cái cho các khoảng trắng, trắng và trống. Làm cho các hàng xóm tìm thấy Nvà có được hhoạt động chuỗi rất súc tích.

Một phiên bản không có ý kiến ​​với rất nhiều ý kiến: https://gist.github.com/airfrog/8429006


Bạn có RẤT NHIỀU khoảng trắng ở cuối mỗi dòng, tệp khi bạn đăng nó có 2732 byte.
aditsu

@aditsu Điều đó nên được sửa ngay bây giờ
vé máy bay

Kích thước vẫn còn sai, nên là 555 ngay bây giờ :) Ngoài ra tôi tự hỏi nếu bạn vẫn có thể lưu một vài byte bằng cách sử dụng nhiều dấu chấm phẩy hơn.
aditsu

Bọ cánh cứng? Đầu vào: 6 000000 011221 121121 122221 011110 000000 4 0 1Đầu ra: 0. Đã thêm ngay bây giờ như ví dụ 4.
aditsu

Lỗi đó đã được sửa, tôi cũng đã tìm và sửa một lỗi khác trong khi chơi golf mà bạn có thể muốn thêm vào làm ví dụ. Đầu vào: 5 22100 20211 12211 12120 01120 1 1 2Đầu ra phải là 0.
vé máy bay

2

Con trăn ( 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()

Đi qua: phân tích cú pháp đầu vào, kiểm tra xem di chuyển có ở vị trí trống không, thực hiện di chuyển, khởi tạo lưới "nhóm", đơn giản hóa / thu nhỏ lưới nhóm bằng cách kiểm tra màu của các viên đá phụ (s = 0) và tiếp tục lặp lại cho đến khi nó được thu nhỏ hoàn toàn , kiểm tra đối với quyền tự do nhóm (s = 1), loại bỏ đá đối thủ cho các nhóm không có quyền tự do (s = 2), lặp lại s = 0 và s = ​​1, kiểm tra xem tất cả các nhóm người chơi có quyền tự do, kết quả trả về.

Điều này có lẽ có thể được rút ngắn đáng kể ...

Ví dụ tương tác chạy:

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
Chương trình của bạn không làm gì cả, nó chỉ xác định một chức năng.
aditsu

Chạy nó một cách tương tác và gọi nó bằng chữ in o () như trong ví dụ chạy ...
jud

Không. Nó được coi là một chương trình độc lập mà bạn chạy từ dòng lệnh. Bên cạnh đó, điều đó cũng sẽ làm cho nó ngắn hơn.
aditsu

Cố định nó bằng cách thêm o in () trên dòng cuối cùng
jur

Tại sao không chỉ sử dụng cơ thể chức năng (lỗi thời)? Và tôi nghĩ bạn cũng thất bại với ví dụ mới được thêm vào 4.
aditsu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.