Ghi một Go trò chơi là một nhiệm vụ đó không phải là tất cả quá dễ dàng. Trong quá khứ đã có một vài cuộc tranh luận về cách thiết kế các quy tắc để bao quát tất cả các trường hợp góc lạ có thể xảy ra. May mắn thay, trong nhiệm vụ này, bạn không phải làm những việc phức tạp như sự sống và cái chết hoặc phát hiện seki. Trong nhiệm vụ này, bạn phải thực hiện một chương trình chấm điểm một trò chơi theo quy tắc Tromp-Taylor mà không có Komi.
Thủ tục tính điểm khá đơn giản:
một điểm P, không được tô màu C, được cho là đạt tới C, nếu có một đường dẫn (theo chiều dọc hoặc chiều ngang) các điểm liền kề của màu P từ P đến một điểm màu C.
Điểm của người chơi là số điểm màu của cô ta , cộng với số điểm trống chỉ đạt màu của cô ấy.
Ví dụ, hãy xem xét bảng sau. X
, O
Và -
biểu thị màu đen, trắng và không bị nhuộm màu nút giao thông:
- - - 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 - - -
Áp dụng quy tắc tính điểm mang lại kết quả như sau. x
, o
Và -
đại diện cho nút giao thông không bị nhuộm màu được tính là đen, trắng và điểm của ai cả.
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 - - -
Theo sơ đồ, màu đen có 23 điểm, màu trắng có 29 điểm lãnh thổ. Vì vậy, chương trình của bạn nên in W+6
cho bảng này.
Tôi hy vọng nó là đủ rõ ràng theo cách này.
Đầu vào và đầu ra
Đầu vào là một chuỗi chứa chính xác n ² trong những nhân vật X
, O
, -
nơi n là không biết đến lúc biên dịch. Chương trình của bạn sẽ bỏ qua tất cả các ký tự khác trong luồng đầu vào. Hành vi không được xác định nếu không có số nguyên n sao cho số lượng XO-
ký tự bằng n² . Bạn có thể giả sử rằng n nằm trong [0, 255] .
Chuỗi các ký tự sẽ được hiểu là một bảng gồm n hàng và cột. Đầu ra là giá trị tuyệt đối của chênh lệch của tổng số điểm trắng và đen trong biểu diễn thập phân. Nếu màu trắng có nhiều điểm hơn, nó có tiền tố bởi W+
, nếu màu đen có nhiều điểm hơn thì nó có tiền tố B+
. Trong trường hợp cả hai người chơi có số điểm bằng nhau, đầu ra là Jigo
.
Đầu vào là để được đọc theo cách thực hiện được xác định. Đầu vào có thể không phải là một phần của mã nguồn.
Điều kiện chiến thắng
Đây là mã golf. Quy ước golf-code thông thường được áp dụng. Việc gửi với số lượng ký tự ít nhất trong nguồn của nó sẽ thắng. Chỉ các chương trình thực hiện đầy đủ các đặc điểm kỹ thuật có thể giành chiến thắng.
Các trường hợp thử nghiệm
Đầu vào:
- - - 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 - - -
Đầu ra: W+6
Đầu vào:
Xavier is insane -- says Oliver
Đầu ra: Jigo
Đầu vào:
Code-Golf
Đầu ra: Jigo
Đầu vào:
-XXXXXXX-XOOOOOOOXXO-OXXXOXXXOX--XOXXOOX
-
XOOXXOX--XOXXXOXXXO-OXXOOOOOOOX-XXXXXXX-
Đầu ra: B+21
Đầu vào:
- - 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 - -
Đầu ra: B+6
Nhiều thử nghiệm sẽ đến sớm.
Thực hiện tham khảo
Tôi đã tạo một triển khai tham chiếu được viết bằng ANSI C. Việc triển khai này đọc đầu vào từ đầu vào tiêu chuẩn và ghi đầu ra vào đầu ra tiêu chuẩn.
/* 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+
là một lỗi đánh máy (vì bạn sớm niêm yết có thể sản lượng là một trong hai W+
, B+
hoặc Jigo
) và tôi nhìn vào bàn phím của tôi và thấy S
là gần W
... Hay bạn sử dụng Dvorak?
W+7
?