Marquer un jeu de Go est une tâche qui n'est pas trop facile. Dans le passé, il y a eu plusieurs débats sur la façon de concevoir des règles pour couvrir tous les cas étranges qui peuvent se produire. Heureusement, dans cette tâche, vous n'avez pas à faire des choses compliquées comme la vie et la mort ou la détection de seki. Dans cette tâche, vous devez implémenter un programme qui marque un jeu selon les règles de Tromp-Taylor sans Komi.
La procédure de notation est assez simple:
un point P, non coloré C, est censé atteindre C, s'il existe un chemin (verticalement ou horizontalement) de points adjacents de couleur P de P à un point de couleur C.
Le score d'un joueur est le nombre de points de sa couleur , plus le nombre de points vides qui n'atteignent que sa couleur.
Par exemple, considérez le tableau suivant. X
, O
Et -
représentent des intersections noir, blanc et non colorés:
- - - 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'application de la règle de notation donne le résultat suivant. x
, o
Et -
représentent les intersections décolorées qui sont comptées comme noir, blanc et points de personne.
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 - - -
Selon le diagramme, le noir a 23 points, le blanc a 29 points de territoire. Ainsi, votre programme devrait imprimer W+6
pour ce forum.
J'espère que c'est assez clair de cette façon.
Entrée et sortie
L'entrée est une chaîne qui contient exactement n² des personnages X
, O
, -
où n est pas connu au moment de la compilation. Votre programme doit ignorer tous les autres caractères du flux d'entrée. Le comportement n'est pas défini s'il n'y a pas d'entier n tel que le nombre de XO-
caractères soit égal à n² . Vous pouvez supposer que n est dans [0, 255] .
La séquence de caractères doit être interprétée comme un Go-board de n lignes et colonnes. La sortie est la valeur absolue de la différence de la quantité totale de points de blanc et de noir en représentation décimale. Si le blanc a plus de points, il est préfixé par W+
, si le noir a plus de points, il est préfixé par B+
. Dans le cas où les deux joueurs ont un nombre égal de points, la sortie est Jigo
.
L'entrée doit être lue d'une manière définie par l'implémentation. L'entrée peut ne pas faire partie du code source.
Conditions gagnantes
C'est du code-golf. Les conventions de code-golf habituelles s'appliquent. La soumission avec le moins de caractères dans sa source gagne. Seuls les programmes qui implémentent pleinement la spécification peuvent gagner.
Cas de test
Contribution:
- - - 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 - - -
Sortie: W+6
Contribution:
Xavier is insane -- says Oliver
Sortie: Jigo
Entrée:
Code-Golf
Sortie: Jigo
Contribution:
-XXXXXXX-XOOOOOOOXXO-OXXXOXXXOX--XOXXOOX
-
XOOXXOX--XOXXXOXXXO-OXXOOOOOOOX-XXXXXXX-
Sortie: B+21
Contribution:
- - 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 - -
Sortie: B+6
D'autres tests seront bientôt disponibles.
implémentation de référence
J'ai créé une implémentation de référence écrite en ANSI C. Cette implémentation lit l'entrée depuis l'entrée standard et écrit la sortie vers la sortie 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+
était une faute de frappe (parce que vous avez précédemment énuméré sortie possible soit W+
, B+
ou Jigo
) et je regardais mon clavier et vu l' S
est près W
... Ou utilisez-vous Dvorak?
W+7
?