Game Scoring a Go adalah tugas yang tidak terlalu mudah. Di masa lalu ada beberapa perdebatan tentang bagaimana merancang aturan untuk mencakup semua kasus sudut aneh yang mungkin terjadi. Untungnya, dalam tugas ini Anda tidak perlu melakukan hal-hal rumit seperti hidup dan mati atau deteksi seki. Dalam tugas ini, Anda harus menerapkan program yang mencetak permainan sesuai dengan aturan Tromp-Taylor tanpa Komi.
Prosedur penilaiannya cukup sederhana:
sebuah titik P, bukan berwarna C, dikatakan mencapai C, jika ada jalur titik-titik warna P yang berdekatan (secara vertikal atau horizontal) dari P ke titik warna C.
Skor pemain adalah jumlah titik warnanya , ditambah jumlah titik kosong yang hanya mencapai warnanya.
Sebagai contoh, perhatikan papan berikut. X
, O
dan -
menunjukkan persimpangan hitam, putih dan tidak berwarna:
- - - 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 - - -
Menerapkan aturan penilaian menghasilkan hasil berikut. x
, o
dan -
mewakili persimpangan tidak berwarna yang dihitung sebagai titik hitam, putih, dan tidak ada orang.
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 - - -
Menurut diagram, hitam memiliki 23 poin, putih memiliki 29 titik wilayah. Dengan demikian, program Anda harus mencetak W+6
untuk board ini.
Saya harap ini cukup jelas seperti ini.
Masukan dan keluaran
Input adalah sebuah string yang berisi persis n ² karakter X
, O
, -
di mana n tidak diketahui pada waktu kompilasi. Program Anda harus mengabaikan semua karakter lain di aliran input. Perilaku tidak terdefinisi jika tidak ada bilangan bulat n sehingga jumlah XO-
karakter sama dengan n² . Anda dapat menganggap bahwa n ada di [0, 255] .
Urutan karakter harus ditafsirkan sebagai papan tulis dari n baris dan kolom. Output adalah nilai absolut dari perbedaan jumlah total titik putih dan hitam dalam representasi desimal. Jika putih memiliki lebih banyak poin, itu diawali oleh W+
, jika hitam memiliki lebih banyak poin itu diawali oleh B+
. Jika kedua pemain memiliki jumlah poin yang sama, hasilnya adalah Jigo
.
Input harus dibaca dengan cara yang ditentukan implementasi. Masukan mungkin bukan bagian dari kode sumber.
Kondisi menang
Ini adalah kode-golf. Konvensi kode-golf biasa berlaku. Pengajuan dengan jumlah karakter paling sedikit di sumbernya akan menang. Hanya program yang menerapkan spesifikasi sepenuhnya yang dapat menang.
Uji kasus
Memasukkan:
- - - 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 - - -
Keluaran: W+6
Memasukkan:
Xavier is insane -- says Oliver
Keluaran: Jigo
Inpout:
Code-Golf
Keluaran: Jigo
Memasukkan:
-XXXXXXX-XOOOOOOOXXO-OXXXOXXXOX--XOXXOOX
-
XOOXXOX--XOXXXOXXXO-OXXOOOOOOOX-XXXXXXX-
Keluaran: B+21
Memasukkan:
- - 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 - -
Keluaran: B+6
Lebih banyak testcases akan segera hadir.
implementasi referensi
Saya telah membuat implementasi referensi yang ditulis dalam ANSI C. Implementasi ini membaca input dari input standar dan menulis output ke output standar.
/* 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+
salah cetak (karena Anda sebelumnya terdaftar mungkin output sebagai baik W+
, B+
atau Jigo
) dan saya melihat keyboard dan melihat S
dekat W
... Atau yang Anda gunakan Dvorak?
W+7
?