টিকি-ট্যাক-টো বিজয়ী নির্ধারণ করুন (বৃত্তাকার ভিত্তিক)


26

আসুন কিছু কোড-গল্ফ খেলি!

চ্যালেঞ্জটি হ'ল টিকি-ট্যাক-টো-এর কোনও খেলোয়াড়ের সন্ধান করা।

এটি এমন একটি বোর্ড দিয়ে বহুবার করা হয়েছে যার একটি সুস্পষ্ট বিজয়ী রয়েছে তবে এখানে টুইস্টটি দেওয়া হয়েছে:

কোষগুলি এইভাবে গণনা করা হয়:

1|2|3
-+-+-
4|5|6
-+-+-
7|8|9

আপনি ঠিক 9 টি পদক্ষেপের একটি অ্যারে পাবেন:

{3, 5, 6, 7, 9, 8, 1, 2, 3}

এটি নিম্নলিখিত হিসাবে পার্স করা হয়েছে:

  • প্লেয়ার 1 নম্বর সেল 3
  • প্লেয়ার 2 নম্বর সেল 5
  • প্লেয়ার 1 নম্বর সেল 6
  • প্লেয়ার 2 নম্বর সেল 7
  • প্লেয়ার 1 নম্বর সেল 9
  • প্লেয়ার 1 জিতেছে

দ্রষ্টব্য: কোনও খেলোয়াড় জয়ের পরে খেলাটি থামবে না, এমনটি হতে পারে যে হেরে যাওয়া খেলোয়াড় বিজয়ী খেলোয়াড়ের পর পর পর তিনটি পেতে সক্ষম হয়, তবে কেবল প্রথম জয় গণনা করা হয়।

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

আনন্দ কর!

অনুরোধ হিসাবে আরও কিছু উদাহরণ:

{2,3,4,5,6,7,1,8,9} => Player 2 wins in round 6
{1,2,4,5,6,7,3,8,9} => Player 2 wins in round 8
{1,2,3,5,4,7,6,8,9} => Player 2 wins in round 8

11
পিপিসিজিতে আপনাকে স্বাগতম! এটি একটি দুর্দান্ত প্রথম পোস্ট, তবে সাধারণত আমরা খুব সীমাবদ্ধ ইনপুট / আউটপুট ফর্ম্যাট পছন্দ করি না । আপনি কি "রাউন্ড ওয়াইতে প্লেয়ার এক্স জেতা" সরানোর বিষয়ে বিবেচনা করবেন এবং আমাদের তালিকার মতো কোনও যুক্তিসঙ্গত বিন্যাসে আউটপুট দিন [X, Y]? টাই করার ক্ষেত্রে, আমরা কি পরিবর্তে অন্য কোনও সামঞ্জস্যপূর্ণ মান আউটপুট করতে পারি? আমি এটির প্রস্তাব দিই, কারণ সেই সঠিক স্ট্রিংগুলি মুদ্রণ করা সত্যিই গল্ফের অংশ নয়। ভবিষ্যতের চ্যালেঞ্জ আইডিয়াগুলির জন্য, আমি স্যান্ডবক্স ব্যবহার করার পরামর্শ দিই । :-)
এক্সকোডার

দুঃখিত আমার খারাপ. আমি মনে করি এটি এখন ঠিক আছে।
গ্রুনজওয়ানজলিং 13

চ্যালেঞ্জটি শেষ পর্যন্ত পড়ুন, আমি বলছি যে একটি ড্র হতে পারে এবং এটি হওয়ার পরে আপনি আপনার পছন্দসই কিছু আউটপুট করতে পারেন। খেলোয়াড় 2 রাউন্ডে 2 জিতে এবং যখন কেউ জিতবে না তখন আমি {2,6 return ফিরে আসি।
গ্রুনজওয়ানজলিং 13

আমরা কি 0 সূচকযুক্ত সবকিছু ব্যবহার করতে পারি? (সেল, প্লেয়ার, রাউন্ড)
আর্নল্ড

1
"আপনি ঠিক এর মতো 9 পদক্ষেপের একটি অ্যারে পান: {3, 5, 6, 7, 9, 8, 1, 2, 3}" - 3সত্যই দু'বার উপস্থিত হওয়া উচিত ?
জোনাথন অ্যালান

উত্তর:


8

রেটিনা , 114 বাইট

(.)(.)
$1O$2X
^
123;;456;;789¶X
{`(.)(.*¶)(.)\1
$3$2
}`.*(.)(.)*\1(?<-2>.)*(?(2)(?!))\1.*¶(..)*
$1$#3
.*¶
T
T`d`Rd

এটি অনলাইন চেষ্টা করুন! টিক-টাক-টো-এর উত্তরটির ভিত্তিতে - এক্স বা হে? X<N>প্রথম খেলোয়াড় টার্ন পরে জিতলে আউটপুট N, O<N>দ্বিতীয় খেলোয়াড় জিতলে, Tযদি না জিতে থাকে। ব্যাখ্যা:

(.)(.)
$1O$2X
^
123;;456;;789¶X

একটি অভ্যন্তরীণ বোর্ড তৈরি করে এবং প্লেয়ারের সাথে প্রতিটি পদক্ষেপ চিহ্নিত করে যার চলন।

{`(.)(.*¶)(.)\1
$3$2

একটি পদক্ষেপ প্রয়োগ করে।

}`.*(.)(.)*\1(?<-2>.)*(?(2)(?!))\1.*¶(..)*
$1$#3

একটি জয়ের সন্ধান করে এবং যদি এটির সন্ধান পাওয়া যায়, তবে বিজয়ী এবং অবশিষ্ট পদক্ষেপের সংখ্যার সাথে বোর্ডটি প্রতিস্থাপন করুন।

.*¶
T

যদি চালগুলি অবসন্ন হয় এবং কেউ জিততে না পারে তবে গেমটি টাই।

T`d`Rd

অবশিষ্ট চালগুলির সংখ্যা থেকে রাউন্ডের সংখ্যা গণনা করুন।


4
এটি আমি এখানে দেখেছি আরও .... স্বতঃস্ফূর্ত উত্তর।
লর্ড ফারকোয়াড

6

এমএটিএল , 39 বাইট

3:g&+XIx"IX@oXK@(XIt!yXdyPXd&hK=Aa?KX@.

আউটপুট হয়

  • 1এবং R, পৃথক লাইনে, যদি ব্যবহারকারী 1 টি রাউন্ড আরে জয়ী হয় ;
  • 0এবং R, পৃথক লাইনে, যদি ব্যবহারকারী 2 টি রাউন্ড আরে জিততে পারে ;
  • কেউ না জিতলে খালি

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা

3:       % Push [1 2 3]
g        % Convert to logical. Gives [true true true]
&+       % Matrix of all pairs of additions. Gives a 3×3 matrix, which represents
         % the board in its initial state, namely all cells contain 2. This value
         % means "cell not used yet". 1 will represent "cell marked by user 1",
         % and 0 will represent "cell marked by user 2"
XI       % Copy into clipboard I
x        % Delete
"        % Implicit input: array with moves. For each move
  I      %   Push current board state
  X@     %   Push iteration index (starting at 1), that is, current round number
  o      %   Modulo 2: gives 1 or 0. This represents the current user
  XK     %   Copy into clipboard K
  @      %   Push current move ((that is, cell index)
  (      %   Write user identifier (1 or 0) into that cell. Cells are indexed
         %   linearly in column-major order. So the board is transposed compared
         %   to that in the challenge, but that is unimportant
  XI     %   Copy updated board into clipboard I
  t!     %   Duplicate and transpose
  y      %   Duplicate from below: push copy of board
  Xd     %   Extract main diagonal as a 3×1 vector
  y      %   Duplicate from below: push copy of transposed board
  PXd    %   Flip vertically and extract main diagonal. This is the anti-diagonal
         %   of the board
  &h     %   Concatenate stack horizontally. This concatenates the board (3×3),
         %   transposed board (3×3), main diagonal (3×1 vector) and anti-diagonal
         %   (3×1) into an 3×8 matrix
  K=     %   Push current user identifier. Test for equality with each entry of the
         %   3×8 matrix
  A      %   For each column, this gives true if all its entries are true. Note 
         %   that the first three columns in the 3×8 matrix are the board columns;
         %   the next three are the board rows; and the last two columns are the
         %   main diagonal and anti-diagonal. The result is a 1×8 vector
  a      %   True if any entry is true, meaning the current user has won
  ?      %   If true
    K    %     Push current user identifier
    X@   %     Push current round number
    .    %     Break for loop
         %   Implicit end
         % Implicit end
         % Implicit display

5

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

m=>m.reduce((l,n,i)=>l||(b[n-1]=p=i%2+1,"012,345,678,036,147,258,048,246".replace(/\d/g,m=>b[m]).match(""+p+p+p)&&[p,i+1]),0,b=[])

f=m=>m.reduce((l,n,i)=>l||(b[n-1]=p=i%2+1,"012,345,678,036,147,258,048,246".replace(/\d/g,m=>b[m]).match(""+p+p+p)&&[p,i+1]),0,b=[])
console.log(JSON.stringify(f([3,5,6,7,9,8,1,2,3])))
console.log(JSON.stringify(f([2,3,4,5,6,7,1,8,9])))
console.log(JSON.stringify(f([1,2,4,5,6,7,3,8,9])))
console.log(JSON.stringify(f([1,2,3,5,4,7,6,8,9])))

ব্যাখ্যা

m=>m.reduce((l,n,i)=>               // Reduce the input array with n as the current move
  l||(                              //  If there is already a winner, return it
  b[n-1]=p=i%2+1,                   //  Set the cell at b[n-1] to the current player p
  "012,345,678,036,147,258,048,246" //  For every digit in the list of possible rows:
    .replace(/\d/g,m=>b[m])         //   Replace it with the player at the cell
    .match(""+p+p+p)                //  If any of the rows is filled with p:
      &&[p,i+1]                     //   Return [p, current move]
),0,b=[])

আপনি দয়া করে একটি ব্যাখ্যা বা একটি নিরবচ্ছিন্ন সংস্করণ প্রদান করতে আপত্তি করবেন? আমি আপনার সমাধান বুঝতে আগ্রহী।
জ্যাক

4

জাভা (ওপেনজেডিকে 8) , 445 বাইট

int[] t(int[]m){int[][]f=new int[3][3];boolean z=false;for(int i=0;i<9;i++){f[m[i]%3][m[i]/3]=z?2:1;if(f[m[i]%3][0]==(z?2:1)&&f[m[i]%3][1]==(z?2:1)&&f[m[i]%3][2]==(z?2:1)||f[0][m[i]/3]==(z?2:1)&&f[1][m[i]/3]==(z?2:1)&&f[2][m[i]/3]==(z?2:1)||m[i]%3+m[i]/3==2&&f[0][2]==(z?2:1)&&f[1][1]==(z?2:1)&&f[2][0]==(z?2:1)||m[i]%3==m[i]/3&&f[0][0]==(z?2:1)&&f[1][1]==(z?2:1)&&f[2][2]==(z?2:1)){return(new int[]{(z?2:1),++i});}z=!z;}return(new int[]{0,0});}

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

রিটার্ন মান {1,8} এর অর্থ খেলোয়াড় 1 রাউন্ড 8 এ জিতেছে রিটার্ন মান {0,0। মানে অঙ্কন।


5
আপনি সমস্ত অপ্রয়োজনীয় ব্যবধান অপসারণ না করে গল্ফিংয়ের প্রচেষ্টার অভাবে এই উত্তরটি অবৈধ বলে বিবেচিত হবে। তদ্ব্যতীত, আপনার নিজের চ্যালেঞ্জটির দ্রুততার সাথে উত্তর দেওয়ার জন্য এটি সুপারিশ করা হয়নি এবং আপনি একটি টিআইও লিঙ্ক যুক্ত করতে চান যাতে আমরা আপনার কোডটি পরীক্ষা করতে পারি।
মিঃ এক্সকোডার


আমি দুঃখিত, আমি ভুল জিনিসটি অনুলিপি করেছি। এটি প্রকৃতপক্ষে সংক্ষিপ্ত
গ্রুনজওয়ানজলিং

কিছু বাইট অপসারণ করতে আপনি জাভা প্রশ্নে গল্ফ করার টিপস দেখতে পারেন । উদাহরণস্বরূপ , falseদ্বারা প্রতিস্থাপন করা যেতে পারে 1<0, এবং প্রথমের পরে স্থান ]সরানো যেতে পারে।
ব্যবহারকারী 202729

442 বাইট । এছাড়াও টিআইওতে "শিরোলেখ" এবং "পাদলেখ" বিভাগ বিদ্যমান থাকার কারণ হ'ল আপনাকে মন্তব্য করার দরকার নেই //Code that was submittedএবং //End of code
ব্যবহারকারী 202729

2

কোটলিন , 236 বাইট

i.foldIndexed(l()to l()){o,(a,b),p->fun f(i:(Int)->Int)=b.groupBy(i).any{(_,v)->v.size>2}
if(f{(it-1)/3}|| f{it%3}|| listOf(l(1,5,9),l(3,5,7)).any{b.containsAll(it)}){return p%2+1 to o}
b to a+p}.let{null}
fun l(vararg l:Int)=l.toList()

শোভিত

    i.foldIndexed(l() to l()) { o, (a, b), p ->
        fun f(i: (Int) -> Int) = b.groupBy(i).any { (_, v) -> v.size > 2 }
        if (f { (it - 1) / 3 } || f { it % 3 } || listOf(l(1, 5, 9), l(3, 5, 7)).any { b.containsAll(it) }) {
            return p % 2 + 1 to o
        }
        b to a + p
    }.let { null }
fun l(vararg l:Int)= l.toList()

পরীক্ষা

fun f(i: List<Int>): Pair<Int, Int>? =
i.foldIndexed(l()to l()){o,(a,b),p->fun f(i:(Int)->Int)=b.groupBy(i).any{(_,v)->v.size>2}
if(f{(it-1)/3}|| f{it%3}|| listOf(l(1,5,9),l(3,5,7)).any{b.containsAll(it)}){return p%2+1 to o}
b to a+p}.let{null}
fun l(vararg l:Int)=l.toList()

data class Test(val moves: List<Int>, val winner: Int, val move: Int)

val tests = listOf(
        Test(listOf(3, 5, 6, 7, 9, 8, 1, 2, 3), 1, 5),
        Test(listOf(2, 3, 4, 5, 6, 7, 1, 8, 9), 2, 6),
        Test(listOf(1, 2, 4, 5, 6, 7, 3, 8, 9), 2, 8),
        Test(listOf(1, 2, 3, 5, 4, 7, 6, 8, 9), 2, 8)
)

fun main(args: Array<String>) {
    tests.forEach { (input, winner, move) ->
        val result = f(input)
        if (result != winner to move) {
            throw AssertionError("$input ${winner to move} $result")
        }
    }
}

Tio

TryItOnline


1

পাইথন 2 , 170 বাইট

q=map(input().index,range(1,10))
z=zip(*[iter(q)]*3)
o='',
for l in[q[2:7:2],q[::4]]+z+zip(*z):
 r=[n%2for n in l];y=all(r)*2+1-any(r)
 if y:o+=[max(l)+1,y],
print min(o)

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস চেষ্টা করে দেখুন

#swap cell number / turn
q=map(input().index,range(1,10))
#split in 3 parts (rows)
z=zip(*[iter(q)]*3)
#starting value for the list with the results
#since string are "greater" than lists, this will
#be the output value when there is a draw
o='',
#iterate over diagonals, rows and columns
for l in[q[2:7:2],q[::4]]+z+zip(*z):
 #use %2 to separate between player 1 and 2
 r=[n%2 for n in l]
 #store in y the value of the player if the trio is a valid win, 0 otherwise
 #it's a win if all moves are from the same player
 y=all(r)*2+1-any(r)
 #if y has a valid player, add the highest turn of the trio, and the player to o
 if y:o+=[max(l)+1,y],
#output the smaller turn of the valid winning trios
print min(o)


1

পাইথন 3.6+, 137 বাইট

n=m=c=z=0
for a in input():m+=1<<~-int(a);c+=1;z=z or f'{c&1}:{c}'*any(m&t==t for t in[7,56,448,73,146,292,273,84]);n,m=m,n
print(z or-1)

আউটপুট ফর্ম্যাট winner number:roundবা -1টাই করার জন্য। প্লেয়ার 2 0প্লেয়ার 1 হ'ল 1। 1-ইনডেক্সেড বর্গ সংখ্যার একটি অপরিবর্তিত স্ট্রিং আকারে ইনপুট।


1

জেলি , 35 বাইট

9s3,ZU$$;ŒD$€Ẏf€⁸L€3e
s2ZÇƤ€ZFTḢ;Ḃ$

একটি মোনাডিক লিঙ্কটি মুভগুলির একটি তালিকা নেয় এবং একটি তালিকা ফেরত দেয়, [move, player]যেখানে খেলোয়াড়দের চিহ্নিত করা হয় 1(প্রথমে অভিনয় করা) এবং 0(দ্বিতীয়টি অভিনয় করা)।

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

কিভাবে?

9s3,ZU$$;ŒD$€Ẏf€⁸L€3e - Link 1: any winning play?: list of player's moves:
9s3                   - (range of) nine split into threes = [[1,2,3],[4,5,6],[7,8,9]]
       $              - last two links as a monad:
      $               -   last two links as a monad:
    Z                 -     transpose = [[1,4,7],[2,5,8],[3,6,9]]
     U                -     upend     = [[7,4,1],[8,5,2],[9,6,3]]
   ,                  -  pair = [[[1,2,3],[4,5,6],[7,8,9]],[[7,4,1],[8,5,2],[9,6,3]]]
           $€         - last two links as a monad for €ach:
         ŒD           -   diagonals = [[1,5,9],[2,6],[3],[7],[4,8]] or [[7,5,3],[4,2],[1],[9],[8,6]]
        ;             -  concatenate = [[1,2,3],[4,5,6],[7,8,9],[1,5,9],[2,6],[3],[7],[4,8]] or [[7,4,1],[8,5,2],[9,6,3],[7,5,3],[4,2],[1],[9],[8,6]]
             Ẏ        - tighten = [[1,2,3],[4,5,6],[7,8,9],[1,5,9],[2,6],[3],[7],[4,8],[7,4,1],[8,5,2],[9,6,3],[7,5,3],[4,2],[1],[9],[8,6]]
                      -    i.e.:    row1    row2    row3    diag\   x     x   x   x     col1    col2    col3    diag/   x     x   x   x
                      -    where x's are not long enough to matter for the rest...
                ⁸     - chain's left argument, list of player's moves
              f€      - filter to keep those moves for €ach of those lists to the left
                 L€   - length of €ach result
                   3e - 3 exists in that? (i.e. were any length 3 when filtered down to only moves made?)

s2ZÇƤ€ZFTḢ;Ḃ$ - Main link: list of the moves  e.g. [2,3,4,5,6,7,1,8,9]
s2            - split into twos                    [[2,3],[4,5],[6,7],[1,8],[9]]
  Z           - transpose                          [[2,4,6,1,9],[3,5,7,8]]
    Ƥ€        - for Ƥrefixes of €ach:
   Ç          -   call last link (1) as a monad     [0,0,0,0,0] [0,0,1,1]
      Z       - transpose                          [[0,0],[0,0],[0,1],[0,1],[0]]
       F      - flatten                            [0,0,0,0,0,1,0,1,0]
        T     - truthy indices                     [          6   8  ]
         Ḣ    - head (if empty yields 0)           6
            $ - last two links as a monad:
           Ḃ  -   modulo by 2 (evens are player 2) 0
          ;   -   concatenate                      [6,0]

0

পাইথন 2, 168 বাইট

import itertools as z
f=lambda g:next(([i%2+1,i+1]for i in range(9) if any(c for c in z.combinations([[0,6,1,8,7,5,3,2,9,4][j]for j in g[i%2:i+1:2]],3)if sum(c)==15)),0)

টাইয়ের জন্য আউটপুট (প্লেয়ার, রাউন্ড) বা 0

গেমটি 3-বাই-3 ম্যাজিক স্কোয়ারে মানচিত্র করুন এবং 3 টি ওএস বা এক্স এর সেট সন্ধান করুন যা 15 এর সমষ্টি।


0

পরিষ্কার , 244 ... 220 বাইট

import StdEnv
f[a,b]i#k= \l=or[and[isMember(c+n)(take i l)\\c<-:"123147159357"%(j,j+2)]\\j<-[0,3..9]&h<-:"\0\0",n<-[h-h,h,h+h]]
|k a=(1,i*2-1)|i>4=(0,0)|k b=(2,i*2)=f[a,b](i+1)
@l=f(map(map((!!)l))[[0,2..8],[1,3..7]])1

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

hএতে পুনরুক্ত হওয়া স্ট্রিংটিতে অ- প্রিন্টেবল রয়েছে এবং এটি সমান "\003\001\000\000"


0

পাইথন 2 , 140 136 134 বাইট

lambda a,i=0:i<9and(any(set(a[i%2:i+1:2])>=set(map(int,t))for t in'123 456 789 147 258 369 159 357'.split())and(i%2+1,i+1)or f(a,i+1))

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

সম্পাদনা: এরিক আউটগলফার থেকে 4 বাইট + 2 বাইট থেক্স

কোনও বিজয়ী না থাকলে একটি টিপল (প্লেয়ার নাম্বার, রাউন্ড নাম্বার) বা মিথ্যা আউটপুট দেয়।



@ এরিক - ইয়াহ, আমার আগেই এটি করা উচিত ছিল; তবে আমি ফ্লুটির সাথে লড়াই করছি এবং আমার চোখগুলি ব্যথা করছে :) :) ধন্যবাদ!
চ্যাস ব্রাউন

ভাল, শীঘ্রই সুস্থ হয়ে উঠুন। :)
এরিক আউটগল্ফার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.