गो गेम को स्कोर करना एक ऐसा कार्य है जो बहुत आसान नहीं है। अतीत में सभी अजीब कोने के मामलों को कवर करने के लिए नियमों को डिज़ाइन करने के तरीके के बारे में कई बहसें हुई हैं। सौभाग्य से, इस कार्य में आपको जीवन और मृत्यु या सेकी का पता लगाने जैसी जटिल चीजें नहीं करनी हैं। इस कार्य में, आपको एक प्रोग्राम लागू करना होगा जो ट्रॉम-टेलर नियमों के अनुसार गेम स्कोर करता है कोमी के बिना ।
स्कोरिंग प्रक्रिया बहुत सरल है:
एक बिंदु P, रंगीन C नहीं है, C तक पहुंचने के लिए कहा जाता है, अगर P के रंग से P के रंग के निकट (लंबवत या क्षैतिज) पथ का कोई बिंदु है।
एक खिलाड़ी का स्कोर उसके रंग के बिंदुओं की संख्या है , प्लस केवल उसके रंग तक पहुंचने वाले खाली बिंदुओं की संख्या।
उदाहरण के लिए, निम्नलिखित बोर्ड पर विचार करें। 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] ।
वर्णों के अनुक्रम की व्याख्या 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
जल्द ही और भी मामले सामने आएंगे।
संदर्भ कार्यान्वयन
मैंने एएनएसआई सी में लिखा एक संदर्भ कार्यान्वयन बनाया है । यह कार्यान्वयन मानक इनपुट से इनपुट पढ़ता है और मानक आउटपुट पर आउटपुट लिखता है।
/* 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
?