একটি খেলা স্কোর


23

গো গেম স্কোর করা এমন একটি কাজ যা খুব সহজ নয়। অতীতে, ঘটতে পারে এমন সব বিস্ময়কর কোণার বিষয়গুলি কভার করার জন্য কীভাবে নিয়মগুলি তৈরি করা যায় তা নিয়ে বহু বিতর্ক হয়েছিল। ভাগ্যক্রমে, এই কাজে আপনাকে জীবন এবং মৃত্যু বা সিকি সনাক্তকরণের মতো জটিল জিনিস করতে হবে না। এই টাস্কে, আপনাকে এমন একটি প্রোগ্রাম বাস্তবায়ন করতে হবে যা কোমি ছাড়াই ট্রম্প-টেলারের নিয়ম অনুসারে একটি গেম স্কোর করে ।
স্কোরিং পদ্ধতিটি বেশ সহজ:

সি বিন্দু, রঙিন সি নয়, সি পৌঁছানোর জন্য বলা হয়, যদি পি থেকে রঙের বিন্দুতে পি এর বর্ণের (উল্লম্ব বা অনুভূমিকভাবে) সংলগ্ন পয়েন্টের একটি পথ থাকে তবে
খেলোয়াড়ের স্কোর তার বর্ণের পয়েন্ট সংখ্যা , এবং খালি পয়েন্টগুলির সংখ্যা যা কেবল তার রঙে পৌঁছায়।

উদাহরণস্বরূপ, নিম্নলিখিত বোর্ডটি বিবেচনা করুন। 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 হল কম্পাইল সময়ে জানা যায় না। আপনার প্রোগ্রামটির ইনপুট স্ট্রিমের অন্যান্য সমস্ত অক্ষর উপেক্ষা করা উচিত। যদি কোন পূর্ণসংখ্যা আচরণ অনির্দিষ্ট হয় এন যেমন যে পরিমাণ XO-অক্ষর সমান ছিল n ² । আপনি অনুমান করতে পারে যে এন হয় [0, 255]

অক্ষরের ক্রমটি এন সারি এবং কলামগুলির একটি বোর্ড হিসাবে ব্যাখ্যা করা উচিত । আউটপুট হ'ল দশমিক প্রতিনিধিত্বতে সাদা এবং কৃষ্ণবর্ণের মোট পয়েন্টের পার্থক্যের পরম মান। যদি সাদা আরও পয়েন্ট থাকে তবে এটি দ্বারা উপসর্গীকৃত হয় 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

শীঘ্রই আরও টেস্টকেস আসবে।

রেফারেন্স বাস্তবায়ন

আমি এএনএসআই সি-তে লিখিত একটি রেফারেন্স বাস্তবায়ন তৈরি করেছি This

/* 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");
}

সম্ভবত আপনি শেষ আউটপুট হতে মানে W+7?
dmckee

না ... আপনি এই সিদ্ধান্তে কীভাবে আসবেন?
FUZxxl

Er ... আমি অধিকৃত যে S+(কারণ আপনি আগে পারেন যতটা সম্ভব আউটপুট তালিকাভুক্ত টাইপো ছিলো W+, B+বা, Jigo) এবং আমি আমার কীবোর্ড দিকে তাকিয়ে দেখলেন Sকাছে W... নাকি তুমি ডিভোরাক ব্যবহার করবেন?
dmckee

@ ডিএমকেহে আমি মনে করি "ব্ল্যাক" এর পরিবর্তে জার্মান "শোয়ার্জ" থেকে "এস" এসেছে।
হাওয়ার্ড

ওহ আপনি ঠিক. তার জন্য দুঃখিত
FUZxxl

উত্তর:


2

গল্ফস্ক্রিপ্ট (105 বাইট)

{'-XO'?}/]-1-.{2*3%}%{.,:N),{.*N=}?/{{[{.2$+1={+.}*}*]}%zip}N*[]*.1--,\}2*-.{.0>'W+B+'2/=\abs}{;'Jigo'}if

অনলাইন ডেমো

বন্যা ভরাট থেকে অভিযোজিত আমার পূর্বের উত্তরটি

সমাধানটি প্লাবনটি এক্সের সাথে মূল বোর্ডের একটি অনুলিপি এবং অন্যটি ও এর সাথে পূরণ করে Thus সুতরাং খালি ঘরগুলি যা উভয় রঙের দ্বারা পৌঁছানো যায় উভয়ের জন্যই স্কোর করা হয়, তবে বিয়োগফলকে বাতিল করে।


যথেষ্ট ফর্সা। আপনি এই রাউন্ড জিততে পারেন।
FUZxxl

6

সি ( 438 434 413 382 364 336 322 298 294 292 290 অক্ষর)

#define I b[d*g+e
a;b[65536];c;d;e;f;g;main(){for(;d=getchar()+1;f++)b[f]=d-80?d-89?d-46&&
f--:5:6,g+=g*g<f;while(!c--)for(d=g;d--;)for(e=g;e--;)I]<3?a=3&(I]|!!d*I
-g]|!!e*I-1]|(d<g-1)*I+g]|(e<g-1)*I+1]),c&=I]==a,I]=a:0;while(f--)c+=b[f
]%2-b[f]/2%2;printf(c?"%c+%i":"Jigo",c>0?66:87,abs(c));}

বর্ধিত যোগ্যতার জন্য প্রবেশ করা প্রথমটি ব্যতীত সমস্ত নতুনলাইন lines একটি মন্তব্য করা হয়েছে এবং সামান্য আরও স্পষ্ট সংস্করণ এখানে পাওয়া যাবে

এই উত্তরটি মূলত রেফারেন্স সমাধান তবে সেই সমস্ত অকেজো জিনিসগুলির সাথে (যেমন প্রকারগুলি [যাকে intযাইহোক যে কোনওভাবে আলাদা করা দরকার ?] এবং মান সম্মতি [মূল ফেরতের মান? দয়া করে!])

সংশোধন এবং উন্নতি

438 → 434

আমি নিজেকে নিশ্চিত করেছিলাম যে সেগুলি স্বয়ংক্রিয়ভাবে আরম্ভ হয়ে গেছে vari 0 মান অনুসারে

434 → 413

মুছে ফেলা কেস স্টেটমেন্ট: যদি একটি কালারোল্ট ছেদটি কালো এবং সাদা উভয় থেকেই পৌঁছতে পারে তবে আমরা প্রোগ্রামটিকে সহজ করার জন্য উভয়ের পক্ষে এটি একটি বিন্দু হিসাবে গণনা করতে পারি। অবহেলা এড়ানোর জন্য যৌক্তিক শাখাগুলি স্যুইচ করুন।

413 → 382

একজোড়া প্রথম বন্ধনী সংরক্ষণ dকরার getchar()+1জন্য বরাদ্দ করুন । অনুমানের অধীনে যা জিরোতে bশুরু করা caseহয়েছে, সমস্ত breakবিবৃতি বাতিল করে বিবৃতিগুলি পুনরায় অর্ডার করুন । (a>b?c:0)চেয়ে দীর্ঘতর হয় (a>b)*c(d+1)*g+eচেয়ে দীর্ঘতর হয় d*g+e+g

382 → 364

উন্নত লুপিং, আউটপুটে কোনও নতুন লাইন নেই, খাটো আউটপুট রুটিন।

364 → 336

এই switchবিবৃতি থেকে মুক্তি পেয়েছি । (ধন্যবাদ, হাওয়ার্ড!), দুটি অক্ষরের জন্য পয়েন্টের পার্থক্য ট্র্যাক করুন। অস্বীকার করাcএকটি চরিত্রের জন্য । বড় বা ধারাটিতে চারটি অক্ষর।

336 → 323

প্রতিস্থাপন করা হচ্ছে &দ্বারা %চার অক্ষরের জন্য ধনুর্বন্ধনী অপসারণের পারেন। নয় বা তত অক্ষরের জন্য ইনপুট লুপের সাথে স্কোয়ার-রুটকে ফিউজড (হ্যাঁ!), একটি ifচরের জন্য একটি সরানো ।

323 → 298

Hপ্রায়শই ঘটনাক্রমে ও ভারী b[d*g+e]নির্মাণকে প্রতিস্থাপন করতে ম্যাক্রোকে পরিচয় করিয়ে দেয় ।

298 → 294

পরিবর্তন a&=~4করার জন্য a&=3যেহেতু আমরা কেবলমাত্র যে সব চেয়ে কম তিন বাইট পালন a। এছাড়াও থেকে লুপ শরীর থেকে পরিবর্তিত ((a=I])<3)?a|=...করা I]<3?a=I]|...যা দুই অক্ষর খাটো। এছাড়াও, hপুনরায় ব্যবহারের পরিবর্তে পরিচয় করান cযা একটি চরিত্রের চেয়ে কম।

294 → 292

hপরিবর্তনশীল বাদ দিন । আমরা যদি পরীক্ষা cদিয়ে !c--পরিবর্তে !c++, cবন্যা ভরাট লুপ শেষে 0 সমান এবং এইভাবে উদ্দেশ্যে ব্যবহার করা যেতে পারেh আগে (অর্থাত পালন স্কোর) ব্যবহার করা হয়েছে।

292 → 290

কনস্ট্রাক্ট প্রতিস্থাপন d-46?f--:0সঙ্গে d-46&&f--যা একটি অক্ষর দ্বারা খাটো এবং দুটি বরাদ্দকরণ মেশা aভেতরের লুপ।


1
আপনি {b[f]=d-80?d-89?d-46?f--:0:5:6;f++;}কিছু অক্ষর সংরক্ষণ করতে চাই এমন কিছু দিয়ে স্যুইচ স্টেটমেন্টটি প্রতিস্থাপন করতে পারেন ।
হাওয়ার্ড

@ হাওয়ার্ড: হ্যাঁ সত্যিই চমৎকার কাজ! আপনাকে ধন্যবাদ
FUZxxl

"বর্ধিত স্বচ্ছতার জন্য" - যেন।
টমসডিং

@ টমসমিডিং ওয়েল, একটি লাইন স্ক্রোল করা খুব কম সুগঠিত। এছাড়াও, একটি মন্তব্য করা সংস্করণ এর সাথে লিঙ্কযুক্ত।
FUZxxl

পছন্দ করেছেন :) এছাড়াও, আপনি ঠিক বলেছেন যে এটি 1 লাইনের চেয়ে ভাল।
টমসডিং

6

জে ( 140 136 131 129 119 117 116 টি অক্ষর)

আমার জে দক্ষতা অর্জনের পরে, আমি শেষ পর্যন্ত জেতে একটি জমা দিতে পারি It's যদিও এটি কিছুটা দীর্ঘ।

exit echo>(*{'Jigo';('B+',":);'W+',":@|)+/,-/1 2=/(]OR(0=[)*[:OR((,.|.)0,i:1)|.!.0])^:_~($~,~@%:@#)3-.~'-XO'i:1!:1]3

এই জমা দিয়ে কার্যকর করা অ্যালগরিদমটি রেফারেন্স প্রয়োগের সাথে খুব মিল তবে দখলকৃত ক্ষেত্রগুলি যেভাবে পরিচালনা করা হয় তার থেকে ভিন্ন।

সমাধানটি সহজ বোধগম্যতার জন্য আরও বেশি ভাগে বিভক্ত হয়েছে। গল্ফযুক্ত দ্রবণটি এর থেকে কিছুটা আলাদা তবে পার্থক্যটি খুব বেশি বড় নয়।

input =. 3 -.~ '-XO' i: 1!:1 ] 3
board =. ($~ ,~@%:@#) input
NB. shift up, down, left, right
rotm =. (,. |.) 0 , i: 1
fill =. ] OR (0 = [) * [: OR rotm |.!.0 ]
filledboard =. fill^:_~ board
score =. +/ , -/ 1 2 =/ filledboard
echo > (* { 'Jigo' ; ('B+' , ":) ; ('W+', ":@|)) score
exit 0

5

গল্ফস্ক্রিপ্ট, ১৯০ টি অক্ষর

{"XO-"?)},:v,.),\{\.*=}+,~:s.*:`0\,{s%!\2*+}/:r;88{0v@{=\2*+}+/}:%~79%1${{:<.r|r^2*|<2/r|r^|<2s?:h/|<h*|1$|1$^2`?(&}`*}:a~@@a\;.2$|2${^2*)2base{+}*}:m~@2$|@m-.{"BW"1/1$0>="+"@abs}{;"Jigo"}if

স্ক্রিপ্টটি আমার শুরুতে যতটা মনে হয়েছিল তার চেয়ে অনেক বেশি দীর্ঘ হয়ে গেল। STDIN এ কোনও ইনপুট পাস করুন এবং প্রোগ্রামটি শেষ হয়ে গেলে আউটপুট মুদ্রিত হবে।


2

রুবি (314)

আরও কিছু সময়ের সাথে আরও খাটো করা যেতে পারে:

q={?-=>0,?X=>5,?O=>6};b=[];$<.chars{|c|(t=q[c])&&b<<t}
z=Math.sqrt b.size
loop{c=b.each_with_index.map{|h,i|
next h if h>2
x=i%z
y=i/z
u=y<1?0:b[i-z]
l=x<1?0:b[i-1]
d=y>z-2?0:b[i+z]
r=x>z-2?0:b[i+1]
~4&(h|u|d|l|r)}
break if c==b
b=c}
b.map!{|h|h&~4}
s=b.count(1)-b.count(2)
puts s==0?"Jigo":s>0?"B+#{s}":"W+#{-s}"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.