টিক ট্যাক টো অভিধান


17

একটি TicTacToeখেলা একটি স্ট্রিং অবস্থানের ক্রম বাচক খেলোয়াড়দের তাদের পদক্ষেপ হিসাবে প্রতিনিধিত্ব করা যেতে পারে।

0 1 2
3 4 5
6 7 8

ধরে নিন Xসবসময় প্রথম খেলা হয়।

সুতরাং "012345678" এর একটি স্ট্রিং গেমটিকে বোঝায়

XOX
OXO
XOX

লক্ষ্য করুন, গেমটি ইতিমধ্যে প্লেয়ারের Xচিহ্ন অর্জন করা হয় 6, সেই সময়ে গেমটি শেষ হয় এবং একটি জয় দেয় X। (যেমন, কোনও খেলোয়াড় জিতলেই অবশিষ্ট পদক্ষেপগুলি উপেক্ষা করুন)

আপনার চ্যালেঞ্জ (কোড) হ'ল সমস্ত গেম (সাজানো ক্রম) এবং এর ফলাফল মুদ্রণ করা।

ফর্ম্যাট

<movesequence>:<result>\n

উদাহরণ:

012345678:X
012345687:X
012345768:X
...

বোঝাতে X1 ম প্লেয়ার বিজয়ী জন্য Oদ্বিতীয় প্লেয়ারের জন্য, এবং Dজন্য আঁকে।

থাকবে 9!(362880) গেম।

আপনার ফলাফল যাচাই করার জন্য এখানে কিছু তথ্য রয়েছে।

'X' Wins: 212256 
'O' Wins: 104544 
Draws : 46080 

এটি একটি কোডগল্ফ এবং রানটাইমটি এক মিনিটের মধ্যে হওয়া উচিত। আনন্দ কর!

সম্পাদনা: অতিরিক্ত বিশদ সরিয়ে ফেলা হয়েছে এবং কেবল এটি মুদ্রণ করুন stdout। কোনও ফাইল তৈরি করার দরকার নেই।


2
আমি এখানে বিভিন্ন সংখ্যা পাচ্ছি: এক্স এর জন্য 212256 জিতেছে, হে ও 46080 ড্রয়ের জন্য 104544 জিতেছে (এবং উইকিপিডিয়া আমার সাথে একমত বলে মনে হচ্ছে )।
ভেন্টোরো

@ ভেন্তোরো, আমি পুনরুদ্ধার করব, তবে পৃষ্ঠায় এই সংখ্যাগুলির কোনও রেফারেন্স দেখতে পাচ্ছি না।
st0le

@ ভেন্তোরো, আপনি ঠিক বলেছেন, আমি সেই অংশটি সম্পাদনা করব। শীঘ্রই md5sum পোস্ট করা হবে।
st0le

1
রুবি উত্তরটি সবচেয়ে কম নয়, সুতরাং এটি আপনার স্কোরিং মানদণ্ড (কোড-গল্ফ) অনুযায়ী গ্রহণযোগ্য উত্তর হওয়া উচিত নয়।
mbomb007

উত্তর:


3

রুবি 1.9, 201 অক্ষর

r=*[*l=0..8,0,3,6,1,4,7,2,5,8,0,4,8,2,4,6].each_slice(3)
w=->a{r.any?{|b|b&a==b}}
[*l].permutation(9){|a|u=[[],[]];i=-1
u[i%2]<<a[i+=1]while !((x=w[u[1]])||o=w[u[0]])&&i<8
puts a*""+":#{x ??X:o ??O:?D}"}

সামান্য গল্ফ এ পর্যন্ত। এখানে সম্পূর্ণ করতে প্রায় 45 সেকেন্ড সময় নেয়।

  • সম্পাদনা করুন: (268 -> 249) কোনও ফাইলের পরিবর্তে স্টডআউটে লিখুন
  • সম্পাদনা করুন: (249 -> 222) প্রতিটি খেলোয়াড়ের চাল দিয়ে অ্যারেটি পূর্বে পূরণ করবেন না।
  • সম্পাদনা করুন: (222 -> 208) কোনও খেলোয়াড় জিতেছে কিনা তা খুঁজে পাওয়ার জন্য ছোট উপায়
  • সম্পাদনা করুন: (208 -> 213) 213 এ ফিরে, পূর্ববর্তী সমাধানটি খুব ধীর ছিল।
  • সম্পাদনা করুন: (213 -> 201) কিছু পুনর্বিন্যাস, সরিয়ে নেওয়া সাদা স্থান

আমি প্রশ্নটি কিছুটা সম্পাদনা করেছি, আপনার এখন কোনও ফাইল তৈরি করার দরকার নেই, কেবল এটি মুদ্রণ করুন।
st0le

4

জে, 124 অক্ষর

((],~':',~1":[){&'DOX'@(</+2*>/)@:(<./"1)@:(((2{m/.@|.),(2{m/.),m"1,>./)"2)@(<:@(>:%2|]),:(%(2|>:)))@(3 3$]))"1((i.!9)A.i.9)

এক্স জয়, ও জয় এবং অঙ্কন গণনা পরীক্ষা করে দেখুন।

যদিও ডিবাগ করতে কিছুটা বেদনাদায়ক ছিল। :)


3

হাস্কেল, 224 222 টি অক্ষর

import Data.List
p=sort.permutations
a(e:_:z)=e:a z;a z=z
[c,d]%(e:z)|any((`elem`words"012 345 678 036 147 258 048 246").take 3).p.a.reverse$e=c|1<3=[d,c]%z;_%[]='D'
main=putStr$p['0'..'8']>>=(\s->s++':':"OX"%inits s:"\n")

হায়রে, permutationsফাংশনটি Data.Listলেক্সোগ্রাফিক ক্রমে ক্রমানুসারে উত্পাদন করে না। সুতরাং আমি বাছাই করতে 6 অক্ষর ব্যয় করতে হবে।


2

এপিএল (139)

এটি সম্ভবত আরও সংক্ষিপ্ত করা যেতে পারে, তবে এটি যেমন ছিল তেমন শক্ত। বিশ্বাস করুন বা না রাখুন, এটি আমার কম্পিউটারে প্রায় 45 সেকেন্ডের মধ্যে চলে আসে (যখন পর্দায় আউটপুট আসে তখন সমস্ত কিছু আউটপুট নিতে সময় নেয় না)।

↑{⊃,/(,/⍕¨⍵-1),':',{1∊T←↑{∨/↑{⍵∘{⍵≡⍵∧⍺}¨↓⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔'}¨↓(M∘.≥M)∧[2]M∊⍵}¨↓⍉5 2⍴0,⍨⍵:'XO'[1+</+/T]⋄'D'}⍵}¨↓{1≥⍴⍵:↑,↓⍵⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵}M←⍳9

ব্যাখ্যা:

  • M←⍳9: এম থেকে 1 থেকে 9 নম্বরগুলিতে স্টোর করুন অভ্যন্তরীণভাবে, এই প্রোগ্রামটি 0..8 এর পরিবর্তে 1..9 ব্যবহার করে।
  • {... }: সমস্ত অনুমতি পেতে একটি ফাংশন:
    • 1≥⍴⍵:↑,↓⍵: দৈর্ঘ্য যদি ছোট বা 1 এর সমান হয় তবে যুক্তিকে ম্যাট্রিক্স হিসাবে ফিরিয়ে দিন।
    • ⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵: অন্যথায়, প্রতিটি অক্ষর অপসারণ থেকে , যে একাধিক বিন্যাসন পেতে, এবং চরিত্রের ফিরে যোগ করুন।
  • ¨↓: প্রতিটি আদেশের জন্য ...
  • {... }: এমন ক্রিয়াকলাপ যা বিজয়ীকে সেই অনুমানের জন্য দেয়:
    • ⊃,/(,/⍕¨⍵-1),':',{... }⍵: স্ট্রিং হিসাবে ক্রমশক্তিটি পান, সমস্ত সংখ্যা 1 দিয়ে কমে যায় (1.9 এর পরিবর্তে প্রয়োজনীয় 0..8 আউটপুট পেতে), পরে একটি কোলন থাকে, তারপরে বিজয়ী বর্ণিত চরিত্রটি অনুসরণ করে:
      • ⍉5 2⍴0,⍨⍵: এক্স দ্বারা মুভিগুলি ও এর চালনা থেকে পৃথক করুন Because কারণ ও এর এক্স এর চেয়ে কম একটি চাল আছে, সেই স্থানটি ভরাট 0, যা অব্যবহৃত এবং ফলে ফলাফলকে প্রভাবিত করে না।
      • {... }¨↓: এক্স বোর্ড এবং ও বোর্ড উভয়ের জন্য, নিম্নলিখিত ফাংশনটি চালান যা নয়টি টাইমস্টেপের কোনওটিতে জয় রয়েছে কিনা তা নির্ধারণ করে:
        • (M∘.≥M)∧[2]M∊⍵: পদক্ষেপ সংখ্যার থেকে একটি bitboard এবং জেনারেট করুন andbitstrings সঙ্গে এই bitboard 100000000, 110000000... 111111111সময় নয়টি মুহূর্তের প্রতিটি বোর্ডের রাষ্ট্র জন্য।
        • {... }¨↓: এগুলির প্রত্যেকের জন্য, নিম্নলিখিত ফাংশনটি চালান:
          • ⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔': প্রতিটি সম্ভাব্য বিজয়ী পরিস্থিতির জন্য বিটবোর্ডগুলি পান
          • ⍵∘{⍵≡⍵∧⍺}¨↓: andবর্তমান বিটবোর্ড সহ প্রতিটি বিজয়ী রাষ্ট্র এবং যদি জিতের অবস্থা এখনও আছে কি না তা পরীক্ষা করে দেখুন
        • ∨/↑: orএই একসাথে, এই বিটবোর্ডে একটি জয় আছে কিনা তা প্রদান করে
      • 1∊T←↑: প্রথম সারিতে 9 এক্স-টাইমস্টেপ এবং দ্বিতীয় সারিতে 9 ও-টাইমস্টেপগুলি দিয়ে একটি 9x2 ম্যাট্রিক্স তৈরি করুন। এটি টিতে সঞ্চয় করুন this এই ম্যাট্রিক্সে যদি 1 থাকে তবে কেউ জিতেছে।
      • :'XO'[1+</+/T]: যদি কেউ জিতে থাকে তবে 'এক্স' বা 'ও' দিন যার উপরের উপর নির্ভর করে 1
      • ⋄'D': কেউ না জিতলে 'ডি' দিন।
  • : এগুলি থেকে একটি ম্যাট্রিক্স তৈরি করুন যাতে সেগুলি পৃথক সারিতে প্রদর্শিত হয়।

1

পাইথন উংগল্ফড

from itertools import*
r=range
W=[[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
def c(B):
    for i in r(8):
                if B[W[i][0]]==B[W[i][1]]==B[W[i][2]]:
                        return 1
        return 0

for i in permutations('012345678',9):
    B=[]
    for j in r(9):
        B.append(-(j+1))
    k=0
    F=1
    for j in r(9):
        k=[1,0][k]
        B[int(i[j])]=k
        if c(B):
            F=0
            break
    print "".join(i),':',[['0','X'][k],'D'][F]

আপনার দ্বিতীয় permutations
প্যারামের

3
আপনার প্রোগ্রাম গল্ফ করুন।
mbomb007

1

সি ++ অবহেলিত

#include<iostream>
using namespace std;
#include<algorithm>

int check(int B[])
{
        for (int i=0;i<3;i++)
                if ((B[3*i]==B[3*i+1]&&B[3*i]==B[3*i+2]) || (B[i]==B[i+3]&&B[i]==B[i+6]))
                        return 1;
        if ((B[2]==B[4]&&B[2]==B[6]) || (B[0]==B[4]&&B[0]==B[8]))
                return 1;
        return 0;               
}
int main()
{
        char c[11]="012345678";
        int B[9],i,j;
        do{
                for (i=0;i<9;i++)B[i]=-(i+1);
                for (i=0,j=1;i<9;i++,j=j?0:1)
                {
                        B[c[i]-'0']=j;
                        if (check(B))
                                break;
                }
                printf("%s:%c\n",c,i<9?j?'X':'O':'D');
        }while (next_permutation(c,c+9));
}

4
আপনার প্রোগ্রাম গল্ফ করুন।
mbomb007

1

পাইথন 2.7 (237)

from itertools import*
for z in permutations('012345678'):
 k,F=0,[9]*9
 for h in z:
    F[int(h)]=k=1-k
    if any(sum(a)in(0,3)for a in(F[:3],F[3:6],F[6:],F[::3],F[1::3],F[2::3],F[::4],F[2:8:2])):break
 else:k=2
 print"".join(z)+':','OXD'[k]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.