হোয়াইট এলিফ্যান্ট এক্সচেঞ্জ


11

এটি জুলাই মাসে ক্রিসমাস, সুতরাং ভার্চুয়াল সাদা হাতির উপহার বিনিময়ের চেয়ে ভাল আর কীভাবে উদযাপন করা যায়!

পাহাড়ের এই কিংয়ের জন্য, আপনাকে অবশ্যই একটি বট তৈরি করতে হবে যা একটি সাদা এলিফ্যান্ট এক্সচেঞ্জ সিমুলেশনে খেলতে পারে, এটি সর্বোচ্চ মূল্যবান বর্তমানটি পাওয়ার চেষ্টা করে।

খেলার নিয়ম

  • গেমটি বিভিন্ন রাউন্ডে খেলা হবে, প্রতিটিটি একটি পরিবর্তনশীল সংখ্যক টার্ন দিয়ে তৈরি।
  • রাউন্ড সেটআপ : গেমের খেলোয়াড় হিসাবে যতগুলি উপহার থাকবে, প্রত্যেকটির মূল্য নির্ধারিতভাবে এলোমেলোভাবে সমান [0 ... 1) হয়, বর্তমানটি "খোলার" অবধি এই মানটি অজানা থাকে। খেলোয়াড়দের একটি কাতারে এলোমেলো ক্রমে রাখা হবে। প্রথম প্লেয়ারটি কাতারের সামনে থেকে পপ করা হবে।
  • যখন এটি কোনও প্লেয়ারের পালা, তখন তারা কোনও উপহার খুলতে পারে বা অন্য খেলোয়াড়ের বর্তমানকে চুরি করতে পারে, যার প্লেয়ারটির বর্তমান চুরি হয়েছিল তার কাছে ফিরে আসে।
    • প্রতিটি উপস্থিতি 3 বার পর্যন্ত চুরি হতে পারে।
    • সবেমাত্র আপনার কাছ থেকে চুরি হওয়া প্লেয়ার থেকে আপনি চুরি করতে পারবেন না।
    • প্রতিটি খেলোয়াড়ের একসাথে কেবল একজন উপস্থিত থাকতে পারে।
  • কোনও উপস্থিতি খোলার পরে কাতারের সামনের অংশ থেকে পপড পরবর্তী খেলোয়াড়ের অগ্রিম খেলুন। এই পরবর্তী খেলোয়াড় হবেন যিনি এখনও ঘুরেনি।
  • রাউন্ড শেষ : সমস্ত উপহার খোলার পরে, রাউন্ডটি শেষ হয় এবং প্রতিটি খেলোয়াড়ের কাছে থাকা বর্তমানের মানটি সেই খেলোয়াড়ের স্কোরের সাথে যুক্ত হয়। একটি নতুন রাউন্ড শুরু হয়, প্রতিটি প্লেয়ারের এখন কোনও উপস্থিতি নেই এবং প্লেয়ারের অর্ডারটি বদলে গেছে।
  • খেলা শেষ : যখন অন্তত একটি প্লেয়ার স্কোর এ গেমের শেষ হয়ে যাবে 100 , 500 পয়েন্ট বিজয় উপহার সর্বোচ্চ মোট মূল্য সঙ্গে প্লেয়ার থেকে পুরস্কার প্রদান করা হচ্ছে।

আইনসংগ্রহ

সমস্ত জমাটি পাইথন 3.7 এর সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত। আপনাকে অবশ্যই এমন একটি ক্লাস লিখতে হবে যা থেকে সরাসরি উত্তরাধিকার সূত্রে প্রাপ্ত WhiteElephantBot। এই ক্ষেত্রে:

class FooBot(WhiteElephantBot):
    # Your implementation here

আপনি আপনার বট ক্লাসে একটি __init__পদ্ধতি সরবরাহ করতে পারেন (যা একটি যুক্তি গ্রহণ করে name), যা অবশ্যই কল করবে super().__init__(name)। আপনার শ্রেণীর অবশ্যই take_turnএই ক্রমে নিম্নলিখিত যুক্তিগুলির প্রত্যাশা করার একটি পদ্ধতি থাকতে হবে :

  • players: সমস্ত খেলোয়াড়ের কাছে এখনও উপহার নেই এমন প্লেয়ারের নামের তালিকা turn
  • presents: এমন একটি অভিধান যা খেলোয়াড়ের নামটিকে 2-টিপলগুলিতে ম্যাপ করে যে সেই খেলোয়াড়ের বর্তমান মূল্য রয়েছে এবং বর্তমান যে পরিমাণটি চুরি হয়েছে তার সংখ্যা রয়েছে। এটিতে কেবল এমন খেলোয়াড়দের অন্তর্ভুক্ত করা হবে যারা বর্তমানে উপহার রাখছেন।
  • just_stole: শেষ করা পদক্ষেপটি যদি চুরি হয়ে থাকে তবে এই খেলোয়াড়ের নাম হবে যিনি কেবল চুরি করেছিলেন। তা না হলে তা হবে None

প্রতিটি যুক্তি অপরিবর্তনীয় বা একটি নতুন অবজেক্ট হবে যাতে তাদের কোনওরূপে পরিবর্তন আনলে গেমটির প্রভাব পড়বে না। আপনি যদি চান তবে আপনি যে কোনও যুক্তির অনুলিপি রাখতে পারেন।

এর উদাহরণ উদাহরণ presents:

{
    'Alice':   (0.35, 0),
    'Bob':     (0.81, 2),
    'Charlie': (0.57, 1)
}

আপনার take_turnপদ্ধতিটি আপনি যে খেলোয়াড়ের কাছ থেকে চুরি করতে চান বা Noneবর্তমান খুলতে চান তার নাম ফিরিয়ে দেওয়া উচিত । যদি একটি ব্যতিক্রম উত্থাপন, অন্য কিছু ফেরৎ চেয়ে strবা None, অথবা একটি প্লেয়ার আপনার কাছ থেকে চুরি করতে পারবে না নামে, আপনি ডিফল্ট দ্বারা একটি উপহার খুলবে।

আপনার কনস্ট্রাক্টরকে প্রতিটি রাউন্ডের শুরুতে ডাকা হবে, যাতে আপনি রাউন্ড থেকে রাউন্ডে রাষ্ট্রের কথা মনে রাখবেন না।

উত্তরাধিকার সূত্রে WhiteElephantBot, আপনার কাছে এমন একটি steal_targetsপদ্ধতিতে অ্যাক্সেস থাকবে যা উপহারসামগ্রী গ্রহণ করবে just_stoleএবং আপনি যে খেলোয়াড়দের কাছ থেকে চুরি করতে পারবেন তাদের নামের একটি তালিকা ফিরিয়ে দেবে।

আপনার স্ক্রিপ্টের যে কোনও মডিউলগুলির প্রয়োজন আপনার প্রবেশের শীর্ষে আমদানি করতে হবে।

পরীক্ষামূলক চালক

পরীক্ষার ড্রাইভারটি এখানে পাওয়া যাবেfrom white_elephant import WhiteElephantBotআপনার পোস্ট করা উত্তরে আপনাকে অন্তর্ভুক্ত করার দরকার নেই , তবে স্থানীয় মডিউলটি এটি করতে হবে।

বেসলাইন প্রতিযোগী

  • র্যান্ডম : এলোমেলোভাবে পছন্দ করে যে নতুন উপস্থিত খুলতে হবে বা চুরি করতে হবে, চুরির লক্ষ্যটি এলোমেলোভাবে বেছে নেওয়া হয়েছে।
  • লোভী : সবচেয়ে মূল্যবান বর্তমানকে চুরি করুন যা চুরি যায়। যদি কোনও উপহার চুরি করা যায় না, একটি উপস্থাপনা খুলুন।
  • সুন্দর : সর্বদা একটি নতুন উপস্থিত খোলে। কখনও চুরি করে না।

অতিরিক্ত বিধি

  • সমস্ত ব্যতিক্রম ধরা আপনার দায়িত্ব। যদি আপনার শ্রেণি ব্যতিক্রম ধরতে ব্যর্থ হয় তবে তা অযোগ্য ঘোষণা করা হবে। তদতিরিক্ত, দয়া করে কীবোর্ড ইন্টারটার্পগুলি ধরবেন না।
  • গেমগুলির মধ্যে রাষ্ট্র সাশ্রয় করতে অক্ষমতার বাইপাস করতে ফাইল বা অন্যান্য পদ্ধতি ব্যবহার করবেন না। আপনি উদাহরণস্বরূপ, কোনও মিডল-রানে একটি নিউরাল নেটওয়ার্ক অবস্থা সংরক্ষণ করতে পারবেন না।
  • আপনার বটটি অবশ্যই শ্রেণি কোড এবং সম্পর্কিত ধ্রুবকগুলির মধ্যে স্ব-অন্তর্ভুক্ত থাকতে হবে।
  • আপনি কেবল স্ট্যান্ডার্ড লাইব্রেরি আমদানি ব্যবহার করতে পারেন।
  • কোনও কঠোর পারফরম্যান্সের প্রয়োজন নেই। যুক্তিযুক্ত ও বুদ্ধিমান হন। যদি পারফরম্যান্স কোনও সমস্যা হয়ে যায়, আমি সময় সীমা যুক্ত করার অধিকার সংরক্ষণ করি।
  • প্রতি ব্যক্তি একটি প্রবেশ। আপনি যদি একাধিক এন্ট্রি জমা দেন তবে আপনার বটগুলি একসাথে কাজ করতে পারে না। আমি আপাতত ব্যক্তি প্রতি একাধিক এন্ট্রি দেওয়ার অনুমতি দিচ্ছি, যদিও সমস্যা হয়ে গেলে আমি পরে এটি পুনরায় বন্ধ করতে পারি।
  • এটি কোনও স্বতন্ত্র সমাপ্তির তারিখ সহ একটি উন্মুক্ত প্রতিযোগিতা। যখন আমি উল্লেখযোগ্য পরিবর্তনগুলি করেছি তখন এটিকে পুনরায় চালু করা হবে।

এডিআইটি 1: 100 থেকে 500 পর্যন্ত জয়ের স্কোর পরিবর্তন হয়েছে যাতে র‌্যাঙ্কিং আরও সুসংগত হয়। পরীক্ষা ড্রাইভারের একটি নতুন বাগফিক্স রয়েছে এবং এটি জয়ের স্কোর পরিবর্তনগুলিও প্রতিবিম্বিত করে।

EDIT2: প্রয়োজনীয় আমদানির বিষয়ে নোট পরিষ্কার করা।


লিডারবোর্ড (আগস্ট 8, 2018 হিসাবে)

  1. স্যাম্পেলবট (500.093)
  2. লাস্টমিনেটবট (486.163)
  3. রবিনহুড (463.160)
  4. অডডটড (448.825)
  5. লোভীবোট (438.520)
  6. সেকেন্ডপ্লেসবট (430.598)
  7. থ্রেশহোল্ডবট (390.480)
  8. জুয়াড়ি (৩১৩.৩62২)
  9. নাইসবট (২5৫.৫3636)
  10. র‌্যান্ডমবট (256.172)
  11. গুডসামারিটন (136.298)

এক পরপর কতগুলি চুরি করা যায়? আমি যখন খেলেছি, সাধারণত একটি সারিতে বা অন্য কিছুতে 2 টি স্টিমের সীমা থাকে এবং তৃতীয় ব্যক্তিকে একটি খুলতে হবে। এটি একই উপহার প্রতি বারের বেশি একবার চুরি হতে বাধা দেয়।
mbomb007

@ mbomb007 হ্যাঁ চেইন-চুরিটি সীমাহীন, অন্য কিছু নিয়মাবলী যা চুরির জন্য নির্দিষ্ট উপস্থাপন করে: প্রতিটি উপস্থিতি কেবল 3 বার চুরি করা যায় এবং আপনি যে প্লেয়ার থেকে কেবল চুরি করেছিলেন তার কাছ থেকে আপনি চুরি করতে পারবেন না।
বিফস্টার

আপনি কি কোনও উপস্থিতি চুরি করতে পারেন এবং তারপরে আপনার কাছে থাকা আসলটি আবার চুরি করতে পারবেন?
এরিক আউটগল্ফার

@ এরিকথ আউটগল্ফার: হ্যাঁ, যতক্ষণ না এর মধ্যে আরও একটি পালা ছিল। আপনার উপস্থিতি চুরি হয়ে যাওয়ার সাথে সাথে আপনি কেবল আবার চুরি করতে পারবেন না।
বিফস্টার

1
ইয়াঙ্কি অদলবদল !? এরপরে কী, একটি ভাগ করে নেওয়া জন্মদিনের পার্টি?
এনজিএম

উত্তর:


3

LastMinuteBot

(কোডের কঙ্কালের জন্য @ মনমোকে ধন্যবাদ জানাই, যেহেতু আমি সবে পাইথনকেই জানি))

class LastMinuteBot(WhiteElephantBot):
    def take_turn(self, players, presents, just_stole):
        targets = self.steal_targets(presents, just_stole)
        if len(targets) <= 1:
            return None

        target = None

        # If most of the presents are already distributed, try to steal an 
        #  un-restealable gift of high value
        if len(presents) > (len(players) + len(presents)) * 0.75:
            at_threshold = [t for t in targets if presents[t][1]==2 and presents[t][0]>=0.8]
            if at_threshold:
                target = max(at_threshold, key=lambda x: presents[x][0])

        # Otherwise, take the best available
        if not target:
            target = max(targets, key=lambda x: presents[x][0])

        return target if presents[target][0] > 0.5 else None

এই সত্যের সুযোগ নিন যে উপহারগুলি তিনবারের বেশি চুরি করা যায় না, তৃতীয়টি নিজেকে চুরি করে নিন যদি আপনি কোনও উচ্চ মূল্যবান উপহার পান এবং বেশিরভাগ উপহার খোলা থাকে।


সহজ, তবু
বিউটিফুল

2

অদ্ভুত টড

class OddTodd(WhiteElephantBot):
    def take_turn(self, players, presents, just_stole):

        targets = self.steal_targets(presents, just_stole)

        # if none to steal, pick present
        if len(targets) <= 1:
            return None

        # steals the best gift that he can, as long as he's the 1st/3rd steal
        targets = [t for t in targets if presents[t][1] % 2 == 0]
        if targets:
            return max(targets, key=lambda x:presents[x][0])

        else:
            return None

তিনি যে সেরা উপহারটি চুরি করতে পারেন তা চুরি করে, তবে উপহার চুরির দ্বিতীয় ব্যক্তি হতে চান না, কারণ এটি যদি তার কাছ থেকে চুরি হয়ে যায় তবে সে তা ফিরে পেতে পারে না।


১১ রেখায় সিনট্যাক্স ত্রুটি আপনার তালিকার বোধগম্যতার ==পরিবর্তে আপনার প্রয়োজন =
গরুর মাংসের

স্থির, ধন্যবাদ! পাইথন বেশি ব্যবহার করবেন না।
brian_t

1

SecondPlaceBot

class SecondPlaceBot(WhiteElephantBot):
    def take_turn(self, players, presents, just_stole):
        targets = self.steal_targets(presents, just_stole)
        if len(targets) <= 1:
            return None

        # If most of the presents are already distributed, take the second best.
        if len(presents) > (len(players) + len(presents)) * 0.8:
            target = sorted(targets, key=lambda x: presents[x][0])[-2]
        # Otherwise, take the best and hope someone steals it later.
        else:
            target = max(targets, key=lambda x: presents[x][0])

        return target if presents[target][0] > 0.5 else None

প্রত্যেকে সবচেয়ে মূল্যবান উপহারের জন্য লড়াই করতে যাচ্ছেন। পরবর্তী সেরা উপহার প্রায় হিসাবে ভাল, কিন্তু চুরি হওয়ার সম্ভাবনা খুব কম।


1

ThresholdBot

import random

class ThresholdBot(WhiteElephantBot):
    def __init__(self, name):
        self.name = name
        # Choose a minimum value to be happy.
        self.goal = 1 - random.random() ** 2

    def take_turn(self, players, presents, just_stole):
        # Find who has a gift that's sufficiently valuable.
        targets = self.steal_targets(presents, just_stole)
        targets = [x for x in targets if presents[x][0] >= self.goal]
        targets = sorted(targets, key=lambda x: presents[x][0])

        if not targets:
            return None

        # Choose a target (biased toward the best gifts).
        weighted = []
        for i, target in enumerate(targets, 1):
            weighted += [target] * i ** 2
        return random.choice(weighted)

আমরা সত্যিই পেয়ে যত্ন সম্পর্কে না ভাল উপহার, শুধু কিছু ভাল যথেষ্ট । এতক্ষণ চুরি করার মতো কিছু আছে, আমরা এটি করব।


1

SampleBot

import random

class SampleBot(WhiteElephantBot):
    def rollout(self, values, counts, just_stole, next_move):
        targets = set()
        move_chosen = False
        for i, (v, n) in enumerate(zip(values, counts)):
            if v and n < 3 and i != just_stole and i != 0:
                targets.add(i)
        for i in range(len(values)):
            if values[i]:
                break
            while True:
                if not targets:
                    break
                if move_chosen:
                    j = max(targets, key=lambda i: values[i])
                    if values[j] < 0.5:
                        break
                else:
                    move_chosen = True
                    if next_move is None:
                        break
                    j = next_move
                values[i] = values[j]
                counts[i] = counts[j] + 1
                values[j] = 0
                counts[j] = 0
                if just_stole is not None and counts[just_stole] < 3:
                    targets.add(just_stole)
                if j in targets:
                    targets.remove(j)
                just_stole = i
                i = j
            values[i] = random.random()
            for player in (just_stole, i):
                if player is not None and values[player] and counts[player] < 3:
                    targets.add(player)
        return values[0]
    def take_turn(self, players, presents, just_stole, n_rollouts=2000):
        names = [self.name] + players + list(presents.keys())
        values = [presents[name][0] if name in presents else None for name in names]
        counts = [presents[name][1] if name in presents else 0 for name in names]
        if just_stole is not None:
            just_stole = names.index(just_stole)
        targets = [None]
        for i, (v, n) in enumerate(zip(values, counts)):
            if v and n < 3 and i != just_stole and i != 0:
                targets.append(i)
        if len(targets) == 1:
            return targets[0]
        scores = [0. for _ in targets]
        n = n_rollouts // len(targets)
        for i, target in enumerate(targets):
            for _ in range(n):
                scores[i] += self.rollout(list(values), list(counts), just_stole, target) / float(n)
        target_index = targets[scores.index(max(scores))]
        if target_index is None:
            return None
        return names[target_index]

প্রতিটি খেলোয়াড় লোভের সাথে অভিনয় করে 2000 সিমুলেশন চালায় এবং সেরা ক্রিয়াটি চয়ন করে।


এই বটটি ঠিক কী করে?
বিফস্টার

বিফস্টার প্রতিটি খেলোয়াড়কে লোভের সাথে অভিনয় করে 2000 টি এলোমেলো গেমস চালায় এবং সর্বোচ্চ গড় চূড়ান্ত স্কোর নিয়ে চলে আসে।
ব্যবহারকারী1502040

নামের ত্রুটি। আপনাকে এলোমেলোভাবে আমদানি করতে হবে।
গরুর মাংসের মাংস 16

1

রবিন হুড

class RobinHood(WhiteElephantBot):       
    def take_turn(self, players, presents, just_stole):
        #get the possible steal targets
        targets = self.steal_targets(presents, just_stole)
        #who stole his gift?
        targets = [x for x in targets if presents[x][1] > 0]
        #sort by value
        targets = sorted(targets, key=lambda x: presents[x][0])        
        #only steal back if it's worth it        
        targets = [x for x in targets if presents[x][0] > 0.5]

        if len(targets)>0:
           return targets.pop()

ধনী ব্যক্তিদের কাছ থেকে চুরি করুন যারা তাদের উপার্জন করেন নি


আপনার একটি ইনডেন্টেশন ত্রুটি আছে।
গরুর মাংস 16

0

গুড সামারিটান

class GoodSamaritan(WhiteElephantBot):     
    def take_turn(self, players, presents, just_stole):  
        targets = self.steal_targets(presents, just_stole)

         #if only one player has a gift, don't steal it!
        if len(presents)<=1 or len(targets)==0:
             return None
        else:       
             #Steal the worst present  
             return min(targets, key=lambda x: presents[x][0])

দুর্ভাগ্য লোকদের সৌভাগ্যের জন্য আরও একটি সুযোগ দিন


0

জুয়াড়ি

class Gambler(WhiteElephantBot):
    def take_turn(self, players, presents, just_stole):        
        #get the possible steal targets
        targets = self.steal_targets(presents, just_stole)        

        #last player 
        if len(players)==0:
            #lets gamble! Try and get the highest score
            return None

        #If you are not last, steal the best gift that can be restolen so maybe you can become the last player
        targets = [t for t in targets if presents[t][1]<2 ]
        if targets:
            return max(targets, key=lambda x: presents[x][0])   

জুয়ার আসক্তি রয়েছে, তিনি সর্বশেষ খেলোয়াড় হওয়ার চেষ্টা করেন, তারপরে অন্য সমস্ত খেলোয়াড়কে পরাজিত করার জন্য তিনি একটি নতুন উপস্থিতিতে জুয়া খেলেন।


0

Top3Bot

class Top3Bot(WhiteElephantBot):
    def __init__(self, name):
        super().__init__(name)
        self.firstturn = True

    def take_turn(self, players, presents, just_stole):
        if self.firstturn:
            num_presents = len(players) + len(presents) + 1
            self.value_limit = (num_presents - 3) / num_presents
            self.firstturn = False

        targets = self.steal_targets(presents, just_stole)

        if players:
            targets += None

        return max(
            targets,
            key=lambda name: self.steal_ranking(name, presents, len(players))
        )


    def steal_ranking(self, name, presents, presents_remaining):
        if name is None:
            return (0, 0)

        present_value = presents[name][0]
        num_steals = presents[name][1]
        if present_value >= self.value_limit:
            if num_steals == 2:
                return (5, present_value)
            elif  num_steals == 0:
                return (4, -presemt_value)
            elif num_steals == 1 and presents_remaining == 0:
                return (3, -present_value)
            else:
                return (-1, present_value)
        else:
            if num_steals < 2:
                return (2, present_value)
            else:
                return (-2, present_value)

এই বটটি সেরা যথাসম্ভব সেরা উপস্থিত হওয়ার চেষ্টা করে না, তবে এমন একটি উপস্থাপনের চেষ্টা করে যা মূল্যবান> = (এন -3) / এন হয়, যেখানে এন উপস্থানের সংখ্যা। বেশিরভাগ ক্ষেত্রে, উপহারগুলি এতটা মূল্যবান হবে এবং টপ 3 বট এর মধ্যে একটির হাত পেতে চেষ্টা করবে, তবে সে আসলে কোনটি পাবে সে তার যত্নশীল নয়।


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