Go 게임 득점은 너무 쉬운 일이 아닙니다. 과거에는 발생할 수있는 모든 이상한 상황을 다루는 규칙을 설계하는 방법에 대한 몇 가지 논쟁이있었습니다. 운 좋게도이 작업에서는 삶과 죽음 또는 세키 감지와 같은 복잡한 작업을 수행 할 필요가 없습니다. 이 작업에서는 Komi가없는 Tromp-Taylor 규칙 에 따라 게임의 점수를 매기는 프로그램을 구현해야합니다 .
채점 절차는 매우 간단합니다.
C 착색되지 점 P는 색 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² 과 같 도록 정수 n 이없는 경우 동작이 정의되지 않습니다 . n 이 [0, 255] 에 있다고 가정 할 수 있습니다 .XO-
일련의 문자는 n 개의 행과 열로 구성된 Go-board로 해석됩니다 . 출력은 십진수로 표현 된 흰색과 검은 색의 총 포인트 수 차이의 절대 값입니다. 흰색에 더 많은 점이 있으면 접두사가 붙고 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
투입 :
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
더 많은 테스트 케이스가 곧 올 것입니다.
참조 구현
I는 생성 한 참조 구현 이 구현은 표준 입력에서 입력을 판독하고, 표준 출력으로 출력을 기록 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
... 또는 당신은 드보르작를 사용합니까?
W+7
?