টিক-ট্যাক-টো - এক্স বা হে?


14

পটভূমি

আপনি যদি টিকি-টাক-টোয়ের সাথে পরিচিত হন তবে "টাস্ক" এ যান (আমার মনে হয় বেশিরভাগই!)

টিকি-টাক-টো একটি বিখ্যাত দুই খেলোয়াড়ের খেলা। এটি একটি 3x3 বোর্ড নিয়ে গঠিত যা ধীরে ধীরে দুটি প্লেয়ার দ্বারা পূরণ করা হয় (নীচে স্পষ্টকরণ); প্রথম প্লেয়ারটি চরিত্রটি ব্যবহার করে Xএবং অন্যটি ব্যবহার করে O। বিজয়ী হ'ল অনুভূমিকভাবে, উল্লম্বভাবে বা ত্রিভুজ হয়ে পরপর 3 এবং অভিন্ন অক্ষর ( Xবা O) প্রাপ্ত প্রথম to যদি বোর্ডটি ভরাট হয় এবং খেলোয়াড়দের মধ্যে কেউ উপরের ডিক্রিবিউট হিসাবে টানা তিনটি অক্ষর অর্জন করতে সক্ষম হন, তবে খেলাটি সমাপ্তিতে সমাপ্ত হবে। নোট করুন যে গেমের শেষে খালি দাগ থাকতে পারে, যদি খেলোয়াড়দের মধ্যে কেউ মোট 9 টিরও কম পদক্ষেপে জয়ী হয় (এটি টাইয়ের ক্ষেত্রে ঘটতে পারে না)।

কার্য

গেমের শেষে টিক-ট্যাক-টো বোর্ড দেওয়া (স্ট্রিং আকারে, একটি ম্যাট্রিক্স, 9 অর্ডারযুক্ত মানগুলির একটি সমতল তালিকা, অন্য কোনও শালীন বিন্যাস), কে গেমটি জিতবে তা নির্ধারণ করে।

  • ইনপুটটিতে স্বতন্ত্র এবং সামঞ্জস্যপূর্ণ মান থাকবে, একটির জন্য X, একটির জন্য Oএবং অন্যটি খালি স্পট উপস্থাপন করে।

  • আপনার প্রোগ্রামটি 3 স্বতন্ত্র, সামঞ্জস্যপূর্ণ এবং খালি শূন্য মানের আউটপুট দিতে সক্ষম হওয়া উচিত: এক ক্ষেত্রে Xজিতলে, Oখেলোয়াড়দের সাথে তাল মিলিয়ে রাখার ক্ষেত্রে অন্য একটি জিতলে বা অন্য কোনও ক্ষেত্রে ।

    আপনার উত্তরে এই মানগুলি নির্দিষ্ট করুন। আপনি ধরে নিতে পারেন যে ইনপুটটি একটি বৈধ টিক-ট্যাক-টো বোর্ড হবে।

পরীক্ষার কেস

X, O, _এখানে ইনপুট মান; X wins, O winsএবং Tieআউটপুট জন্য।

X O X
O X _
O _ X

আউটপুট: X wins

X _ O
X O _
X O X

আউটপুট: X wins

X O X
_ O X
_ O _

আউটপুট: O wins

X O X
O O X
X X O

আউটপুট: Tie


যথারীতি, আমাদের সমস্ত মানক বিধি প্রযোজ্য। এটি , প্রতিটি ভাষার মধ্যে বাইটের মধ্যে সংক্ষিপ্ততম কোড!


2
আমার মস্তিষ্ক থেকে বেরিয়ে যাও! আক্ষরিক অর্থে একটি নটস এবং ক্রস চ্যালেঞ্জের জন্য একটি ধারণা ছিল যে আমি সোমবার সানবক্স করছি। তারপরে আমি সাইটটি খুলুন এবং এটি দেখুন!
শেগি

1
@ শেগি "ফাস্ট অ্যান্ড ফিউরিয়াস" সিরিজ থেকে কাউকে উদ্ধৃত করার জন্য: খুব ধীর! ; পি
মিঃ এক্সকোডার

এটি ঠিক আছে, আমার ধারণাটি প্লেযোগ্য সংস্করণটির জন্য ছিল, ধরে নিয়ে যে এটি ইতিমধ্যে সম্পন্ন হয়নি।
শেগি

4
@ লাইকোনি আমার মনে হয় না এটি একটি ডুপ, কারণ এটিতে আরও নমনীয় ইনপুট এবং আউটপুট রয়েছে এবং খালি বাক্সগুলিও রয়েছে এবং এটি আপনাকে ইনপুটটি একটি বৈধ বোর্ড বলে ধরে নিতে দেয়।
এরিক আউটগল্ফার

1
@ জোশুয়া এটি টিকিট-টো-টো গেম তৈরির বিষয়ে। এটি এক গ্রেডিং সম্পর্কে।
DonielF

উত্তর:


6

জেলি ,  16 15  14 বাইট

U,Z;ŒD$€ẎḄỊÐḟḢ

একটি মানসিক লিঙ্ক মানগুলির সাথে তালিকার একটি তালিকা (সারি - বা কলাম) স্বীকার করে:

X = 0.155; O = -0.155; _ = 0

প্রত্যাবর্তন ফলাফল:

X wins = 1.085; O wins = -1.085; Tie = 0

দ্রষ্টব্য: এর জন্য শূন্যের _মান এবং Xএবং এর জন্য সমান কিন্তু বিপরীত মানগুলি ব্যবহার করে O, এই মানটি (এখানে 0.155) সীমাতে থাকতে পারে (1/6, 1/7)(উভয় প্রান্তে একচেটিয়া) - আমি কেবলমাত্র এই সীমার মধ্যে এমন একটি মান বেছে নিয়েছি যা একটি নির্দিষ্টভাবে উপস্থাপনযোগ্য ভাসমান পয়েন্টের ফলাফল দিয়েছে জয়ের ক্ষেত্রে

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

U,Z;ŒD$€ẎḄỊÐḟḢ - Link: list of lists (as described above)
U              - upend (reverse each row)
  Z            - transpose (get the columns)
 ,             - pair the two
      $€       - last two links as a monad for each of them:
    ŒD         -   diagonals (leading diagonals - notes: 1. only one is of length 3;
               -              2. the upend means we get the anti-diagonals too)
        Ẏ      - tighten (make a single list of all the rows, columns and diagonals)
         Ḅ     - from binary (vectorises) (note that [0.155, 0.155, 0.155]
               -                           converts to 4*0.155+2*0.155+1*0.155 = 1.085
               -                           and [-0.155, -0.155, -0.155]
               -                           converts to 4*-0.155+2*-0.155+1*-0.155 = -1.085
               -                           while shorter lists or those of length three
               -                           with any other mixtures of 0.155, -0.155 and 0
               -                           yield results between -1 and 1
               -                           e.g. [.155,.155,0] -> 0.93)
           Ðḟ  - filter discard if:
          Ị    -   insignificant (if abs(z) <= 1) (discards all non-winning results)
             Ḣ - head (yields the first value from the list or zero if it's empty)

হ্যাঁ, আমি মনে করি যে কোনও ছদ্মবেশী ভাষার উত্তরের একটি ব্যাখ্যা থাকতে হবে (এবং আমি সাধারণ ভাষার জন্যও ব্যাখ্যা দেখতে চাই!)
জোনাথন অ্যালান

এটি যুক্ত করার জন্য ধন্যবাদ! খুব ভাল পন্থা, আমি যা
চেয়েছি

6

জাভাস্ক্রিপ্ট (ES6), 103 87 বাইট

a=>"012+345+678+036+147+258+048+246T".replace(/\d/g,n=>a[n]||!1).match(/(\d)\1\1|T/)[0]

ইনপুট

  • এক্স হিসাবে প্রতিনিধিত্ব করা হয় 1
  • ও হিসাবে প্রতিনিধিত্ব করা হয় 2
  • _ হিসাবে প্রতিনিধিত্ব করা হয় 0

আউটপুট

  • এক্স জয় হিসাবে প্রতিনিধিত্ব করা হয় "111"
  • হে বিজয় হিসাবে প্রতিনিধিত্ব করা হয় "000"
  • টাই হিসাবে প্রতিনিধিত্ব করা হয় "T"

ব্যাখ্যা

a=>
    "012+345+678+036+147+258+048+246" // List of indexes for each row
    .replace(/\d/g,n=>a[n]||!1)       // Replace all digits with the value of the cell
    .match(/(\d)\1\1|$/)[0]           // Find the first row filled with the same value

পরীক্ষার মামলা

f=
a=>"012+345+678+036+147+258+048+246T".replace(/\d/g,n=>a[n]||!1).match(/(\d)\1\1|T/)[0]
console.log(f([1,2,1,2,1,0,2,0,1]))
console.log(f([1,0,2,1,2,0,1,2,1]))
console.log(f([1,2,1,0,2,1,0,2,0]))
console.log(f([1,2,1,2,2,1,1,1,2]))


"আপনার প্রোগ্রামটি 3 স্বতন্ত্র, ধারাবাহিক এবং খালি নয় মানগুলিকে আউটপুট দিতে সক্ষম হওয়া উচিত ", যাতে আপনি টাইয়ের জন্য খালি স্ট্রিং আউটপুট করতে পারবেন না।
রেডক্লুভার

1
@ সোয়াকু আমার খারাপ, নিয়মের সেই অংশটি আমি মিস করেছি।
হারমান এল

4

জেলি , 18 বাইট

UŒD;;Z;ŒDµSA⁼3µÐfḢ

এটি অনলাইন চেষ্টা করুন!

X= 1, O= -1, _= 0
এক্স জিত = [1, 1, 1], ও জিত = [-1, -1, -1], টাই = 0
ইনপুট (1, -1, 0)প্রতিটি 3 টি উপাদানের 3 তালিকার তালিকা হিসাবে ।


বাহ ভাল ... আপনি যখন গল্ফিং সম্পন্ন করেন, দয়া করে I / O মান এবং একটি ব্যাখ্যা যুক্ত করুন :-)
মিঃ এক্সকডার

সামান্য খাটো পরীক্ষার সাথে এখানে একটি অনুরূপ পন্থা। গ্রহণ X= 1, O= 2, _= 3, 1(এক্স জিত), 2(ও জিত) বা 3(টাই) নেয়।
আর্নল্ড

@ অর্নল্ড সংক্ষিপ্তকরণের জন্য ধন্যবাদ
এরিক দ্য আউটগল্ফার

3

পাইথন 3 , 73 বাইট

lambda b:{'XXX','OOO'}&{*b.split(),b[::4],b[1::4],b[2::4],b[::5],b[2::3]}

এটি অনলাইন চেষ্টা করুন!


পাইথন 2 , 100 95 92 87 82 77 বাইট

lambda b:{'XXX','OOO'}&set(b.split()+[b[::4],b[1::4],b[2::4],b[::5],b[2::3]])

এটি অনলাইন চেষ্টা করুন!


এর একটি নতুন লাইনের দ্বারা পৃথক স্ট্রিং হিসাবে ইনপুট নেয় XO_

আউটপুট:

  • {'XXX'}জন্য X,
  • {'OOO'} জন্য O
  • {} একটি টাই জন্য

সারি কলাম এবং ত্রিভুজগুলিতে স্ট্রিং টুকরো টুকরো করে কাজ করে:

The board:
    1 2 3
    4 5 6
    7 8 9
which is '123\n456\n789' is sliced into:

['123', '456', '789', '147', '258', '369', '159', '357']
rows: b.split() -> ['123', '456', '789']
cols: [b[::4],b[1::4],b[2::4]] -> ['147', '258', '369']
diag: [b[::5],b[2::3]] -> ['159', '357']

তারপরে 'XXX'এবং 'OOO'টুকরাগুলির বিরুদ্ধে চেক করা হয়।

এর একটি নতুন লাইনের দ্বারা পৃথক স্ট্রিং হিসাবে ইনপুট নেয় XO_

আউটপুট:

  • {'XXX'}জন্য X,
  • {'OOO'} জন্য O
  • {} একটি টাই জন্য

সারি কলাম এবং ত্রিভুজগুলিতে স্ট্রিং টুকরো টুকরো করে কাজ করে:

The board:
    1 2 3
    4 5 6
    7 8 9
which is '123\n456\n789' is sliced into:

['123', '456', '789', '147', '258', '369', '159', '357']
rows: b.split() -> ['123', '456', '789']
cols: [b[::4],b[1::4],b[2::4]] -> ['147', '258', '369']
diag: [b[::5],b[2::3]] -> ['159', '357']

তারপরে 'XXX'এবং 'OOO'টুকরাগুলির বিরুদ্ধে চেক করা হয়।


পাইথন এফটিডাব্লু যাইহোক, 81 বাইট , কেটে ফেলা উচিত, আমার মনে হয়।
সম্পূর্ণরূপে

@icrieverytim [2::2]করার টুকরা 3579, যখন [2:8:2]দেয়357
TFeld


3

আর, 118 116 115 বাইট

অতিরিক্ত দুটি বাইটের জন্য @ ব্যবহারকারী 2390246 কে ধন্যবাদ ।

function(M,b=table,u=unlist(c(apply(M,1,b),apply(M,2,b),b(diag(M)),b(M[2*1:3+1]))))`if`(any(u>2),names(u[u>2]),"T")

সামান্য শৃঙ্খলাবদ্ধ:

function(M){
    u=unlist(c(apply(M,1,table), #Contingency table of the rows
             apply(M,2,table), #of the columns
             table(diag(M)), #of the diagonal
             table(M[2*1:3+1]))) #of the opposite diagonal
    `if`(any(u>2),names(u[u>2]),"T") #Give name of element that occurs more than twice in any setting
 }

রিটার্নস Xযদি এক্স জয়ী, Oযদি হে জয়ী এবংT টাই ক্ষেত্রে।

এটি অনলাইন চেষ্টা করুন!


1
M[c(3,5,7)]বিপরীত
তির্যকের

3

পার্ল 5 , 58 বাইট

56 বাইট কোড + 2 এফপ্রি -p0

$_=eval sprintf'/(.)(.{%s}\1){2}/s||'x4 .'0?$1:T',0,2..4

এটি অনলাইন চেষ্টা করুন!

আউটপুট Xএবং Oজয়ের জন্য, বা Tএকটি টাই জন্য। একবারে সমস্ত পরীক্ষা করতে হেডার / পাদচরণ কোডের একগুচ্ছ অন্তর্ভুক্ত।


বিকল্প, 58 বাইট

$}.="/(.)(.{$_}\\1){2}/s||"for 0,2..4;$_=eval$}.'0?$1:T'

এটি অনলাইন চেষ্টা করুন!


2

পাইথন 2 , 124 118 117 115 বাইট

def T(B):
 for j in range(8):
	a,b,c=map(int,`0x197bf3c88b2586f4bef6`[j*3:][:3])
	if B[a]==B[b]==B[c]>0:return B[a]

এটি অনলাইন চেষ্টা করুন!

ইনপুট / আউটপুট মান

  • X হিসাবে প্রতিনিধিত্ব করা হয় 1
  • O হিসাবে প্রতিনিধিত্ব করা হয় 2
  • _ হিসাবে প্রতিনিধিত্ব করা হয় None

[8,0,3,6,1,4,7,2,5,8,0,4,8,2,4,6]->map(int,'8036147258048246')
এরিক দি আউটগল্ফার

টুইটসমূহ আমি ব্যবহার করে পূর্ণসংখ্যা তালিকাটি গল্ফ করার চেষ্টা করছিলাম map(ord,"..."), যদিও nulএকটি স্ট্রিংয়ের মাঝামাঝি একটি বাইট কাজ না করায় ...
জোনাথন ফ্রেচ

117 বাইট[j*3:j*3+3]হয় [j*3:][:3]। পার্শ্ব নোট j*3+3হিসাবে -~j*3, একই , তবে এটি 118 বাইটও।
মিঃ এক্সকোডার


1
@ মিঃ এক্সকোডার ধন্যবাদ আজ একটি নতুন কাটা গল্ফ শিখেছি।
জনাথন ফ্রেচ

2

পাইথন 3 , 173 বাইট

lambda x:h(x,1)*2or+h(x,0)
h=lambda x,y:g(x,y)or g(zip(*x),y)or x[0][0]==x[1][1]==x[2][2]==y or x[0][2]==x[1][1]==x[2][0]==y
g=lambda x,y:any(all(e==y for e in r)for r in x)

এটি অনলাইন চেষ্টা করুন!

  • এর ম্যাট্রিক্স হিসাবে ইনপুট 1 == X, 0 == O, -1 == _

  • একক মান হিসাবে আউটপুট: 2 == X, 1 == O, 0 == TIE

-8 বাইটস এরিক দি আউটগলফারকে ধন্যবাদ


You can replace the first line with lambda x:h(x,1)*2or+h(x,0) for -8 bytes and 0 == TIE (which is prettier imo).
Erik the Outgolfer

@EriktheOutgolfer cool, thanks
HyperNeutrino

2

PHP, 70 bytes

for($c=95024101938;${${$i++&7}.=$argn[$c%9]}=1<$c/=3;);echo$XXX-$OOO;

Assumes -n (interpreter defaults). Additionally requires -R (execute <code> for every line of input), counted as one.

Input is taken on a single line (exactly as in the problem description, except with all whitespace removed).

Output is the following: 1 → X Wins, -1 → O Wins, 0 → Tie .

Try it online!


You do not need to have the whole strings, you can choose your output values. 'X Wins' can be changed to 'X' (or even an integer -- say 1). The same applies to 'O wins' and Tie. That being said, 109 bytes.
Mr. Xcoder

@Mr.Xcoder thanks for the clarification.
primo

1

Retina, 49 bytes

;
;;
.*(\w)(.)*\1(?<-2>.)*(?(2)(?!))\1.*
$1
..+
T

Try it online! Takes input as an 11-character string of 9 Xs, Os or -s in three groups of three separated by ;s, although the link includes a header which translates the given test cases to this format. Works by matching a winning line directly using a balancing group to ensure that the three matching characters are equidistant. (Suitable distances are 0 (horizontal line), 4 (reverse diagonal), 5 (vertical line), or 6 (diagonal); other distances would hit a ; or extend outside the string.)


1

Java 8, 112 108 106 104 90 102 93 bytes

b->b.replaceAll(".*(X|O)(\\1|...\\1...|.{4}\\1.{4}|..\\1..)\\1.*","$1").replaceAll("..+","T")

+12 bytes (90 → 102) due to bug-fix of only checking one diagonal instead of both..
-9 bytes (102 → 93) by using replaceAll instead of matches.

Input in the format XOX OX_ O_X, output X, O or T.

Explanation:

Try it here.

b->{                   // Method with String as both parameter and return-type
  b.replaceAll(".*(X|O)(\\1|...\\1...|.{4}\\1.{4}|..\\1..)\\1.*",
                       //  If we found a line of X or O:
     "$1")             //   Replace it with either X or O
   .replaceAll("..+",  //  If there are now more than 2 characters left:
     "T")              //   Replace it with T
                       // End of method (implicit / single-line return-statement)

Explanation regex:

.*(X|O)(\1|...\1...|.{4}\1.{4}|..\1..)\1.*
.*                                      .*# 0 or more trailing & leading chars
  (X|O)                               \1  # X or O next to those leading/trailing chars
       (\1                                # A single X or O in between (row found)
          |...\1...                       # 3 chars, X or O, 3 chars (column found)
                   |.{4}\1.{4}            # 4 chars, X or O, 4 chars (diagonal TLBR found)
                              |..\1..)    # 2 chars, X or O, 2 chars (diagonal TRBL found)

0

Retina, 127 bytes

.*(X|O)\1\1.*
$1
(X|O).. \1.. \1..
$1
.(X|O). .\1. .\1.
$1
..(X|O) ..\1 ..\1
$1
(X|O).. .\1. ..\1
$1
..(X|O) .\1. \1..
$1
..+
_

Try it online!

...I guess you could call this brute force... Thought there might be some merit to it...


0

Retina, 51 bytes

.*(X|O)(\1|...\1...|.{4}\1.{4}|..\1..)\1.*
$1
..+
T

Port of my Java 8 answer. Input in the format XOX OX_ O_X, output X, O or T.

Explanation:

Try it here.

.*(X|O)(\1|...\1...|.{4}\1.{4}|..\1..)\1.*
.*                                      .*# 0 or more trailing & leading chars
  (X|O)                               \1  # X or O next to those leading/trailing chars
       (\1                                # A single X or O in between (row found)
          |...\1...                       # 3 chars, X or O, 3 chars (column found)
                   |.{4}\1.{4}            # 4 chars, X or O, 4 chars (diagonal TL→BR found)
                              |..\1..)    # 2 chars, X or O, 2 chars (diagonal TR→BL found)

$1                                        #  Replace match of above with either X or O

..+                                       # If there are now 2 or more characters left:
T                                         #  Replace everything with T

0

J, 34 bytes

[:>./[:+./"1(2 1 0},:0 1 2}),(,|:)

Ungolfed:

[: >./ [: +./"1 (2 1 0} ,: 0 1 2}) , (, |:)

Explanation

Encoding:

X = 2
O = 3
_ = 1

Our high-level strategy is first to create a matrix each of whose rows is a possible win. Row one is diagonal /, row 2 is diagonal \, the next three rows are the rows, and the final three rows are the columns. This part is accomplished by the phrase (using Item Amend }):

(2 1 0},:0 1 2}),(,|:)

Finally we take the GCD of each row:

+./"1

Thanks to our encoding, any row with a blank will have a GCD of 1, as will any row that contains any mix of Xs and Os, because 2 and 3 are coprime. So all we need to do next is find the maximum element: >./

If the game is a tie, it will be 1. If a player wins, it will be that player's number.

Try it online!


0

JavaScript, 66 bytes

([a,b,c,d,e,f,g,h,i])=>e&(a&i|c&g|b&h|d&f)|a&(b&c|d&g)|i&(c&f|g&h)

Keeping it simple.

  • Input: A string, or array of numbers or strings, with 0 corresponding to a blank space, 1 an X, and 2 an O.
  • Output: 0 for a tie, 1 for X victory, 2 for O victory.

Expanded, lightly commented:

( [a,b,c,d,e,f,g,h,i] ) => // Break apart the input into nine variables w/ destructuring
  // Run through all possible win conditions. 1&1&1 -> 1, 2&2&2 -> 2
  e & (             // All victories involving the middle square
    a & i | c & g | // Diagonal lines
    b & h | d & f   // Vertical/horizontal through the middle
  ) | 
  a & ( b & c | d & g ) | // Victories with the top-left square
  i & ( c & f | g & h )   // Victories with the bottom-right square
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.