পারমাণবিক অনুপাত একটি খেলা


21

আপনার টাস্কটি এমন একটি বট তৈরি করে যা সর্বোচ্চ স্কোর সহ আটোমাস খেলে ।

খেলাটি কীভাবে কাজ করে:

গেমবোর্ডটি 6 "পরমাণু" এর একটি রিং দিয়ে শুরু হয়, যার সংখ্যাটি শুরু থেকে শুরু 1করে3 । আপনি দুটি পরমাণুর মধ্যে একটি পরমাণু "খেলতে" পারেন, বা অন্য পরমাণুর উপরও, পরমাণুর উপর নির্ভর করে।

আপনি হয় একটি সাধারণ পরমাণু, বা একটি বিশেষ পরমাণু থাকতে পারেন।

সাধারণ পরমাণু:

আপনি বোর্ডে যে কোনও দুটি উপলভ্য পরমাণুর মধ্যে একটি সাধারণ পরমাণু খেলতে পারেন।

আপনি পরিসরে পরমাণু দিয়ে শুরু করেছিলেন 1 to 3, তবে প্রতি 40 টি পদক্ষেপে একবারে পরিসীমা 1 দ্বারা বৃদ্ধি পায় (সুতরাং 40 টি পদক্ষেপের পরে, পরিসীমাটি হয়ে যায়2 to 4 )।

বোর্ডে যদি পরমাণুগুলি সীমার তুলনায় কম থাকে তবে এর একটি রয়েছে 1 / no. of atoms of that number on the board স্প্যান করার সম্ভাবনা রয়েছে।

ধরা যাক আপনার 2খেলতে হবে, এবং বোর্ডটি দেখতে এমন দেখাচ্ছে:

   1 1 2 1

এর 2ডানদিকে রাখুন 1

বোর্ডটি এখন পরিণত হয়:

   1 1 2 1 2

দ্রষ্টব্য: বোর্ড চারপাশে মোড়ানো, সুতরাং 1ডানদিকের বামদিকে প্রকৃতপক্ষে 2ডানদিকে ডানদিকে। এটি পরে গুরুত্বপূর্ণ হবে।

4 ধরণের "বিশেষ" পরমাণু রয়েছে এবং সেগুলি হ'ল:

+পরমাণু:

এই পরমাণু দুটি পরমাণুর মধ্যে খেলা হয়। এটি spawning 5 এর মধ্যে 5 এর একটি সুযোগ রয়েছে।

যদি পরমাণুর উভয় পাশের +পরমাণু একই হয় তবে ফিউশন হয়। এখানে কিভাবে এটা কাজ করে:

The two atoms fuse together to create an atom one higher.
(So, two 3 atoms fuse together to form one 4 atom.)
While the atoms on both sides of the fused atom are equal:
    If the atoms on the side >= the fused atom:
        The new fused atom = the old fused atom's value + 2.
    If the atoms on the side < the fused atom:
        The new fused atom = the old fused atom's value + 1.

উদাহরণ:

   1 1 3 2 2 3  (the 1 on the left-hand side "wraps back" 
                 to the 3 on the right-hand side)

Let's use the + on the two 2's in the middle.

-> 1 1 3 3 3    (the two 2's fused together to make a 3)
-> 1 1 5        (the two 3's fused with the 3, and because 3 >= 3,
                 the new fused atom = 3 + 2 = 5)
-> 6            (the two 1's fused with the 5, since the board wraps,
                 and because 1 < 5, the new fused atom = 5 + 1 = 6)

Because the atoms on the sides of the 6 don't exist, fusion stops,
and the board is now [6].

যদি পরমাণুর উভয় পাশের পরমাণুগুলি +পৃথক হয়, তবে+ হলে বোর্ডে থাকে the

উদাহরণ:

   1 3 2 3 1 1

Let's use the + on the 2 and 3 in the middle.

-> 1 3 2 + 3 1 1 (2 != 3, so the + stays on the board)

দ্য -পরমাণু:

এই পরমাণুটি অন্য একটি পরমাণুতে বাজানো হয়। এটির স্পোনিংয়ের 10 টির মধ্যে 1 টি রয়েছে।

-পরমাণু বোর্ড থেকে পরমাণুর সরিয়ে ফেলা হবে, এবং আপনি হয় একটি পছন্দ দেয়:

  • পরের রাউন্ডে মুছে ফেলা অণুটি খেলুন বা
  • পরের দফায় খেলতে এটি + পরমাণুতে পরিণত করুন।

উদাহরণ:

   1 3 2 3 1 1

Let's use the - on the left-hand 2.

-> 1 3 3 1 1    (the 2 is now removed from the board)

Let's turn it into a +, and place it in between the 3's.

-> 1 4 1 1      (the two 3's fused together to make a 4)
-> 5 1          (the two 1's fused with the 4, and because 1 < 4,
                 the new fused atom = 4 + 1 = 5)

কালো +পরমাণু (B ):

এই পরমাণুটি 2 টি পরমাণুর মধ্যে খেলা হয়। এটিতে স্পোনিংয়ের 80 টির মধ্যে 1 টি রয়েছে এবং আপনার স্কোর> 750 এর পরে কেবল এটি তৈরি হয়।

এই পরমাণুটি মূলত পরমাণুর মতোই +, এটি যে কোনও দুটি পরমাণুকে একসাথে ফিউজ করে, এমনকি এটির জন্যও +। তারপরে, এটি অনুসরণ করে+ নিয়মটি (এটি কেবলমাত্র একত্রে পরমাণুকে ফিউজ করে যদি ফিউজড পরমাণুর উভয় পাশের পরমাণু সমান হয়)।

কালো হিসাবে ফলস পরমাণু +সমান:

  • ফিউশন +3 এ উচ্চতর সংখ্যাটি পরমাণু
  • 4যদি দুটি নিলীন পরমাণু হয় +এর

উদাহরণ:

   1 3 2 1 3 1

Let's use the black + on the 2 and 1 in the middle.

-> 1 3 5 3 1    (the 2 and 1 fused together to make a 2 + 3 = 5)
-> 1 6 1        (+ rule)
-> 7            (+ rule)

আরেকটি উদাহরণ:

   2 + + 2

Let's use the black + on the two +'s.

-> 2 4 2        (the two +'s fused together to make a 4)
-> 5            (+ rule)

ক্লোন পরমাণু (C ):

এই পরমাণুটি অন্য একটি পরমাণুতে বাজানো হয়। এটিতে স্পোনিংয়ের 60 টির মধ্যে 1 টি রয়েছে এবং আপনার স্কোর> 1500 একবারে এটি স্প্যান করে।

ক্লোন অ্যাটম আপনাকে একটি পরমাণু চয়ন করতে এবং এটি পরবর্তী রাউন্ডে খেলতে দেয়।

উদাহরণ:

   1 1 2 1

Let's use the clone on the 2, and place it to the right of the 1.

-> 1 1 2 1 2

পাইথন 2-তে আমার গেমটি এখানে তৈরি করুন:

import random
import subprocess

logs='atoms.log'
atom_range = [1, 3]
board = []
score = 0
move_number = 0
carry_over = " "
previous_moves = []

specials = ["+", "-", "B", "C"]


def plus_process(user_input):
    global board, score, previous_moves, matches
    previous_moves = []
    matches = 0

    def score_calc(atom):
        global score, matches
        if matches == 0:
            score += int(round((1.5 * atom) + 1.25, 0))
        else:
            if atom < final_atom:
                outer = final_atom - 1
            else:
                outer = atom
            score += ((-final_atom + outer + 3) * matches) - final_atom + (3 * outer) + 3
        matches += 1

    if len(board) < 1 or user_input == "":
        board.append("+")
        return None
    board_start = board[:int(user_input) + 1]
    board_end = board[int(user_input) + 1:]
    final_atom = 0
    while len(board_start) > 0 and len(board_end) > 0:
        if board_start[-1] == board_end[0] and board_end[0] != "+":
            if final_atom == 0:
                final_atom = board_end[0] + 1
            elif board_end[0] >= final_atom:
                final_atom += 2
            else:
                final_atom += 1
            score_calc(board_end[0])
            board_start = board_start[:-1]
            board_end = board_end[1:]
        else:
            break
    if len(board_start) == 0:
        while len(board_end) > 1:
            if board_end[0] == board_end[-1] and board_end[0] != "+":
                if final_atom == 0:
                    final_atom = board_end[0]
                elif board_end[0] >= final_atom:
                    final_atom += 2
                else:
                    final_atom += 1
                score_calc(board_end[0])
                board_end = board_end[1:-1]
            else:
                break
    if len(board_end) == 0:
        while len(board_start) > 1:
            if board_start[0] == board_start[-1] and board_start[0] != "+":
                if board_start[0] >= final_atom:
                    final_atom += 2
                else:
                    final_atom += 1
                score_calc(board_start[0])
                board_start = board_start[1:-1]
            else:
                break
    if matches == 0:
        board = board_start + ["+"] + board_end
    else:
        board = board_start + [final_atom] + board_end
        for a in range(len(board) - 1):
            if board[a] == "+":
                if board[(a + 1) % len(board)] == board[a - 1]:
                    board = board[:a - 1] + board[a:]
                    plus_process(a)
                    break


def minus_process(user_input, minus_check):
    global carry_over, board
    carry_atom = board[int(user_input)]
    if user_input == len(board) - 1:
        board = board[:-1]
    else:
        board = board[:int(user_input)] + board[int(user_input) + 1:]
    if minus_check == "y":
        carry_over = "+"
    elif minus_check == "n":
        carry_over = str(carry_atom)


def black_plus_process(user_input):
    global board
    if board[int(user_input)] == "+":
        if board[int(user_input) + 1] == "+":
            inter_atom = 4
        else:
            inter_atom = board[int(user_input) + 1] + 2
    else:
        if board[int(user_input)] + 1 == "+":
            inter_atom = board[int(user_input)] + 2
        else:
            inter_list = [board[int(user_input)], board[int(user_input) + 1]]
            inter_atom = (inter_list.sort())[1] + 2
    board = board[int(user_input) - 1:] + [inter_atom] * 2 + board[int(user_input) + 1:]
    plus_process(int(user_input) - 1)


def clone_process(user_input):
    global carry_over
    carry_over = str(board[int(user_input)])


def regular_process(atom,user_input):
    global board
    if user_input == "":
        board.append(random.randint(atom_range[0], atom_range[1]))
    else:
        board = board[:int(user_input) + 1] + [int(atom)] + board[int(user_input) + 1:]

def gen_specials():
    special = random.randint(1, 240)
    if special <= 48:
        return "+"
    elif special <= 60 and len(board) > 0:
        return "-"
    elif special <= 64 and len(board) > 0 and score >= 750:
        return "B"
    elif special <= 67 and len(board) > 0 and score >= 1500:
        return "C"
    else:
        small_atoms = []
        for atom in board:
            if atom not in specials and atom < atom_range[0]:
                small_atoms.append(atom)
        small_atom_check = random.randint(1, len(board))
        if small_atom_check <= len(small_atoms):
            return str(small_atoms[small_atom_check - 1])
        else:
            return str(random.randint(atom_range[0], atom_range[1]))


def specials_call(atom, user_input):
    specials_dict = {
        "+": plus_process,
        "-": minus_process,
        "B": black_plus_process,
        "C": clone_process
    }
    if atom in specials_dict.keys():
        if atom == "-":
            minus_process(user_input[0], user_input[1])
        else:
            specials_dict[atom](user_input[0])
    else:
        regular_process(atom,user_input[0])


def init():
    global board, score, move_number, carry_over, previous_moves
    board = []
    score = 0

    for _ in range(6):
        board.append(random.randint(1, 3))

    while len(board) <= 18:
        move_number += 1
        if move_number % 40 == 0:
            atom_range[0] += 1
            atom_range[1] += 1
        if carry_over != " ":
            special_atom = carry_over
            carry_over = " "
        elif len(previous_moves) >= 5:
            special_atom = "+"
        else:
            special_atom = gen_specials()
        previous_moves.append(special_atom)
        bot_command = "python yourBot.py"
        bot = subprocess.Popen(bot_command.split(),
                               stdout = subprocess.PIPE,
                               stdin = subprocess.PIPE)
        to_send="/".join([
            # str(score),
            # str(move_number),
            str(special_atom),
            " ".join([str(x) for x in board])
        ])
        bot.stdin.write(to_send)
        with open(logs, 'a') as f:f.write(to_send+'\n')
        bot.stdin.close()
        all_user_input = bot.stdout.readline().strip("\n").split(" ")
        specials_call(special_atom, all_user_input)

    print("Game over! Your score is " + str(score))

if __name__ == "__main__":
    for a in range(20):
        with open(logs, 'a') as f:f.write('round '+str(a)+'-'*50+'\n')
        init()

বট জিনিসটি কীভাবে কাজ করে:

ইনপুট

  • আপনার বট 2 টি ইনপুট পাবে: বর্তমানে অ্যাটমটি চলছে এবং বোর্ডের অবস্থা।
  • পরমাণুটি এরকম হবে:
    • +একটি জন্য +পরমাণু
    • -একটি জন্য -পরমাণু
    • Bএকটি কালো +পরমাণুর জন্য
    • C ক্লোন অণু জন্য
    • {atom} একটি সাধারণ পরমাণুর জন্য
  • বোর্ডের অবস্থা এমন হবে:
    • atom 0 atom 1 atom 2... atom nপারমাণবিক স্থানগুলি দ্বারা পৃথক করে ( "রিং" গেমবোর্ডের অনুকরণে atom nপিছনে atom 1জড়িয়ে থাকে)
  • এই দুটি দ্বারা একটি পৃথক করা হবে /

উদাহরণ ইনপুট:

1/1 2 2 3   (the atom in play is 1, and the board is [1 2 2 3])
+/1         (the atom in play is +, and the board is [1] on its own)

আউটপুট

  • খেলায় থাকা পরমাণুটি নির্ভর করে আপনি একটি স্ট্রিং আউটপুট আনবেন।

    • যদি পরমাণুটি দুটি পরমাণুর মধ্যে খেলতে বোঝানো হয়:

      • আপনি পরমাণুটি খেলতে চান এমন ফাঁকগুলি আউটপুট করুন The ফাঁকগুলি প্রতিটি পরমাণুর মাঝে যেমন থাকে তেমন:

        atom 0, GAP 0, atom 1, GAP 1, atom 2, GAP 2... atom n, GAP N
        

        ( gap nআপনি এটি পরমাণু atom 1এবং পরমাণুর মধ্যে স্থাপন করতে চান তা বোঝায় n) সুতরাং 2যদি আপনি পরমাণুটি খেলতে চান তবে আউটপুট gap 2

    • যদি পরমাণুটি কোনও পরমাণুতে বাজানো হয়:
      • আপনি এটিটি খেলতে চান এমন পরমাণু আউটপুট করুন, সুতরাং 2আপনি যদি পরমাণুটি খেলতে চান তবে atom 2
    • যদি পরমাণুটি একটি হয় -:
      • আপনি এটিটি খেলতে চান তার পরমাণু আউটপুট করুন, তারপরে একটি স্থানের পরে y/nপরমাণুটিকে +পরবর্তীতে রূপান্তরিত করার পছন্দ অনুসরণ করুন , সুতরাং 2, "y"আপনি যদি পরমাণুটি খেলতে atom 2চান এবং আপনি এটিকে রূপান্তর করতে চান +দ্রষ্টব্য: এটির পরিবর্তে 1 এর পরিবর্তে 2 টি ইনপুট প্রয়োজন।

উদাহরণ ফলাফল:

(Atom in play is a +)
2   (you want to play the + in gap 2 - between atom 2 and 3)
(Atom in play is a -)
3 y  (you want to play the - on atom 3, and you want to change it to a +)
2 n  (you want to play the - on atom 2, and you don't want to change it)
  • বট কার্যকর করতে, আপনাকে যেতে হবে Popen(তাই যদি আপনার প্রোগ্রাম (কোড শেষে কাছাকাছি সময়ে) যাই হোক না কেন একটি Pythonic তালিকা হিসাবে আপনার প্রোগ্রাম রান তোলে সঙ্গে বিট এবং প্রতিস্থাপন এটা derp.java, প্রতিস্থাপন ["python", "bot.py"]সঙ্গে ["java", "derp.java"])।

উত্তর-নির্দিষ্ট স্পেস:

  • উত্তরে আপনার বটের পুরো কোডটি রাখুন। যদি এটি ফিট না করে তবে এটি গণনা করে না।
  • প্রতিটি ব্যবহারকারীর 1 টিরও বেশি বট থাকার অনুমতি রয়েছে, তবে তাদের সকলের পৃথক উত্তর পোস্টে থাকা উচিত।
  • এছাড়াও, আপনার বট একটি নাম দিন।

স্কোরিং:

  • সর্বোচ্চ স্কোর সহ বট জয়লাভ করে।
    • আপনার বটটি 20 টি গেমের জন্য পরীক্ষা করা হবে এবং চূড়ান্ত স্কোরটি 20 গেমের গড়।
  • টাই-ব্রেকারটি উত্তর আপলোড করার সময় হবে।
  • সুতরাং আপনার উত্তরটি এভাবে বিন্যাসিত হবে:

    {language}, {bot name}
    Score: {score}
    

শুভকামনা!


পরমাণুর কাজের +জন্য উত্পন্ন কীভাবে -? আপনি যদি চয়ন করেন yতবে আপনি কি +পরবর্তী পদক্ষেপ নেওয়ার নিশ্চয়তা পাবেন ?
টন হসপেল

4
আমি আপনার বট ড্রাইভারটি পরিবর্তন করার পরামর্শ দিচ্ছি যাতে এটি কোনও স্ট্যান্ডোলোন প্রোগ্রাম পরিচালনা করতে পারে যা এসটিডিইএন-এ ইনপুট নেয় এবং STDOUT- এ ফলাফল দেয়। এর দ্বারা ভাষার স্বাধীনতা পাওয়া উচিত এবং এই সাইটে ব্যবহৃত বেশিরভাগ ভাষা সহজেই এটি করতে পারে। অবশ্যই এর অর্থ একটি কঠোর I / O ফর্ম্যাট সংজ্ঞায়িত করা, যেমন input_atom\natom0 atom1 .... atomn\nSTDIN এর জন্য
টন হসপেল

1
কোডটি +তালিকার তালিকায় রাখতে সক্ষম হয়েছে বলে মনে হয় , তবে পাঠ্য বর্ণনায় এটি কোথাও পাওয়া যায়নি
টন হসপেল

1
আহ, আমি দেখছি আপনি প্রোগ্রামটিকে বাহ্যিক বটগুলিতে কল করতে সক্ষম করেছেন। তবে, আপনার বর্তমান চলন নম্বরটি পাস এবং এসটিডিএন-তে স্কোর করতে হবে অন্যথায় বট ভবিষ্যতে প্রতিটি পরমাণু হওয়ার সম্ভাবনা পূর্বাভাস দিতে পারে না
টন হসপেল

1
নিয়ন্ত্রণকারী উন্নত না হলে লোকেরা একটি সমাধান তৈরি করতে সময় ব্যয় করবে যদি আইডিক। আমি প্রশ্নটি পছন্দ করি তবে বাস্তবায়ন নয়।
mbomb007

উত্তর:


1

পাইথন, ড্রাফটবট, স্কোর = 889

import random
def h(b):
    s=0
    for x in b:
        try:
            s+=int(x)
        except: 
            s+=0
    return s
def d(i):g=i.split("/");a=g[0];b=g[1].split(" ");return(a,b)
def p(a,_,j):
    v=[]
    for x in _:
        try:
            v.append(int(x))
        except: 
            v.append(0)
    try:
        v=v[:j+1]+[int(a)]+v[j+1:]
    except: 
        v=v[:j+1]+[a]+v[j+1:]
    r1=[[]];b=[x for x in v];m=range(len(b)+1)
    for k in m:
        for i in m:
            for j in range(i):
                c = b[j:i + 1]
                if len(c)%2==0 and c==c[::-1] and 0 not in c:r1.append(c)
        b.insert(0, b.pop())
    q1=max(r1,key=len)
    r2=[[]];b=[x for x in v];m=range(len(b)+1)
    for k in m:
        for i in m:
            for j in range(i):
                c = b[j:i + 1]
                if len(c)>2 and len(c)%2==1 and c==c[::-1] and "+" in c and 0 not in c:r2.append(c)
        b.insert(0, b.pop())
    q2=max(r2,key=h)
    with open('f.log', 'a') as f:f.write('pal '+str(_)+' : '+str(q1)+' : '+str(q2)+'\n')
    if q2!=[]:return 100+h(q2)
    else:return len(q1)
i=raw_input()
(a,b)=d(i)
if a in ['C','B']:print('0')
elif a=='-':print("0 y" if random.randint(0, 1) == 1 else "0 n")
else:q,j=max((p(a,b,j),j)for j in range(len(b)));print(str(j))

আমি দেখতে পেয়েছি যে নিয়ামক:

  • স্কোর 1500 ছাড়িয়ে গেলে ক্র্যাশ;
  • একই ক্ষেত্রে পরমাণুগুলি সঠিকভাবে মার্জ করে না।

0

পাইথন, র‌্যান্ডমবট, স্কোর = 7.95

খুব বেশি অভিনব কিছু নয়, কেবল একটি এলোমেলো বট।

import random

game_input = raw_input().split("/")
current_atom = game_input[0]
board = game_input[1].split(" ")

if current_atom != "-":
    print(random.randint(0, len(board) - 1))
else:
    random_choice = " y" if random.randint(0, 1) == 1 else " n"
    print(str(random.randint(0, len(board) - 1)) + random_choice)

0

পাইথন, ব্যাডপ্লেয়ার, স্কোর = 21.45

import random

try:
    raw_input
except:
    raw_input = input

game_input = raw_input().split("/")
current_atom = game_input[0]
board = game_input[1].split(" ")

def get_chain(board, base):
    chain = []
    board = board[:]
    try:
        while board[base] == board[base + 1]:
            chain = [board[base]] + chain + [board[base + 1]]
            del board[base]
            del board[base]
            base -= 1
    except IndexError:
        pass
    return chain

def biggest_chain(board):
    chains = []
    base = 0
    i = 0
    while i < len(board) - 1:
        chains.append([i, get_chain(board, i)])
        i += 1
    return sorted(chains, key=lambda x: len(x[1]) / 2)[-1]

def not_in_chain():
    a, b = biggest_chain(board)
    if len(b) == 0:
        print(random.randint(0, len(board) - 1))
    elif random.randint(0, 1) == 0:
        print(random.randint(a + len(b)/2, len(board) - 1))
    else:
        try:
            print(random.randint(0, a - len(b)/2 - 1))
        except:
            print(random.randint(a + len(b)/2, len(board) - 1))

if current_atom in "+B":
    a, b = biggest_chain(board)
    if len(b) == 0:
        print(0)
    else:
        print(a)
elif current_atom == "C":
    not_in_chain()
elif current_atom == "-":
    a, b = biggest_chain(board)
    if len(b) == 0:
        print(str(random.randint(0, len(board) - 1)) + " n")
    elif random.randint(0, 1) == 0:
        print(str(random.randint(a + len(b)/2, len(board) - 1)) + " n")
    else:
        try:
            print(str(random.randint(0, a - len(b)/2 - 1)) + " n")
        except:
            print(str(random.randint(0, len(board) - 1)) + " n")
else:
    not_in_chain()

একটি খুব খারাপ বট যা প্রায়শই নিয়ামক ক্র্যাশ করে


এটি কীভাবে নিয়ন্ত্রণকারী ক্র্যাশ করে? এবং যদি এটি হয় তবে এটি নিয়ামক, বা আপনার বট সমস্যা?
mbomb007

@ এমবম্ব ২০০7 কেন এটি ক্র্যাশ হয়েছিল তা আমি মনে করতে পারি না, তবে ক্র্যাশগুলি
নিয়ামকের

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