ডি টিক টেক টো উই চেকারটিতে একটি এন তৈরি করুন


13

একটি এন ডি টিক ট্যাক টো খেলায় কে জিতেছে তা পরীক্ষা করতে সংক্ষিপ্ততম প্রোগ্রাম তৈরি করুন ।

যখন আপনার nপ্রস্থ (প্রস্থ) এবং d(মাত্রা নম্বর) এই ব্যাপ্তিতে থাকবে তখন আপনার প্রোগ্রামটি কাজ করা উচিত :

n∈[3,6]∩ℕ  ie a number from this list: 3,4,5,6
d∈[2,5]∩ℕ  ie a number from this list: 2,3,4,5

n = 3; d = 2(3 2 অর্থাৎ 3 দ্বারা 3):

[][][]
[][][]
[][][]

n = 3; d = 3(3 3 অর্থাৎ 3 বাই 3 বাই 3):

[][][]
[][][]
[][][]

[][][]
[][][]
[][][]

[][][]
[][][]
[][][]

n = 6; d = 2(6 2 অর্থাৎ 6 দ্বারা 6):

[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]

ইত্যাদি।

বিজয়ী (যদি আপনি যথেষ্ট পরিমাণে বহুমাত্রিক টিক টেক খেলেন তবে এটি একই is

সেখানে জয় পাওয়ার জন্য, একজন খেলোয়াড়ের অবশ্যই একটি লাইনের সাথে সংলগ্ন সমস্ত স্কোয়ার থাকতে হবে। অর্থাৎ, সেই খেলোয়াড়ের nবিজয়ী হওয়ার জন্য অবশ্যই একটি লাইনে নড়াচড়া করতে হবে।

সংলগ্ন:

  • প্রতিটি টালি একটি পয়েন্ট; উদাহরণস্বরূপ (0,0,0,0,0) হল একটি পয়েন্টd=5
  • সংলগ্ন টাইলস টাইলস যেমন তারা একই ইউনিট ডি-কিউবে উভয় পয়েন্ট। অন্য কথায়, টাইলগুলির মধ্যে চেবিশেভ দূরত্ব 1।
  • অন্য কথায়, যদি একটি বিন্দু একটি বিন্দুটির pসাথে সংলগ্ন হয় qতবে pতার সাথে সংশ্লিষ্ট স্থানাঙ্কের প্রতিটি স্থানাঙ্ক qএটির চেয়ে আলাদা হয় না। অতিরিক্তভাবে, অন্তত স্থানাঙ্ক জুটিতে ঠিক একের দ্বারা পৃথক হয়।

লাইনস:

  • লাইনগুলি ভেক্টর এবং একটি টাইল দ্বারা সংজ্ঞায়িত করা হয়। সমীকরণ দ্বারা আঘাত করা প্রতিটি টাইল একটি লাইন:p0 + t<some vector with the same number of coordinates as p0>

ইনপুট :

ইনপুটটি STDIN এ হবে। ইনপুটটির প্রথম লাইনটি দুটি সংখ্যা nএবং dফর্মের হবে n,d

এরপরে স্থানাঙ্কের সমন্বয়ে একটি লাইন হবে যা চলমানগুলি নির্দিষ্ট করে। স্থানাঙ্ক আকারে তালিকাভুক্ত হবে: 1,1;2,2;3,3। উপরের বাম কোণটি মূল (2D এর জন্য 0,0)। সাধারণ ক্ষেত্রে, এই তালিকাটি এমন হবে 1,2,...,1,4;4,0,...,6,0;...যেখানে প্রথম সংখ্যাটি বাম-ডান-নেস, দ্বিতীয় আপ-ডাউন-নেস, তৃতীয় মাত্রার মধ্য দিয়ে তৃতীয় ইত্যাদি উপস্থাপন Xকরে হয় Oপ্রথম পালা, ....

ইনপুটটি একটি নতুন লাইন অনুসরণ করবে।

আউটপুট :

আউটপুট STDOUT এ হবে। কেউ জিতলে কে জিতল বা টাই হলে তা সহজভাবে নির্দেশ করুন। এটি যদি টাই বা জয় না হয় তবে কিছুই আউটপুট করবেন না।

অতিরিক্তভাবে, একটি সরানো সংঘর্ষ রয়েছে কিনা তা নির্দেশ করুন, অর্থাত্ যদি একই জায়গায় কমপক্ষে দুটি চাল থাকে।

যদি ইনপুটটি শেষ হওয়ার আগে যদি জয় / ড্র হয় তবে আপনার প্রোগ্রামটি যা চায় তা করতে পারে।

পরীক্ষার কেস (যে কেউ আরও কিছু বলতে চান?):

ইনপুট:

4,3
0,0,0;1,1,1;1,0,1;2,0,2;0,0,1;2,0,0;2,0,1;3,0,2;3,0,1

উদাহরণ আউটপুট:

X wins

আর একটি সম্ভাব্য আউটপুট (ব্যাখ্যা প্রয়োজন):

1

তির্যকটি বরাবর সরলরেখাগুলি কী তা নির্ধারণ করার জন্য আপনি কীভাবে মাত্রাগুলির টপোলজিটি n> 3 সংজ্ঞায়িত করছেন? উদাহরণস্বরূপ, 3 টি সংলগ্ন কোণে কোনও লাইন 3 3 বোর্ডে একটি বিজয় গঠন করে? প্রতিটি 3² বিমানের মধ্যবর্তী বর্গগুলি কি অন্য প্লেনের প্রতিটি পয়েন্টের সাথে সংযুক্ত থাকে যা এন-কিউবে এর সাথে একটি কিনারা ভাগ করে দেয়?
কমিন্টার্ন

1
@ কমনটার্ন কীভাবে এটি (আমি সম্ভবত ব্যাখ্যাটি বোকার করেছি definitely স্পষ্টতই সহজ হতে পারে)।
জাস্টিন

দ্রষ্টব্য: সংলগ্ন টাইলসের জন্য আপনি যে সংজ্ঞা দিয়েছেন তা সমান নয় (যেমন এটি ম্যানহাটনের দূরত্বের সমান নয়)।
হাওয়ার্ড

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

1
আমার মনে হচ্ছে প্রোলগের খুব সংক্ষিপ্ত সমাধান হওয়া উচিত ...
ন্যাট এল্ড্রেজ

উত্তর:


3

পাইথন, 745 578 টি অক্ষর

import sys
x=[]
o=[]
t=1
b=","
k=map
def m(c):
 m=x if t else o
 c=k(int,c.split(b))
 if c in o+x:
  print b
  sys.exit()
 m.append(c)
 r=0
 for p in m:
  r=w(p,m)
 return r
def w(p,m):
 for q in m:
  d=max(k(lambda x,y:abs(x-y),p,q))
  if d==u:
   if e(p,q,m):
    return 1
 return 0
def e(p,q,m):
 v=k(lambda p,q:(p-q)/u,q,p)
 l=p
 for i in range(1,n):
  y=k(lambda j,h:j+h,l,v)
  if y not in m:
   return 0
  l=y
 if not l==q:
  return 0
 return 1
q=sys.stdin.readline
d=q()
v=q()
z=d.split(b)
(n,d)=k(int,z)
a=v.split(";")
u=n-1
for c in a:
 r=m(c)
 if r:
  print t
 t=not t

আমি কিছু পরিবর্তন করেছি এবং এটি কিছুটা সঙ্কুচিত করেছি। লক্ষ করুন যে সত্যের প্রত্যাবর্তনের অর্থ x জিতেছে, মিথ্যাটির অর্থ y জিতেছে এবং এর অর্থ একটি অবৈধ পদক্ষেপ করা হয়েছিল।


কিছু জিনিস: পরিবর্তন import *করতে import*1সত্য এবং 0মিথ্যা (অপসারণ Tএবং F) এর জন্য ব্যবহার করুন । return -1হতে পারে return-1(স্থান অপসারণ চেক আউট)। আপনার পদ্ধতিগুলি একক চর পদ্ধতিতে পুনর্নবীকরণ করুন। আরও অনুকূলিতকরণের জন্য টিপস পরীক্ষা করে দেখুন।
জাস্টিন

ওহ, ধন্যবাদ, আমি জানতাম না যে আপনি সেগুলি কিছু করতে পারেন (যথা, ফিরতি এবং -1 এর মধ্যে স্থান সরিয়ে ফেলুন)
48-এ

আমি আপনার কোডটিতে কিছুটা গল্ফ করেছিলাম (এটি সমস্ত বৈধ হতে পারে না)। ফলাফলটি এখানে: আইডিয়োনেড / এলডি 2 জেএএইচ । আপনার উত্তরটি দিয়ে আবার যান এবং কোডটি যতটা সম্ভব সংক্ষিপ্ত করুন। টিপস পাইথন জন্য প্রশ্ন খুবই দরকারী
জাস্টিন

@ ফুটা আপনি এর if l<>q:পরিবর্তে করতে পারেন if not l==q:
mbomb007

3

উত্তর নয় - জাভা

একটি উত্সাহিত এন, ডি এর জন্য কতগুলি বিভিন্ন উপায়ে জয়ের ছিল তা জানতে আগ্রহী ছিলাম তাই আমি সমস্ত কোডের তালিকা তৈরি করতে এই কোডটি লিখেছিলাম।

import java.util.*;

public class MultiDTTT {
    static Set<Win> wins = new HashSet<Win>();
    static final int d = 3;
    static final int n = 3;
    static final char maxChar = (char)(n-1) + '0'; 

    public static void main(String[] args) throws Exception {
        String pad = "";
        for(int i=0; i<d; i++) pad = pad + "0";
        for(int i=0; i<Math.pow(n,d); i++) {
            String s = Integer.toString(i,n);
            s = pad.substring(s.length()) + s;
            buildWin(s,"",0);
        } 
        System.out.println(wins.size());
        for(Win w : wins) System.out.println(w.toString());
    }

    static void buildWin(String s, String p,int i) {
        if(i<d) {
            if(s.charAt(i) == '0') {
                buildWin(s,p+"u",i+1);
                buildWin(s,p+"s",i+1);
            }
            else if(s.charAt(i) == maxChar) {
                buildWin(s,p+"d",i+1);
                buildWin(s,p+"s",i+1);
            }
            else {
                buildWin(s,p+"s",i+1);
            }
        }
        else {
            if(p.contains("u") || p.contains("d")) wins.add(new Win(s,p));
        }
    }

    static class Win {
        String start;
        String pattern;
        Set<String> list = new HashSet<String>();

        Win(String s, String p) {
            start = s;
            pattern = p;
            char[] sc = s.toCharArray();
            for(int i=0; i<n; i++) {
                list.add(new String(sc));
                for(int j=0; j<d; j++) {
                    switch (p.charAt(j)) {
                        case 'u':
                            sc[j]++;
                            break;
                        case 'd':
                            sc[j]--;
                            break;
                        case 's':
                            break;
                    }
                }
            }
        }

        public String toString() {
            String s = ""; //start + ", " + pattern + "\n    ";
            for(String ss : list) s = s + ss + " ";
            return s;
        }

        public boolean equals(Object x) {
            return (x instanceof Win) && this.list.equals(((Win)x).list);
        }
        public int hashCode(){
            return list.hashCode();
        }
    }
}

আমি এটি এন, ডি = 2..3,2..3 এ হাত পরীক্ষা করেছি এবং এটি কাজ করছে বলে মনে হচ্ছে ... তারপরে জয়ের সম্ভাব্য উপায়গুলির সংখ্যা নীচে প্রদর্শিত হিসাবে দ্রুত বাড়ছে:

n       1       2       3       4       5       6
d                           
1       1       1       1       1       1       1
2       1       6       8       10      12      14
3       1       28      49      76      109     148
4       1       120     272     520     888     1400
5       1       496     1441    3376    6841    12496
6       1       2016    7448    21280   51012   107744

সমস্ত ওয়াইনিং সেট জেনারেট করে, আমি বিজয়ী সেটগুলির বিরুদ্ধে প্রদত্ত ইনপুটটি পরীক্ষা করতে প্রোগ্রামটি বাড়িয়ে দিতে পারি তবে অবশ্যই, এই পদ্ধতিটি কখনই গল্ফকে জিততে পারে না। সুতরাং আমি এখানে থামার জন্য সন্তুষ্ট ছিলাম - এটির মতো দেখে মনে হচ্ছিল যে এন এবং ডি এর ফাংশন হিসাবে জয়ের কতগুলি উপায়ের জন্য আমি একটি বদ্ধ-ফর্ম সমাধান খুঁজে পেতে পারি ... এটি জয়ের উপায়গুলির সংখ্যা = 0.5 ((এন + 2) ^ d - n ^ d)।


2

সি ++ 794 849 অক্ষর

#include <algorithm>
#include <iostream>
#include <cmath>
#include <string>
#define _ return
#define Y int
#define Z(a) cout<<#a
#define W(a,b,c) for(a=c;a++<b;)
using namespace std;Y n,d,A[5],P[6],T=1,x[7776]={},i,j,k,a,z,p=pow(n,d);char c;bool B;string s;Y K(){a=P[j];W(k,i,0)a/=n;_ a%n;}Y M(){j=0;z=K();W(j,n,1){if(K()!=z){_ 1;}}_ 0;}Y N(){W(j,n,0)if(K()!=n-1-j)_ 1;_ 0;}Y O(){W(j,n,0)if(K()!=j)_ 1;_ 0;}Y S(){z=0;W(i,d,0){z*=n;z+=A[i];}_ z;}Y C(){a=z=0;W(i,p,0){if(s[i]-'0'){P[z]=i;++z;if(a){if(x[i]!=a)_ 0;}else a=x[i];}}_ a;}Y L(){W(i,d,0)if(M()*N()*O())_ 0;_ 1;}Y main(){cin>>n>>c>>d;while(1){W(i,d,0)B=cin>>A[i]>>c;if(x[S()]){Z(!);_ 0;}x[S()]=T;T*=-1;if(!B)break;}W(i,p,0)i<n?s+="1":s+="0";do if(C()&&L()){C()==1?Z(X):Z(O);_ 0;}while(prev_permutation(s.begin(),s.end()));_ 0;}

আউটপুটটি হ'ল: "এক্স" (এক্স জিতল), "ও" (হে জয়), বা "!" (অবৈধ পদক্ষেপের প্রচেষ্টা)।

এটি কেবল বিন্দুটিকে একটি রৈখিক অ্যারে হিসাবে মানচিত্র করে এবং আকার এন এর সমস্ত সম্ভাব্য উপসর্গ পরীক্ষা করে, প্রথমে এক্স বা ও এ স্থির থাকার জন্য এবং তারপরে একটি লাইনে থাকার জন্য। একটি লাইনে থাকার জন্য পরীক্ষা করতে, প্রতিটি উপসেটের পয়েন্টগুলির স্থানাঙ্কগুলি একবারে একবার পরীক্ষা করা হয়; এগুলির প্রত্যেকটি অবশ্যই হয় 0 থেকে এন -1 এ বৃদ্ধি পাবে, এন -1 থেকে 0 বা কমে যেতে হবে। পয়েন্টগুলি স্বাভাবিকভাবেই রৈখিক অ্যারেতে অর্ডার করা হয়, সুতরাং নির্দিষ্ট পয়েন্টগুলির একটি সেটের জন্য ক্রমবর্ধমান বা হ্রাসকারীকে কল করা অর্থহীন।

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

কুইঞ্চুনসের সাথে সংহতি জানিয়ে, আমাকে উল্লেখ করতে হবে যে সি ++ উত্তর জিতলে এটি ট্র্যাভেস্টি হবে


1
আমি মনে করি যে আপনি যখন বলতে পারেন যে লাইনে থাকার ফলে পাটিগণিতের অগ্রগতি বোঝায়, তবে এটি অন্যভাবে গোল করে না (উদাহরণস্বরূপ 0,2,4 স্ট্যান্ডার্ড 3,2 টিক ট্যাক টো এর সমাধান হবে না)।
হাওয়ার্ড

@ হওয়ার্ড, ধন্যবাদ আমি সংশোধন করেছি। এটি গল্ফ করা শেষ করতে আমার এখন অনেক দেরি হয়ে গেছে, তবে আমি এটি ঠিক করতে সক্ষম হয়েছি (আমার মনে হয়)।
এরিক ট্রেসারার

আপনি বিভিন্ন আউটপুট ব্যবহার করে আরও গল্ফ করতে পারেন। আপনাকে ঠিক বলতে হবে না X winsবা O wins। যতক্ষণ আপনি আপনার উত্তরে তারা কী দাঁড়ায় তা ব্যাখ্যা না করা পর্যন্ত আউটপুট 1বা 2(বা কিছু অন্যান্য প্রকরণ) এর জন্য এটি পুরোপুরি বৈধ । যেমনটি আমি বলেছি (জোর দেওয়া হয়েছে): " কে জিতবে তা নির্দেশ করুন "।
জাস্টিন

সম্পন্ন. এবং যদি আমি শিখতে পারি যে টের্নারি অপারেটর কীভাবে কাজ করে তবে আমি কয়েকটি অক্ষর সংরক্ষণ করতে পারি।
এরিক ট্রেসারার

সম্পর্ক সম্পর্কে কি?
জাস্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.