Fai una mossa su una tavola Go


13

Ti viene data una posizione sul tabellone per una partita Go e una mossa per giocare. È necessario indicare se la mossa è legale o meno e la nuova posizione del consiglio se è legale.

Una breve spiegazione delle mosse di Go: il gioco consiste nel posizionare alternativamente pezzi bianchi e neri ("pietre") in posti vuoti su una tavola quadrata. Set di pezzi dello stesso colore che sono collegati tra loro (4 vie) sono chiamati gruppi. I posti vuoti sul tabellone che sono adiacenti a un gruppo (anche a 4 vie) sono considerati le "libertà" di quel gruppo. Viene catturato un gruppo con 0 libertà (rimosso dal tabellone). Una mossa che provocherebbe la cattura del proprio gruppo ("suicidio") è illegale, a meno che non stia catturando uno o più gruppi avversari (guadagnando libertà nel processo in modo che non sia effettivamente catturato).

Per gli interessati, non è necessario affrontare ko (e superko), ovvero è possibile ritenere che una cattura ko sia legale. Se non sai cosa significa, segui le regole sopra e andrà bene.

Input: un numero n compreso tra 2 e 19 (incluso) che rappresenta la dimensione della scacchiera, seguito da n righe di n numeri tra 0 e 2 (incluso) che rappresenta la posizione della scacchiera, seguito da 3 numeri separati da spazio, che rappresentano la mossa da effettuare. Nella posizione del tabellone, 0 significa posto vuoto, 1 significa pietra nera e 2 significa pietra bianca. La mossa fornisce la colonna, la riga e il colore (1 o 2) della pietra da posizionare. La colonna e la riga sono basate su 0, vanno da 0 a n-1 (incluso) e contano nello stesso ordine dell'input della scheda.

Puoi presumere che la posizione del consiglio di amministrazione sia legale (tutti i gruppi hanno almeno una libertà).

Output: una riga contenente 1 o 0 (o true / false se si preferisce) se la mossa è legale o meno, seguita (solo in caso di mossa legale) dalla nuova posizione della scacchiera nello stesso formato dell'input.

Punteggio: numero di byte del codice sorgente completo, più piccolo è meglio. 20% di penalità aggiuntiva per l'uso di caratteri non ascii e 20% di penalità aggiuntiva se il codice non può essere testato in Linux utilizzando software disponibile gratuitamente.

Regole: nessuna connessione di rete e nessuna libreria di terze parti. Il programma dovrebbe utilizzare i flussi di input e output standard o l'equivalente standard per il linguaggio di programmazione.

Esempi:

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

Risposte:


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

Utilizza 3 bitfield per rappresentare la scheda: uno ciascuno per gli spazi neri, bianchi e vuoti. Rende i vicini vicini Ne le hoperazioni a catena molto concise.

Una versione non golfata con molti commenti: https://gist.github.com/airfrog/8429006


Hai MOLTI spazi alla fine di ogni riga, il file che hai pubblicato ha 2732 byte.
Aditsu ha smesso perché SE è MALE

@aditsu Ora dovrebbe essere risolto
airfrog,

La dimensione è ancora errata, ora dovrebbe essere 555 :) Mi chiedo anche se puoi ancora salvare qualche byte usando più punti e virgola.
Aditsu ha smesso perché SE è MALE

Bug? Input: 6 000000 011221 121121 122221 011110 000000 4 0 1Output: 0. Aggiunto ora come esempio 4.
Aditsu ha chiuso perché SE è MALE

Quel bug è stato corretto, ho anche trovato e corretto un altro bug mentre lo giocavo a golf che potresti voler aggiungere come esempio. Input: L' 5 22100 20211 12211 12120 01120 1 1 2output dovrebbe essere 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()

Cammina attraverso: analizza input, controlla se la mossa è su un punto vuoto, fai mossa, inizia la griglia di "gruppo", semplifica / minimizza la griglia di gruppo controllando il colore delle pietre adiacenti (s = 0) e continua a ripetere fino a quando non è completamente minimizzata , controlla per le libertà di gruppo (s = 1), rimuovi le pietre avversarie per i gruppi senza libertà (s = 2), ripeti s = 0 e s = 1, controlla che tutti i gruppi di giocatori abbiano libertà, restituisci il risultato.

Questo può probabilmente essere abbreviato in modo significativo ...

Esecuzioni interattive di esempio:

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
Il tuo programma non fa nulla, definisce solo una funzione.
Aditsu ha smesso perché SE è MALE

Eseguilo interattivamente e chiamalo con print o () come mostrato nell'esempio run ...
jur

No. Dovrebbe essere un programma autonomo che si esegue dalla riga di comando. Inoltre, ciò renderebbe anche più breve.
Aditsu ha smesso perché SE è MALE

Risolto il problema aggiungendo print o () sull'ultima riga
Jur

Perché non usare semplicemente il corpo della funzione (obsoleto)? E penso che anche tu abbia fallito l'esempio appena aggiunto 4.
Aditsu ha smesso perché SE è MALE
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.