Segnare un gioco Go è un compito non troppo facile. In passato ci sono stati diversi dibattiti su come progettare regole per coprire tutti gli strani casi angolari che possono verificarsi. Fortunatamente, in questo compito non devi fare cose complicate come la vita o la morte o il rilevamento di seki. In questo compito, devi implementare un programma che segna un gioco secondo le regole di Tromp-Taylor senza Komi.
La procedura di punteggio è piuttosto semplice:
si dice che un punto P, non colorato C, raggiunga C, se esiste un percorso di punti adiacenti (verticalmente o orizzontalmente) del colore di P da P a un punto di colore C.
Il punteggio di un giocatore è il numero di punti del suo colore , oltre al numero di punti vuoti che raggiungono solo il suo colore.
Ad esempio, considera la seguente scheda. X
, O
E -
denotano nero, bianco e incolori intersezioni:
- - - X - O - - -
- - - X - O - - -
- - - X - O - - -
- - - X O - - O -
X X X O - O O - -
- - - X O - - O O
- - - X - O - - -
- - - X - O - X -
- - - - - O - - -
L'applicazione della regola di punteggio produce il seguente risultato. x
, o
E -
rappresentano le intersezioni non colorati che vengono conteggiati come nero, bianco e punti di nessuno.
x x x X - O o o o
x x x X - O o o o
x x x X - O o o o
x x x X O o o O o
X X X O o O O o o
- - - X O - - O O
- - - X - O - - -
- - - X - O - X -
- - - - - O - - -
Secondo il diagramma, il nero ha 23 punti, il bianco ha 29 punti di territorio. Pertanto, il tuo programma dovrebbe stampare W+6
per questa scheda.
Spero sia abbastanza chiaro in questo modo.
Ingresso e uscita
L'ingresso è una stringa che contiene esattamente n² dei caratteri X
, O
, -
dove n non è noto al momento della compilazione. Il programma dovrebbe ignorare tutti gli altri caratteri nel flusso di input. Il comportamento non è definito se non esiste un numero intero n tale che la quantità di XO-
caratteri sia uguale a n² . Si può presumere che n sia in [0, 255] .
La sequenza di caratteri deve essere interpretata come un Go-board di n righe e colonne. L'output è il valore assoluto della differenza della quantità totale di punti di bianco e nero nella rappresentazione decimale. Se il bianco ha più punti, ha il prefisso W+
, se il nero ha più punti è preceduto da B+
. Nel caso in cui entrambi i giocatori abbiano lo stesso numero di punti, l'output è Jigo
.
L'input deve essere letto in modo definito dall'implementazione. L'input potrebbe non far parte del codice sorgente.
Condizioni vincenti
Questo è code-golf. Si applicano le convenzioni convenzionali di code-golf. Vince l'invio con il minor numero di personaggi nella sua fonte. Solo i programmi che implementano pienamente le specifiche possono vincere.
Casi test
Ingresso:
- - - X - O - - -
- - - X - O - - -
- - - X - O - - -
- - - X O - - O -
X X X O - O O - -
- - - X O - - O O
- - - X - O - - -
- - - X - O - X -
- - - - - O - - -
Produzione: W+6
Ingresso:
Xavier is insane -- says Oliver
Produzione: Jigo
Inpout:
Code-Golf
Produzione: Jigo
Ingresso:
-XXXXXXX-XOOOOOOOXXO-OXXXOXXXOX--XOXXOOX
-
XOOXXOX--XOXXXOXXXO-OXXOOOOOOOX-XXXXXXX-
Produzione: B+21
Ingresso:
- - X O O O O X X - - - - - - X O O -
- X X O X O X X O X X X X X X - X O -
- X O O X X X - O O O X O O X X X O -
- X O O O X X O O O O O O X X X O - -
- - X X O X - X X X X O O O O O O O -
- - X O O X X X - X X X O O O X X O -
- - X O - O X O X O O O O O X X X O -
- X O O - O O O X X X X X O O X O - -
- X X X O - - - O X O X X X O X O - -
X O O O O - - O - O O O O X X X O O -
X X O - - - O - - O O X X - - X X O O
X O O O - - O - O O X - - - - X O O X
- X X X O O X O O X X - - - - X X X X
X - X X X O X X O O X - - X X O X O O
X X O O X O X O X X - - - X O O O O -
X O - O X X X O X - - - - - X O - - -
O O - O X O O O O X X - X X X X O - -
O O - O O O X O X X - - X - X X O - -
- - O - - O X X X - - - - X O O O - -
Produzione: B+6
Altri test verranno presto.
implementazione di riferimento
Ho creato un'implementazione di riferimento scritta in ANSI C. Questa implementazione legge l'input dall'input standard e scrive l'output nell'output standard.
/* http://codegolf.stackexchange.com/q/6693/134
* reference implementation
* by user FUZxxl
*/
#include <stdio.h>
#include <stdlib.h>
#define MAXBOARD 256
/* bit 0x01: black colour
* bit 0x02: white colour
* bit 0x04: there is a stone on the intersection
*/
enum colour {
UNCOLOURED = 0x0,
BLACK_REACHED = 0x1,
WHITE_REACHED = 0x2,
BOTH_REACHED = 0x3,
HAS_STONE = 0x4,
BLACK = 0x5,
WHITE = 0x6
};
static enum colour board[MAXBOARD * MAXBOARD] = { 0 };
static int bsize = 0;
static void read_input(void);
static void fill_board(void);
static void show_score(void);
int main()
{
read_input();
fill_board();
show_score();
return EXIT_SUCCESS;
}
static void read_input(void)
{
int n = 0;
int invalue;
while ((invalue = getchar()) != EOF) {
switch (invalue) {
case '-': board[n++] = UNCOLOURED; break;
case 'X': board[n++] = BLACK; break;
case 'O': board[n++] = WHITE; break;
}
}
while (bsize * bsize < n) bsize++;
/* your program may exhibit undefined behaviour if this is true */
if (bsize * bsize != n) exit(EXIT_FAILURE);
}
static void fill_board(void)
{
int i,j;
int changes;
enum colour here, top, bottom, left, right, accum;
do {
changes = 0;
for (i = 0; i < bsize; ++i) {
for (j = 0; j < bsize; ++j) {
here = board[i * bsize + j];
if (here >= BOTH_REACHED) continue;
top = i == 0 ? UNCOLOURED : board[(i - 1) * bsize + j];
left = j == 0 ? UNCOLOURED : board[i * bsize + j - 1];
bottom = i == bsize-1 ? UNCOLOURED : board[(i + 1) * bsize + j];
right = j == bsize-1 ? UNCOLOURED : board[i * bsize + j + 1];
accum = here | top | bottom | left | right;
accum &= ~HAS_STONE;
changes |= board[i * bsize + j] != accum;
board[i * bsize + j] = accum;
}
}
} while (changes);
}
static void show_score(void) {
int w = 0, b = 0, n;
for (n = 0; n < bsize*bsize; ++n) switch (board[n] & ~HAS_STONE) {
case BLACK_REACHED: ++b; break;
case WHITE_REACHED: ++w; break;
}
if (b != w)
printf("%s%i\n",b>w?"B+":"W+",abs(b-w));
else
printf("Jigo\n");
}
S+
fosse un errore di battitura (perché in precedenza elencato possibile uscita come sia W+
, B+
o Jigo
) e ho guardato la mia tastiera e visto la S
si trova nei pressi W
... O si usa Dvorak?
W+7
?