टिक-टैक-टो खेल


15

N d खेलने के लिए एक निर्धारक कार्यक्रम बनाएंअन्य प्रतियोगियों के साथ tic-tac-toe ।

आपका कार्यक्रम तब काम करना चाहिए जब n(चौड़ाई) और d(आयाम संख्या) इन श्रेणियों में हो:

n∈[3,∞)∩ℕ  ie a natural number greater than 2
d∈[2,∞)∩ℕ  ie a natural number greater than 1

n = 3; d = 2(३ अर्थात ३ बाय ३):

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

n = 3; d = 3(3 3 यानी 3 बाय 3 बाय 3):

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

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

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

n = 6; d = 2(6 2 यानी 6 बाय 6):

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

और इसी तरह।

इनपुट:

इनपुट STDIN को होगा। इनपुट की पहली पंक्ति दो नंबर होगी, nऔर dफॉर्म मेंn,d

इसके बाद एक लाइन होगी जिसमें निर्देशांक चालों को निर्दिष्ट करता है जो किया गया है। निर्देशांक को प्रपत्र में सूचीबद्ध किया जाएगा 1,1;2,2;3,3:। ऊपरी बाएं कोने में मूल (2 डी के लिए 0,0) है। सामान्य स्थिति में, यह सूची ऐसी होगी 1,2,...,1,4;4,0,...,6,0;...जहां पहला नंबर बाएं-दाएं-नेस का प्रतिनिधित्व करता है, दूसरा अप-डाउन-नेस, तीसरा आयाम के माध्यम से तीसरा, आदि ध्यान दें कि पहला समन्वय है।X पहली बारी है, दूसरा। हैO पहली बारी, ....

क्या यह पहला कदम होना चाहिए, इनपुट एक संख्या होगी जिसके बाद 1 रिक्त रेखा होगी।

स्थिरता के लिए, इनपुट हमेशा एक नई रेखा के साथ समाप्त होगा। नमूना इनपुट (\ n newline है):

10,10\n0,0,0,0,0,0,0,0,0,0;0,2,3,4,5,6,7,8,9,0;0,1,2,3,4,5,6,7,8,9\n

पहले कदम के लिए:

10,10\n\n

कहाँ पे \nन्यूलाइन कैरेक्टर है।

आउटपुट:

इनपुट के समान प्रारूप (अल्पविराम से अलग की गई सूची) में आप जिस मूव को बनाना चाहते हैं, उसे आउटपुट करें। एक अमान्य कदम (अर्थात जो पहले ही लिया जा चुका है) के परिणामस्वरूप खेल को नुकसान होगा।

नोट: आप एक यादृच्छिक संख्या जनरेटर का उपयोग कर सकते हैं, जब तक कि आप इसे एक मूल्य के साथ बीज देते हैं जैसे कि प्रत्येक रन समान होता है समान शर्तें दी जाती हैं। दूसरे शब्दों में, कार्यक्रम निर्धारक होना चाहिए।

नोट: केवल मान्य चालों की अनुमति है।

खेल जीतना (यदि आपने पर्याप्त बहु-आयामी टिक टीएसी पैर की अंगुली खेली है, तो यह वही है।)

जीत हासिल करने के लिए, एक खिलाड़ी के पास एक पंक्ति के साथ सभी आसन्न वर्ग होने चाहिए। यानी उस खिलाड़ी के पास होना चाहिएn विजेता होने के लिए एक पंक्ति में आगे ।

सटा हुआ:

  • प्रत्येक टाइल एक बिंदु है; उदाहरण के लिए (0,0,0,0,0) एक बिंदु हैd=5
  • आसन्न टाइलें ऐसी टाइलें हैं जैसे वे एक ही इकाई d- घन पर दोनों बिंदु हैं। दूसरे शब्दों में, चेबीशेव दूरी टाइल्स के बीच 1 है।
  • दूसरे शब्दों में, यदि कोई बिंदु किसी बिंदु pसे सटा हुआ है q, तो प्रत्येक pसंगत qउस में अलग-अलग समन्वय करता है, जिससे वह एक से अधिक न हो। इसके अतिरिक्त, कम से कम समन्वय जोड़ी पर बिल्कुल एक से भिन्न होता है।

लाइन्स:

  • लाइनों को वैक्टर और एक टाइल द्वारा परिभाषित किया गया है। एक पंक्ति समीकरण द्वारा मारा जाने वाला प्रत्येक टाइल है:p0 + t<some vector with the same number of coordinates as p0>

सिमुलेशन और जीतने की स्थिति:

  • अपने उत्तर में बताएं कि क्या यह ग्रेडिंग के लिए तैयार है। यही है, स्पष्ट रूप से इंगित करें कि आपका उत्तर दिया गया है या नहीं।

  • यदि आपका उत्तर पूर्ण के रूप में चिह्नित किया गया है, तो इसे कोड को अंतिम संपादन के कम से कम 24 घंटे बाद तक वर्गीकृत नहीं किया जाएगा।

  • कार्यक्रम ऑफ़लाइन काम करना चाहिए। यदि कोई प्रोग्राम धोखा देता हुआ पाया जाता है, तो यह स्वचालित रूप से एक स्कोर प्राप्त -1करेगा, और आगे स्कोर नहीं किया जाएगा। (उनके कार्यक्रमों को धोखा देने से कोई कैसे समाप्त होगा?)

  • यदि आपका प्रोग्राम अमान्य आउटपुट उत्पन्न करता है, तो इसे तुरंत गेम के लिए नुकसान के रूप में गिना जाता है

  • यदि आप प्रोग्राम 1 मिनट के बाद आउटपुट का उत्पादन करने में विफल रहते हैं, तो इसे तुरंत गेम के लिए नुकसान के रूप में गिना जाता है। यदि आवश्यक हो, तो गति के लिए अनुकूलित करें। मैं एक कार्यक्रम को दूसरे से दूर करने के लिए एक घंटे इंतजार नहीं करना चाहता।

  • प्रत्येक प्रोग्राम अन्य कार्यक्रमों के खिलाफ प्रत्येक के लिए दो बार चलाया जाएगा nरेंज में [3,6]और प्रत्येक dश्रेणी में [2,5]एक बार के रूप में, Xऔर एक बार के रूप में O। यह एक दौर है।

  • प्रत्येक गेम के लिए एक प्रोग्राम जीतता है, वह +3अपने स्कोर पर पहुंच जाता है। यदि कार्यक्रम बंधा हुआ है (एक ही राउंड में 1 जीत और 1 हार या दोनों खेलों के लिए संबंध), तो यह हो जाता है +1। यदि कार्यक्रम खो गया है, तो यह हो जाता है +0(अर्थात कोई परिवर्तन नहीं)।

  • उच्चतम स्कोर जीत के साथ कार्यक्रम। क्या एक टाई होना चाहिए, फिर कम से कम खोए हुए गेम (बंधे हुए प्रतियोगियों में से) के साथ कार्यक्रम जीत जाता है।

नोट: उत्तरों की संख्या के आधार पर, मुझे परीक्षण चलाने में सहायता की आवश्यकता हो सकती है।

सौभाग्य! और सिमुलेशन आपके पक्ष में कभी भी चल सकता है!


विजेता-चेकर चुनौती। <---- यह चुनौती यह सुनिश्चित करने के लिए प्रोग्राम बनाने के लिए है कि क्या कोई निश्चित गेम जीता गया है। यह इस चुनौती से संबंधित है।
जस्टिन

आत्म निहित टैग, जो आपने अभी आविष्कार टैग वर्गीकरण के लिए कुछ भी नहीं जोड़ता है। मुझे लगता है कि आपको इसे हटा देना चाहिए।
हावर्ड

@ हॉवर्ड ठीक है। मैंने देखा कि बहुत सारे प्रश्नों में वह प्रतिबंध था, इसलिए मैंने सोचा कि एक टैग उपयुक्त होगा।
जस्टिन

4
एक अजीब खेल। जीतने का एकमात्र कदम नहीं खेलना है।
german_guy

(w, x, y, z) एक वैध आउटपुट प्रारूप है?
अलेक्जेंडर-ब्रेट

जवाबों:


2

अजगर ३

import random as rand
import re

def generateMoves(width, dim):
    l = [0] * dim
    while existsNotX(l, width - 1):
        yield l[:]
        for i in range(dim):
            if l[i] < width - 1:
                l[i] += 1
                break
            else:
                l[i] = 0
    yield l

def existsNotX(l, x):
    for i in l:
        if i != x:
            return True
    return False

input_s = input()
dims, moves = None, None
#this is to allow input as a single paste, instead of ENTER inputting.
try:
    dims, moves = input_s.splitlines()
except ValueError:
    dims = input_s
    moves = input()

rand.seed(moves + dims)

dims = eval(dims) #change into tuple

moves = moves.split(';')
if len(moves[0]):
    moves = [eval(m) for m in moves] #change into tuples

output =[x for x in generateMoves(dims[0], dims[1]) if x not in moves]
print(re.sub('[^\\d,]', '', str(output[rand.randint(0, len(output))])))

यह बस एक यादृच्छिक एअर इंडिया है। यह यादृच्छिक रूप से उन चालों में से एक चाल का चयन करता है जो अभी भी उपलब्ध हैं।


2

पायथन 2.7

यह एक कार्य-प्रगति प्रगति है जिसे मैं अन्य उत्तरदाताओं को एक कंकाल / प्रेरणा देने के लिए प्रदान कर रहा हूं। यह हर संभव जीतने वाली रेखा को सूचीबद्ध करके काम करता है, फिर उस रेखा को स्कोर करने के लिए कुछ अनुमान लगाने के लिए कि यह कितना मूल्यवान है। वर्तमान में, हेयुरिस्टिक रिक्त (सुपर-गुप्त कामकाज) है। मैंने जीत और क्लैश एरर हैंडलिंग को भी जोड़ा है।

समस्या पर ध्यान दें

कितनी विजयी रेखाएँ हैं? 1-आयामी मामले पर विचार करें; 2 कोने, 1 किनारे और 1 लाइन हैं। 2 आयामों में, हमारे पास 2 रेखाओं से जुड़ने वाले 4 कोने हैं, और 4 छोरें 2 * n लाइनों से जुड़ती हैं। 3 आयामों में, हमारे पास 4 रेखाओं से जुड़ने वाले 8 कोने हैं, 6 * n रेखाओं से जुड़ने वाले 12 किनारे और 6 चेहरे शामिल हैं3*n^2 लाइनों से हैं।

सामान्य तौर पर, हमें एक वर्सेटेक्स 0-फेसेट, एज 1-फेससेट, इत्यादि कहते हैं, फिर N(i)आइ-फैक्ट्स dकी संख्या, आयामों की संख्या और nसाइड की लंबाई को दर्शाते हैं । फिर जीतने वाली लाइनों की संख्या है0.5*sum(N(i)*n^i,i=0..d-1)

प्रति विकिपीडिया, N(i)=2^(d-i)*d!/(i!*(n-1)!)इसलिए अंतिम सूत्र है:

sum(2^(d-i-1) n^i d! / (i! * (n-i)!),i=0..d-1)

जो wolfram | अल्फा को बहुत पसंद नहीं है। यह बहुत जल्दी बहुत बड़ा हो जाता है, इसलिए मैं अपने कार्यक्रम को d> 8 के लिए प्रबंधनीय रनटाइम की उम्मीद नहीं करता हूं।

कुछ परिणाम (फ़ॉर्मेटिंग के बारे में खेद:

d\n 0   1    2      3      4       5        6        7         8         9
0   1   1    1      1      1       1        1        1         1         1
1   2   4    6      8      10      12       14       16        18        20
2   4   11   26     47     74      107      146      191       242       299
3   8   40   120    272    520     888      1400     2080      2952      4040
4   16  117  492    1437   3372    6837     12492    21117     33612     50997
5   32  364  2016   7448   21280   51012    107744   206896    368928    620060
6   64  1093 8128   37969  131776  372709   908608   1979713   3951424   7352101
7   128 3280 32640  192032 807040  2687088  7548800  18640960  41611392  85656080
8   256 9834 130809 966714 4907769 19200234 62070009 173533434 432891129 985263594

आई / ओ

फिलहाल, इनपुट के रूप में इनपुट की आवश्यकता है: tictactoe.py <ret> n,d <ret> move;move <ret>- कई लाइनों पर ध्यान दें और कोई अंतिम नहीं;

आउटपुट जैसा दिखता है (x_1,x_2,x_3...)उदाहरण के लिए :

tictactoe.py <ret> 6,5 <ret> <ret> => 0, 0, 0, 0, 0

tictactoe.py <ret> 6,5 <ret> 0,0,0,0,0;0,0,0,0,5 <ret> => 0, 0, 0, 5, 0

# Notes on terminology:
#
# - A hypercube is the region [0,n]^d
# - An i-facet is an i-dimensional facet of a hypercube,
#   which is to say, a 0-facet is a vertex, a 1-facet an
#   edge, a 2-facet a face, and so on.
# - Any tuple {0,n}^i is a vertex of an i-hypercube
#   which is why I've used vertex to describe such
#   tuples
# - A winning line is a set of n coordinates which joins
#   two opposite i-facets
# - i-facets are opposite if they differ in every co-
#   ordinate which defines them
#
# Test Data:
#  


import numpy
import itertools

def removeDuplicates(seq):
    noDupes = []
    [noDupes.append(i) for i in seq if not noDupes.count(i)]
    return noDupes 


def listPairedVertices (i,n):
    """
    listPairedVertices returns a list L of elements of {0,n}^i which has the
    property that for every l in L, there does not exist l' such that
    l+l' = {n}^i.
    """

    vertices = numpy.array([[b*(n-1)  for b in a] for a in [
        list(map(int,list(numpy.binary_repr(x,i)))) for x in range(2**i)
    ]])
    result = []
    while len(vertices)>1:
        for j in range(len(vertices)):
            if numpy.all(vertices[j] + vertices[0] == [n-1]*i):
                result.append(vertices[0])
                vertices=numpy.delete(vertices,[0,j],axis=0)
                break
    return result


def listSequences (d,l):
    """
    listSequences returns the subset of {0,1}^d having precisely n 1s.
    """
    return numpy.array([
        r for r in itertools.product([0,1],repeat=d) if sum(r)==l
    ])


def listPaddedConstants (s,n):
    """
    listPaddedConstants takes a sequence in {0,1}^d and returns a number in
    {0..n}^sum(s) padded by s
    """
    result = numpy.zeros([n**sum(s),len(s)],dtype=numpy.int)
    for i,x in enumerate([list(z) for z in 
        itertools.product(range(n),repeat=sum(s))]):
        for j in range(len(s)):
            if s[j]: result[i][j] = x.pop()
    return result


def listWinningVectorsForDimension(d,i,n):
    """
    List the winning lines joining opposite i-facets of the hypercube.

    An i-facet is defined by taking a vertex v and a sequence s, then forming 
    a co-ordinate C by padding v with zeroes in the positions indicated by s.
    If we consider s = s_0.e_0 + s_1+e_1... where the e_j are the canonical
    basis for R^d, then the formula of the i-facet is 
        C+x_0.s_0.e_0+x_1.s_1.e_1... 
    for all vectors x = (x_0,x_1...) in R^n

    We know that winning lines only start at integral positions, and that the
    value of a will only be needed when s_j is nonempty, so the start point S
    of a winning line is in fact determined by:
     + vertex v in {0,n}^(d-i), padded by s
     + a in R^i, padded by the complement of s, s'

    Having performed the following operations, the co-ordinates of the winning
    lines are abs(S-k*s') for k in [0..n-1]
    """
    vertices = listPairedVertices(d-i,n)
    sequences = listSequences(d,i)
    result = []
    for s in sequences:
        for v in vertices:
            C = [0]*d
            j = 0
            for index in range(d):
                if s[index]: C[index] = 0
                else: 
                    C[index] = v[j]
                    j+=1
            result += [
                [numpy.absolute(S-k*(numpy.absolute(s-1))) for k in range(n)] 
                    for S in [C+a for a in listPaddedConstants(s,n)]
            ]
    return result


def AllWinningLines (d,n):
    """
    has the structure [[x_1,x_2,x_3],[y_1,y_2,y_3]] where each l_k is a
    length-d co-ordinate
    """
    result = []
    for i in range(d):
        result += listWinningVectorsForDimension(d,i,n)
    return result


def movesAlreadyMade ():
    """
    Returns a list of co-ordinates of moves already made read from STDIN
    """
    parameters = raw_input()
    moves = raw_input()
    parameters = list(map(int,parameters.split(',')))
    moves = [map(int,a.split(',')) for a in moves.split(';')] \
        if moves != '' else []
    return {'n':parameters[0], 'd':parameters[1], 'moves':moves}

def scoreLine (moves, line, scores, n):
    """
    Gives each line a score based on whatever logic I choose
    """
    myMoves          = moves[0::2]
    theirMoves       = moves[1::2]
    if len(moves)%2: myMoves, theirMoves = theirMoves, myMoves

    lineHasMyMove    = 0
    lineHasTheirMove = 0
    score            = 0

    for coord in line:
        if coord.tolist() in myMoves: 
            lineHasMyMove += 1
            if coord.tolist() in theirMoves: raise Exception('Move clash')
        elif coord.tolist() in theirMoves: lineHasTheirMove += 1

    if lineHasMyMove == len(line):
        raise Exception('I have won')
    elif lineHasTheirMove == len(line):
        raise Exception('They have won')
    elif lineHasMyMove and lineHasTheirMove: 
        pass
    elif lineHasTheirMove == len(line)-1: 
        score = n**lineHasTheirMove
    else: 
        score = n**lineHasMyMove

    for coord in line:
        if coord.tolist() not in moves: 
            scores[tuple(coord)]+=score

def main():
    """
    Throw it all together
    """
    data      = movesAlreadyMade()
    dimension = data['d']
    length    = data['n']
    lines     = AllWinningLines(dimension, length)
    scores    = numpy.zeros([length]*dimension, dtype=numpy.int)

    try: [scoreLine(data['moves'], line, scores, length) for line in lines]
    except Exception as E:
            print 'ERROR: ' + E.args[0]
            return
    print ','.join(map(
        str,numpy.unravel_index(numpy.argmax(scores),scores.shape)
        ))


if __name__ == "__main__": main() 

संपादित करें: I / O के लिए, तर्क जोड़ा। मेरा मानना ​​है कि यह अब चिन्हित करने के लिए तैयार है

ध्यान दें कि यह टिप्पणी शुरू में एक प्लेसहोल्डर थी जिसे मैंने हटा दिया था और उसे हटा नहीं दिया था।


1

अजगर २

import re
import itertools

input_s = raw_input()
dims, moves = None, None
#this is to allow input as a single paste, instead of ENTER inputting.
try:
    dims, moves = input_s.splitlines()
except ValueError:
    dims = input_s
    moves = raw_input()

dims = eval(dims) #change into tuple

moves = moves.split(';')
if len(moves[0]):
    moves = [eval(m) for m in moves] #change into tuples

allSpaces = [x for x in itertools.product(range(dims[0]), repeat=dims[1])]
move = None
for space in allSpaces:
    if space not in moves:
        move = space
        break
print(re.sub('[^\\d,]', '', str(move)))

अधिकांश कोड बिल्कुल Quincunx के यादृच्छिक एआई के समान है । एक चाल का चयन करने के बजाय, यह पहला उपलब्ध कदम उठाता है (यानी 0,0, ... 0), फिर (0,0, ... 1), फिर (0,0, ... 2) , आदि।)।

यह एक सुंदर बकवास रणनीति है, लेकिन यह लगभग हमेशा यादृच्छिक पर खेलता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.