Marcar un juego Go es una tarea que no es demasiado fácil. En el pasado ha habido varios debates sobre cómo diseñar reglas para cubrir todos los casos extraños que pueden ocurrir. Afortunadamente, en esta tarea no tienes que hacer cosas complicadas como la vida o la muerte o la detección de seki. En esta tarea, debes implementar un programa que califique un juego de acuerdo con las reglas de Tromp-Taylor sin Komi.
El procedimiento de puntuación es bastante simple:
se dice que un punto P, que no tiene color C, llega a C, si hay un camino de puntos adyacentes (vertical u horizontalmente) del color de P desde P hasta un punto de color C.
La puntuación de un jugador es el número de puntos de su color , más el número de puntos vacíos que solo alcanzan su color.
Por ejemplo, considere la siguiente tabla. X
, O
y -
denotan intersecciones negras, blancas y sin color:
- - - 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 - - -
La aplicación de la regla de puntuación produce el siguiente resultado. x
, o
y -
representan intersecciones sin color que se cuentan como puntos negros, blancos y de nadie.
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 - - -
Según el diagrama, el negro tiene 23 puntos, el blanco tiene 29 puntos de territorio. Por lo tanto, su programa debería imprimir W+6
para este tablero.
Espero que sea lo suficientemente claro de esta manera.
Entrada y salida
La entrada es una cadena que contiene exactamente N² de los personajes X
, O
, -
donde n no se conoce en tiempo de compilación. Su programa debe ignorar todos los demás caracteres en la secuencia de entrada. El comportamiento es indefinido si no hay un número entero n tal que la cantidad de XO-
caracteres sea igual a n² . Puede suponer que n está en [0, 255] .
La secuencia de caracteres debe interpretarse como un tablero de n filas y columnas. La salida es el valor absoluto de la diferencia de la cantidad total de puntos de blanco y negro en representación decimal. Si el blanco tiene más puntos, tiene el prefijo W+
, si el negro tiene más puntos, tiene el prefijo B+
. En el caso de que ambos jugadores tengan la misma cantidad de puntos, la salida es Jigo
.
La entrada debe leerse de una manera definida por la implementación. La entrada puede no ser parte del código fuente.
Condiciones ganadoras
Este es el código de golf. Se aplican convenciones de código de golf habituales. La presentación con la menor cantidad de caracteres en su fuente gana. Solo los programas que implementan completamente la especificación pueden ganar.
Casos de prueba
Entrada:
- - - 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 - - -
Salida: W+6
Entrada:
Xavier is insane -- says Oliver
Salida: Jigo
Entrada:
Code-Golf
Salida: Jigo
Entrada:
-XXXXXXX-XOOOOOOOXXO-OXXXOXXXOX--XOXXOOX
-
XOOXXOX--XOXXXOXXXO-OXXOOOOOOOX-XXXXXXX-
Salida: B+21
Entrada:
- - 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 - -
Salida: B+6
Más casos de prueba vendrán pronto.
Implementación de referencia
He creado una implementación de referencia escrita en ANSI C. Esta implementación lee la entrada de la entrada estándar y escribe la salida en la salida estándar.
/* 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+
era un error tipográfico (ya que anteriormente enumerado posible salida como sea W+
, B+
o Jigo
) y yo miraba a mi teclado y vi la S
está cerca W
... O ¿Utiliza Dvorak?
W+7
?