Goボードで動きます


13

Goゲームのボードポジションとプレイの動きが与えられます。移動が合法であるかどうか、合法である場合は新しいボードの位置を出力する必要があります。

Goの動きの簡単な説明:ゲームは、正方形のボードの空いている場所に黒と白のピース(「ストーン」)を交互に配置することで構成されています。互いに接続されている同じ色の部分のセット(4方向)はグループと呼ばれます。グループに隣接する空の場所(4方向)は、そのグループの「自由」と見なされます。自由度が0のグループがキャプチャされます(ボードから削除されます)。1つ以上の敵のグループをキャプチャしない限り、自身のグループをキャプチャする(「自殺」)移動は、違法です(実際にキャプチャされないようにプロセスで自由を得ます)。

関係者にとっては、ko(およびsuperko)に対処する必要はありません。つまり、koキャプチャは合法であると想定できます。それが何を意味するのかわからない場合は、上記のルールに従うだけで問題ありません。

入力:ボードサイズを表す2から19までの数字n、それに続くボード位置を表す0から2までのn数字のn行、スペースで区切られた3つの数字、続く移動を表します。ボードの位置では、0は空の場所、1は黒い石、2は白い石を意味します。この移動により、配置する石の列、行、および色(1または2)が得られます。列と行は0から始まり、範囲は0〜n-1(両端を含む)で、ボード入力と同じ順序でカウントされます。

与えられた役員の地位は合法であると仮定できます(すべてのグループには少なくとも1つの自由があります)。

出力:移動が合法であるかどうかに応じて1または0(または必要に応じてtrue / false)を含む行に続いて(合法的な移動の場合のみ)入力と同じ形式で新しいボード位置が続きます。

スコア:完全なソースコードのバイト数。小さいほど良い。非ASCII文字を使用した場合は20%の追加ペナルティ、無料で入手できるソフトウェアを使用してLinuxでコードをテストできない場合は20%の追加ペナルティ。

ルール:ネットワーク接続もサードパーティライブラリもありません。プログラムは、標準の入力および出力ストリーム、またはプログラミング言語に相当する標準を使用する必要があります。

例:

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つのビットフィールドを使用します-黒、白、空のスペースにそれぞれ1つ。近隣Nを検索し、チェーンh操作を非常に簡潔にします。

たくさんのコメントが付いた、無料版:https ://gist.github.com/airfrog/8429006


あなたが持っているLOT各行の末尾にスペースを、ファイルがあなたはそれが2732バイトを持って掲載さ。
SEは悪であるためaditsuは終了

現在は修正されなければならない@aditsu
airfrog

サイズはまだ間違っています、今は555になっているはずです:)また、さらにセミコロンを使用して数バイトを節約できるかどうかも疑問に思います。
SEがEVILであるため、aditsuは終了します

バグ?入力:6 000000 011221 121121 122221 011110 000000 4 0 1出力:0例4として、今追加しました
SEは悪であるため、aditsuは終了

そのバグは修正されました。ゴルフ中に、例として追加したい別のバグも見つけて修正しました。入力: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()

ウォークスルー:入力を解析し、移動が空の場所にあるかどうかを確認し、移動し、「グループ」グリッドを初期化し、隣接する石の色をチェックしてグループグリッドを単純化/最小化し(s = 0)、完全に最小化されるまで繰り返します、チェックグループの自由(s = 1)の場合、自由のないグループ(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
プログラムは何もせず、関数を定義するだけです。
SEがEVILであるため、Aditsuは終了します

...例の実行に示すように)対話的にそれを実行し、(Oプリントでそれを呼び出す
JUR

いや。コマンドラインから実行するスタンドアロンプ​​ログラムであることが想定されています。それに、それはまた短くなります。
SEがEVILであるため

最後の行に印刷O()を追加することによって、それを修正
JUR

関数本体(アウトデント)を使用しないのはなぜですか?そして、私はあなたにも、新たに追加された例4を失敗だと思う
SEは悪であるため、aditsuはやめ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.