이동 보드에서 이동


13

당신은 Go 게임을 위한 보드 포지션 과 플레이 할 움직임이 있습니다. 이동이 합법적인지 여부와 합법적 인 경우 새 보드 위치를 출력해야합니다.

Go 이동에 대한 간단한 설명 : 게임은 사각 보드의 빈 공간에 흑백 조각 ( "돌")을 번갈아 배치하는 것으로 구성됩니다. 서로 연결된 동일한 색상의 조각 세트 (4 방향)를 그룹이라고합니다. 그룹에 인접한 보드의 빈 곳 (4 방향)은 해당 그룹의 "자유"로 간주됩니다. 자유가 0 인 그룹이 캡처됩니다 (보드에서 제거됨). 자신의 그룹을 캡처하게하는 ( "자살") 이동은 하나 이상의 상대방 그룹을 캡처하지 않는 한 (불법 프로세스에서 자유를 얻으므로 실제로 캡처되지는 않음) 불법입니다.

관심있는 사람들을 위해 ko (및 superko)를 다룰 필요가 없습니다. 즉, ko 캡처가 합법적이라고 가정 할 수 있습니다. 그 의미를 모르는 경우 위의 규칙을 따르십시오.

입력 : 보드 크기를 나타내는 2와 19 사이의 숫자 n (포함), 보드 위치를 나타내는 0과 2 사이의 n 숫자의 n 라인 (공백), 공백으로 구분 된 3 개의 숫자가 뒤 따르는 이동을 나타냅니다. 보드 위치에서 0은 빈 장소를, 1은 검은 돌을, 2는 흰 돌을 의미합니다. 이 움직임은 돌의 기둥, 줄 및 색 (1 또는 2)을 나타냅니다. 열과 행은 0부터 시작하여 0부터 n-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

파이썬 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


당신은이 LOT 각 행의 끝 부분에 공간을, 파일은 당신은 2732 바이트를 가지고 게시한다.
SE가 EVIL이기 때문에 Aditsu 종료

@aditsu 지금
고쳐야합니다

크기가 여전히 잘못되었습니다. 지금 555가되어야합니다 :) 또한 더 많은 세미콜론을 사용하여 몇 바이트를 저장할 수 있는지 궁금합니다.
SE가 EVIL이기 때문에 Aditsu 종료

곤충? 입력 : 6 000000 011221 121121 122221 011110 000000 4 0 1출력 : 0. 이제 예제 4로 추가되었습니다.
SE가 EVIL이기 때문에 aditsu quit

그 버그는 수정되었으며, 골프를 치는 동안 다른 버그를 찾아 수정하여 예제로 추가 할 수도 있습니다. 입력 : 5 22100 20211 12211 12120 01120 1 1 2출력은 0이어야합니다.
airfrog

2

파이썬 ( 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 종료

예제 실행에서와 같이 대화식으로 실행하고 print o ()로 호출하십시오.
jur

아니. 명령 행에서 실행하는 독립형 프로그램이어야합니다. 게다가, 그것은 또한 짧아 질 것입니다.
SE가 EVIL이기 때문에 Aditsu 종료

마지막 줄에 print o ()를 추가하여 수정
jur

함수 본문을 사용하지 않는 이유는 무엇입니까? 그리고 새로 추가 한 예제 4도 실패한다고 생각합니다.
SE가 EVIL이기 때문에 aditsu 종료
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.