Ein Go- Spiel zu erzielen, ist keine leichte Aufgabe. In der Vergangenheit gab es mehrere Debatten darüber, wie Regeln entworfen werden sollen, um alle seltsamen Eckfälle abzudecken, die auftreten können. Glücklicherweise müssen Sie bei dieser Aufgabe keine komplizierten Dinge wie Leben und Tod oder die Erkennung von Seki erledigen. In dieser Aufgabe müssen Sie ein Programm implementieren, das ein Spiel nach den Tromp-Taylor-Regeln ohne Komi bewertet.
Das Bewertungsverfahren ist ziemlich einfach:
Man sagt, ein Punkt P, der nicht C gefärbt ist, erreicht C, wenn es einen Pfad (vertikal oder horizontal) benachbarter Punkte der Farbe P von P zu einem Punkt der Farbe C gibt. Die Punktzahl einer Spielerin ist die Anzahl der Punkte ihrer Farbe plus die Anzahl der leeren Punkte, die nur ihre Farbe erreichen.
Betrachten Sie zum Beispiel die folgende Tafel. X
, O
Und -
bezeichnet schwarz, weiß und ungefärbt Kreuzungen:
- - - 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 - - -
Das Anwenden der Bewertungsregel ergibt das folgende Ergebnis. x
, o
Und -
repräsentieren ungefärbten Kreuzungen , die als schwarz gezählt, weiß und Punkte niemanden.
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 - - -
Nach dem Diagramm hat Schwarz 23 Punkte, Weiß 29 Territorialpunkte. Daher sollte Ihr Programm W+6
für diese Karte gedruckt werden .
Ich hoffe es ist so klar genug.
Ein- und Ausgabe
Die Eingabe ist eine Zeichenfolge, die genau enthält n² der Zeichen X
, O
, -
wobei n nicht zum Zeitpunkt der Kompilierung bekannt. Ihr Programm sollte alle anderen Zeichen im Eingabestream ignorieren. Das Verhalten ist undefiniert, wenn es keine ganze Zahl n gibt , sodass die Anzahl der XO-
Zeichen gleich n² ist . Sie können annehmen, dass n in [0, 255] ist .
Die Zeichenfolge ist als Sprungbrett aus n Zeilen und Spalten zu interpretieren . Die Ausgabe ist der absolute Wert der Differenz der Gesamtanzahl der Punkte von Weiß und Schwarz in Dezimaldarstellung. Wenn Weiß mehr Punkte hat, wird ihm das Präfix vorangestellt W+
, wenn Schwarz mehr Punkte hat, wird ihm das Präfix vorangestellt B+
. In dem Fall, dass beide Spieler die gleiche Anzahl von Punkten haben, ist die Ausgabe Jigo
.
Die Eingabe ist implementierungsspezifisch auszulesen. Die Eingabe ist möglicherweise nicht Teil des Quellcodes.
Gewinnbedingungen
Das ist Code-Golf. Es gelten die üblichen Code-Golf-Konventionen. Die Einsendung mit der geringsten Anzahl von Zeichen in der Quelle gewinnt. Nur Programme, die die Spezifikation vollständig implementieren, können gewinnen.
Testfälle
Eingang:
- - - 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 - - -
Ausgabe: W+6
Eingang:
Xavier is insane -- says Oliver
Ausgabe: Jigo
Eingang:
Code-Golf
Ausgabe: Jigo
Eingang:
-XXXXXXX-XOOOOOOOXXO-OXXXOXXXOX--XOXXOOX
-
XOOXXOX--XOXXXOXXXO-OXXOOOOOOOX-XXXXXXX-
Ausgabe: B+21
Eingang:
- - 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 - -
Ausgabe: B+6
Weitere Testfälle folgen in Kürze.
Referenzimplementierung
Ich habe eine in ANSI C geschriebene Referenzimplementierung erstellt . Diese Implementierung liest die Eingabe von der Standardeingabe und schreibt die Ausgabe in die Standardausgabe.
/* 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+
ein Tippfehler war (weil Sie früher mögliche Ausgabe entweder als aufgelistet W+
, B+
oder Jigo
) und ich schaute auf meine Tastatur und sah die S
in der Nähe ist W
... Oder nutzen Sie Dvorak?
W+7
?