การให้คะแนนเกมGoเป็นงานที่ไม่ง่ายเกินไป ในอดีตมีการถกเถียงกันหลายเรื่องเกี่ยวกับวิธีการออกแบบกฏเพื่อให้ครอบคลุมกรณีมุมแปลก ๆ ที่อาจเกิดขึ้น โชคดีที่ในภารกิจนี้คุณไม่ต้องทำสิ่งที่ซับซ้อนเช่นชีวิตและความตายหรือการตรวจจับเซกิ ในภารกิจนี้คุณต้องใช้โปรแกรมที่ให้คะแนนเกมตามกฎ Tromp-Taylorโดย Komi
ขั้นตอนการให้คะแนนค่อนข้างง่าย:
จุด P, ไม่ใช่สี C, ถูกพูดถึง C หากมีเส้นทาง (จุดแนวตั้งหรือแนวนอน) จุดสีที่อยู่ติดกันของ P จาก P ไปยังจุดสี C
คะแนนของผู้เล่นคือจำนวนจุดสีของเธอ รวมถึงจำนวนคะแนนที่ว่างที่เข้าถึงได้เฉพาะสีของเธอ
ตัวอย่างเช่นพิจารณากระดานต่อไปนี้ X
, 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 - - -
การใช้กฎการให้คะแนนจะให้ผลลัพธ์ต่อไปนี้ x
, 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
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 - - -
ตามแผนภาพสีดำมี 23 จุดสีขาวมีอาณาเขต 29 จุด ดังนั้นโปรแกรมของคุณควรพิมพ์W+6
สำหรับบอร์ดนี้
ฉันหวังว่ามันจะชัดเจนพอด้วยวิธีนี้
อินพุตและเอาต์พุต
การป้อนข้อมูลที่เป็นสตริงที่ประกอบด้วยตรงn²ของตัวละครX
, O
, -
ที่nไม่เป็นที่รู้จักที่รวบรวมเวลา โปรแกรมของคุณควรละเว้นอักขระอื่น ๆ ทั้งหมดในสตรีมอินพุต พฤติกรรมจะไม่ได้กำหนดถ้าไม่มีจำนวนเต็มnดังกล่าวว่าจำนวนXO-
ตัวอักษรเท่ากับn² คุณอาจจะคิดว่าnอยู่ใน[0 255]
ลำดับของอักขระจะถูกตีความเป็นแบบ Go-board ของnแถวและคอลัมน์ เอาท์พุทเป็นค่าสัมบูรณ์ของความแตกต่างของจำนวนคะแนนทั้งหมดของสีขาวและสีดำเป็นตัวแทนทศนิยม ถ้าสีขาวมีแต้มมากกว่าจะนำหน้าด้วยW+
ถ้าสีดำมีแต้มมากกว่านั้นก็จะขึ้นB+
ต้นด้วย Jigo
ในกรณีที่ผู้เล่นทั้งสองมีจำนวนเท่ากับของจุดออกเป็น
อินพุตจะถูกอ่านในลักษณะการใช้งานที่กำหนดไว้ อินพุตอาจไม่ได้เป็นส่วนหนึ่งของซอร์สโค้ด
เงื่อนไขการชนะ
นี่คือรหัสกอล์ฟ ใช้รหัสการประชุมกอล์ฟตามปกติ การส่งที่มีจำนวนอักขระน้อยที่สุดในแหล่งที่มาจะชนะ เฉพาะโปรแกรมที่ปฏิบัติตามข้อกำหนดอย่างสมบูรณ์เท่านั้นที่จะชนะ
กรณีทดสอบ
การป้อนข้อมูล:
- - - 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 - - -
เอาท์พุท: W+6
การป้อนข้อมูล:
Xavier is insane -- says Oliver
เอาท์พุท: Jigo
Inpout:
Code-Golf
เอาท์พุท: Jigo
การป้อนข้อมูล:
-XXXXXXX-XOOOOOOOXXO-OXXXOXXXOX--XOXXOOX
-
XOOXXOX--XOXXXOXXXO-OXXOOOOOOOX-XXXXXXX-
เอาท์พุท: B+21
การป้อนข้อมูล:
- - 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 - -
เอาท์พุท: B+6
การทดสอบเพิ่มเติมจะมาในเร็ว ๆ นี้
การดำเนินการอ้างอิง
ฉันสร้างการใช้งานอ้างอิงที่เขียนใน ANSI C การใช้งานนี้จะอ่านอินพุตจากอินพุตมาตรฐานและเขียนเอาต์พุตไปยังเอาต์พุตมาตรฐาน
/* 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+
เป็นพิมพ์ผิด (เพราะคุณระบุไว้ก่อนหน้าการส่งออกไปได้เป็นอย่างใดอย่างหนึ่งW+
, B+
หรือJigo
) และฉันมองไปที่แป้นพิมพ์ของฉันและเห็นS
อยู่ใกล้W
... หรือคุณจะใช้ Dvorak?
W+7
อย่างไร