Bir Go oyunu puanlama hepsi çok kolay olmayan bir iştir. Geçmişte, meydana gelebilecek bütün garip köşe davalarını kapsayacak şekilde kuralların nasıl tasarlanacağı hakkında bazı tartışmalar yapıldı. Neyse ki, bu görevde yaşam ve ölüm ya da seki tespiti gibi karmaşık şeyler yapmak zorunda değilsiniz. Bu görevde, Komi'siz Tromp-Taylor kurallarına göre bir oyun puanlayan bir program uygulamanız gerekiyor .
Puanlama işlemi oldukça basittir:
Renkli olmayan bir nokta olan P'nin, P'nin renginin P noktasından (C) bir noktaya (dikey veya yatay olarak) bitişik noktaları olması halinde C'ye ulaştığı söylenir.
Bir oyuncunun puanı, renginin puan sayısıdır. , artı yalnızca rengine ulaşan boş noktaların sayısı.
Örneğin, aşağıdaki panoyu göz önünde bulundurun. X
, O
Ve -
anlamında olabildikleri, siyah, beyaz ve renksiz kavşaklar:
- - - 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 - - -
Puanlama kuralını uygulamak aşağıdaki sonucu verir. x
, o
Ve -
siyah, beyaz, kimse noktaları olarak sayılır renksiz kesişimleri temsil eder.
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 - - -
Diyagrama göre, siyah 23 puan, beyaz 29 bölgedir. Bu nedenle, programınız W+6
bu pano için yazdırılmalıdır .
Umarım bu şekilde yeterince açıktır.
Giriş ve çıkış
Giriş tam olarak içeren bir dizedir n² karakter X
, O
, n derleme zamanında bilinmemektedir. Programınız giriş akışındaki diğer tüm karakterleri yoksaymalıdır. Karakter sayısı n²'ye eşit olacak şekilde n tamsayısı yoksa davranış tanımlanmaz . N'nin [0, 255] içinde olduğunu varsayabilirsiniz .-
XO-
Karakter dizisi n satır ve sütunlardan oluşan bir Go-board olarak yorumlanır . Çıktı, ondalık gösterimde toplam beyaz ve siyah nokta miktarının farkının mutlak değeridir. Beyazın daha fazla puanı varsa, öneklenir W+
, siyahın daha çok puanı varsa ön eki olur B+
. Her iki oyuncunun da eşit miktarda puana sahip olması durumunda, çıktı şöyledir Jigo
.
Girdi, uygulama tarafından tanımlanmış bir şekilde okunmalıdır. Giriş, kaynak kodunun bir parçası olmayabilir.
Kazanma koşulları
Bu kod golfü. Her zamanki kod-golf kuralları geçerlidir. Kaynağında en az karakter bulunan gönderim kazanır. Yalnızca spesifikasyonu tam olarak uygulayan programlar kazanabilir.
Test durumları
Giriş:
- - - 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 - - -
Çıktı: W+6
Giriş:
Xavier is insane -- says Oliver
Çıktı: Jigo
Inpout:
Code-Golf
Çıktı: Jigo
Giriş:
-XXXXXXX-XOOOOOOOXXO-OXXXOXXXOX--XOXXOOX
-
XOOXXOX--XOXXXOXXXO-OXXOOOOOOOX-XXXXXXX-
Çıktı: B+21
Giriş:
- - 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 - -
Çıktı: B+6
Yakında daha fazla test aracı gelecek.
referans uygulaması
ANSI C'de yazılmış bir referans uygulaması yarattım . Bu uygulama standart girdiden girdi okur ve çıktıyı standart çıktıya yazar.
/* 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+
(daha önce ya mümkün çıkışı listelenmiş çünkü bir yazım hatası oldu W+
, B+
ya Jigo
) ve benim klavyede baktım ve gördüm S
yakındır W
... Yoksa Dvorak kullanıyorsunuz?
W+7
?