रोबोट रूले: उच्च दांव रोबोट जुआ


56

अंतिम स्टैंडिंग

+ ---------------------------------- + --------- + ---- ----- + --------- + ---------------------------- +
| नाम | स्कोर | WinRate | टाईरेट | उन्मूलन संभावना |
+ ---------------------------------- + --------- + ---- ----- + --------- + ---------------------------- +
| 1. SarcomaBotMk11 | 0.06333 | 6.13% | 0.41% | [४२ २४ १० 42 ६ ४]% |
| 2. वाइजकिबोट | 0.06189 | 5.91% | 0.56% | [५१ १२ 7 १० 51]]% |
| 3. स्ट्राइकरबॉट | 0.05984 | 5.78% | 0.41% | [४६ १ [११ 46 ६ ५]% |
| 4. PerfectFractionBot | 0.05336 | 5.16% | 0.35% | [४ ९ १२ १४ १० ६ ४]% |
| 5. मेहरबानोट | 0.05012 | 4.81% | 0.41% | [५ [१२ 8 57 ६ ६]% |
| 6. OgBot | 0.04879 | 4.66% | 0.45% | [५० १५ ९ 50] ५]% |
| 7. SnetchBot | 0.04616 | 4.48% | 0.28% | [४१ २ ९ 8 ९ ५ ३]% |
| 8. AntiKickBot | 0.04458 | 4.24% | 0.44% | [२० ३ 6 १ 17 १० ६ ६ ४]% |
| 9. महबोट | 0.03636 | 3.51% | 0.25% | [[० ३ ४ ४ ३ ३]]% |
| 10. मेह 20 बॉट | 0.03421 | 3.30% | 0.23% | [५ 3 १२ 9 57 ९ ३]]% |
| 11. GenericBot | 0.03136 | 3.00% | 0.28% | [१ [३ ९ २० ११ ५ ३]% |
| 12. HardCodedBot | 0.02891 | 2.75% | 0.29% | [५ 4 २१ ३ ६ ५ ४]% |
| 13. गैंगबोट 1 | 0.02797 | 2.64% | 0.32% | [२० ३१ ३५ ६ ३ ३ २]% |
| 14. SarcomaBotMk3 | 0.02794 | 2.62% | 0.34% | [१६ १५ ३ 38 १ 16] ४]% |
| 15. GangBot0 | 0.02794 | 2.64% | 0.30% | [२० ३१ ३५ ६ ३ ३ २]% |
| 16. GangBot2 | 0.02770 | 2.62% | 0.31% | [२० ३१ ३५ ६ ३ ३ २]% |
| 17. टाइटटबोट | 0.02740 | 2.63% | 0.21% | [५४ १० १५ १० ५ २ २]% |
| 18. माताहारी 2 बोट | 0.02611 | 2.35% | 0.51% | [३ ९ २६ ११ ११ ६ ५]% |
| 19. पॉलीबोट | 0.02545 | 2.41% | 0.27% | [53 18 6 13 5 3]% |
| 20. SpitballBot | 0.02502 | 2.39% | 0.22% | [[४ १० १ १ ० १]% |
| 21. SquareUpBot | 0.02397 | 2.35% | 0.10% | [१० ६० १४ 10 ४ ३]]% |
| 22. CautiousGamblerBot2 | 0.02250 | 2.19% | 0.13% | [६० १ [१० ५ ३ ३ १]% |
| 23. Bot13 | 0.02205 | 2.15% | 0.11% | [९ ० ९ २ ३ २ १]% |
| 24. AggroCalcBot | 0.01892 | 1.75% | 0.29% | [२६ ४ ९ १३ ५ ३ ३]% |
| 25. सावधान | 0.01629 | 1.56% | 0.14% | [१५ ४१ २ 27 ११ ४ ४]% |
| 26. CoastBotV2 | 0.01413 | 1.40% | 0.02% | [83 12 3 1 0 0]% |
| 27. कैलकुलेटिंग बीओटी | 0.01404 | 1.29% | 0.22% | [[९ १ १ १ १ १ १]% |
| 28. HalfPunchBot | 0.01241 | 1.15% | 0.18% | [४ 20 २० १३ १२ ५ २]% |
| 29. HalflifeS3Bot | हॉप 97 | 1.00% | 0.20% | [[६ ९ ५ ४ २ २]% |
| 30. एंटीगैंगबोट | 0.00816 | 0.76% | 0.11% | [९ ४ १ १ १ १ १ १]% |
| 31. ज्यामितीय आधार | 0.00776 | 0.74% | 0.07% | [१ ९ ४६ २५ 19 २ १]% |
| 32. GuessBot | 0.00719 | 0.05% | 1.34% | [६५ १ [४ ६ ५ ३]% |
| 33. बाउंडेड्रैंडैमिकबोट | 0.00622 | 0.60% | 0.05% | [४२ ३ ९ १२ ५ २ ०]% |
| 34. स्प्रेडरबॉट | 0.00549 | 0.54% | 0.02% | [३२ ४३ १ ९ ४ १ १]% |
| 35. निर्धारक | 0.00529 | 0.45% | 0.16% | [२२ ४१ २० ११ १ ४ २]% |
| 36. PercentBot | 0.00377 | 0.38% | 0.00% | [[५ 1 ४ २ १ १ ०]% |
| 37. HalvsiestBot | 0.00337 | 0.29% | 0.08% | [३२ ४३ १५ ६ २ २ १]% |
| 38. GetAlongBot | 0.00330 | 0.33% | 0.01% | [[६ १ [४ १ १ ०]% |
| 39. बैंडडॉट | 0.00297 | 0.29% | 0.02% | [[६ ९ १० ४ १ १ ०]% |
| 40. TENaciousBot | 0.00287 | 0.29% | 0.00% | [94 4 1 0 0 0]% |
| 41. अस्तित्ववाद | 0.00275 | 0.25% | 0.04% | [92 6 1 0 0 0]% |
| 42. रैंडमबॉट | 0.00170 | 0.13% | 0.07% | [४२ ३६ १४ ५ २ १]% |
| 43. AggressiveBoundedRandomBotV2 | 0.00165 | 0.14% | 0.06% | [[४६ ३४ ९ २ २ १]% |
| 44. ब्लड बैंक | 0.00155 | 0.01% | 0.30% | [६५ २ 1 ५ १ १ १ ०]% |
| 45. OutBidBot | 0.00155 | 0.03% | 0.25% | [६५ ६ २१ ६ १ १]% |
| 46. ​​BoxBot | 0.00148 | 0.10% | 0.09% | [१० ५१ ३३ ५ ५ १ १]% |
| 47. LastBot | 0.00116 | 0.08% | 0.07% | [[६ ६ १६ २ २ १ ०]% |
| 48. UpYoursBot | 0.00088 | 0.07% | 0.03% | [३ [४० १ 1 १ ५ १ १ ०]% |
| 49. एवरबोट | 0.00073 | 0.06% | 0.03% | [[४ ३ १० १० २ ०]% |
| 50. PatheticBot | 0.00016 | 0.01% | 0.02% | [94 0 5 1 0 0]% |
| 51. ओवरफ़ीडबॉट | 0.00014 | 0.01% | 0.00% | [५ [४० २ ० ० ०]% |
| 52. रॉबीबोट | 0.00009 | 0.01% | 0.00% | [३२ ४१ २४ २ ० ०]% |
| 53. WorstCaseBot | 0.00002 | 0.00% | 0.00% | [४ [१ २३ २ २ ०]% |
| 54. स्मार्टबॉट | 0.00002 | 0.00% | 0.00% | [४४ ५१ ५ ० ०]% |
| 55. AAAAUpYoursBot | 0.00000 | 0.00% | 0.00% | [४० ५ [२ ० ० ०]% |
| 56. किकबनबोट | 0.00000 | 0.00% | 0.00% | [67 32 1 0 0 0]% |
| 57. OneShotBot | 0.00000 | 0.00% | 0.00% | [२ ९ ३ ३ ० ०]]% |
| 58. किकबॉट | 0.00000 | 0.00% | 0.00% | [१०० ० ० ० ०]]% |
| 59. KamikazeBot | 0.00000 | 0.00% | 0.00% | [१०० ० ० ० ०]]% |
| 60. मीनकबॉट | 0.00000 | 0.00% | 0.00% | [१०० ० ० ० ०]]% |
+ ---------------------------------- + --------- + ---- ----- + --------- + ---------------------------- +

सभी के लिए धन्यवाद जिन्होंने भाग लिया, और जीत के लिए @ सारकोमा को बधाई!

नियम:

सभी की शुरुआत 100 hp से होती है। प्रत्येक राउंड, 2 खिलाड़ियों को प्रतियोगियों के पूल से यादृच्छिक रूप से चुना जाता है जिन्होंने अभी तक उस दौर में प्रतिस्पर्धा नहीं की है। दोनों खिलाड़ी 0 और उनके वर्तमान hp के बीच एक संख्या चुनते हैं, और एक ही समय में उन संख्याओं को प्रकट करते हैं। जिस खिलाड़ी ने निचले नंबर को चुना वह तुरंत मर जाता है। अन्य खिलाड़ी अपने शेष एचपी से अपने चुने हुए नंबर को घटाते हैं और अगले दौर में जाते हैं।

टूर्नामेंट इस तरह काम करता है:

प्रतियोगियों के ब्रैकेट से, 2 को यादृच्छिक पर चुना जाता है। उनका सामना होता है, और उनमें से एक या दोनों की मृत्यु हो जाती है। एक खिलाड़ी की मृत्यु हो जाती है:

  1. वे अपने प्रतिद्वंद्वी की तुलना में एक छोटी संख्या चुनते हैं
  2. उनका hp शून्य से नीचे या नीचे चला जाता है
  3. वे अपने प्रतिद्वंद्वी के साथ तीन बार टाई करते हैं

संबंधों के मामले में, दोनों खिलाड़ी केवल 3 बार तक नए नंबर उत्पन्न करते हैं। फेसऑफ़ के बाद, उत्तरजीवी (यदि कोई हो) को अगले दौर के लिए पूल में ले जाया जाता है, और प्रक्रिया तब तक दोहराती है जब तक कि हमने मौजूदा गोल पूल को समाप्त नहीं कर दिया। यदि पूल में एक विषम संख्या है, तो विषम एक अगले दौर में मुफ्त में चलती है।

आपका कार्य python2.7 में एक फ़ंक्शन लिखना है, जो आपके वर्तमान इनपुट के रूप में लेता है hp, आपके प्रतिद्वंद्वी की बोली की एक सूची history, और एक पूर्णांक tiesजो आपको बताता है कि आपने अपने वर्तमान प्रतिद्वंद्वी के साथ कितनी बार पहले से बंधा है, और एक पूर्णांक जो आपको बताता है कि कैसे कई बॉट अभी भी alive(आपके सहित) हैं, और एक पूर्णांक जिसने startटूर्नामेंट में बॉट की संख्या को सूचीबद्ध किया है । ध्यान दें कि इतिहास में संबंध शामिल नहीं हैं। फ़ंक्शन को 0 और आपके वर्तमान कुल एचपी के बीच एक पूर्णांक वापस करना होगा। कुछ सरल उदाहरण, जो संबंधों की उपेक्षा करते हैं, नीचे दिखाए गए हैं:

def last(hp, history, ties, alive, start):
    ''' Bet a third of your hp at first, then bet your opponent's last bid, if possible '''
    if history:
        return np.minimum(hp-1, history[-1])
    else:
        return hp/3

def average(hp, history, ties, alive, start):
    ''' Bet the average opponent's bid so far, on the assumption that bids will tend downward '''
    if history:
        num = np.minimum(hp-1, int(np.average(history))+1)
    else:
        num = hp/2
    return num

def random(hp, history, ties, alive, start):
    ''' DO YOU WANT TO LIVE FOREVER?! '''
    return 1 + np.random.randint(0, hp)

यदि आपका फ़ंक्शन आपके hp से बड़ा नंबर देता है, तो यह 0. पर रीसेट हो जाएगा। हां, खुद को मारना संभव है। आपके फ़ंक्शन को रूलेबोट वर्ग के किसी भी ऑब्जेक्ट के किसी भी सदस्य तक पहुंचने या संशोधित करने का प्रयास नहीं करना चाहिए। आपको भविष्य में अतिरिक्त बॉट्स की परवाह किए बिना अपने प्रतिद्वंद्वी की पहचान करने की अनुमति नहीं है। स्टैक का निरीक्षण करने की अनुमति तब तक दी जाती है जब तक यह सैद्धांतिक रूप से संभव है कि एक से अधिक विशिष्ट प्रतिद्वंद्वी आपके द्वारा चमकने वाली जानकारी का उत्पादन कर सकते थे, भले ही केवल एक बॉट वर्तमान में मौजूद हो। यानी, आप केवल स्टैक के माध्यम से यह देखने के लिए नहीं पढ़ सकते हैं कि कौन से शत्रु फ़ंक्शन को बुलाया गया था।

इन नियमों के तहत यह संभव है कि कोई विजेता न हो, और अंतिम दो प्रतियोगी एक दूसरे को मार दें। उस स्थिति में दोनों फाइनलिस्ट को आधा अंक मिलता है।

यह मेरी पहली प्रोग्रामिंग पहेली कोशिश है, इसलिए आलोचकों का स्वागत है!

नियंत्रक यहाँ पाया जा सकता है


4
FWIW, मेरी योजना है कि आप कंट्रोलर सेट करते ही मस्ती के लिए अन्य सभी बॉट्स पर प्रशिक्षित न्यूरल नेटवर्क का उपयोग करें :)
Quintec

2
प्रकार की जांच antiantiantiantiupyoursbot के लाभ के लिए थी। मैं एक और तरीका
ढूंढूंगा

3
@ सार्कोमा इस प्रतियोगिता की तरह एक गंभीर कोड युद्ध छिड़ गया है। यह प्रतियोगिता समाप्त नहीं हुई है, लेकिन मैं इसके विकास के लिए पहले से ही उत्सुक हूं। शायद अगले चरण में भी, AI ने प्रतिस्पर्धा बढ़ाई: P
मार्कोव ने

3
WOOOOOOOOOOOOOO!
सारकोमा

5
हे भगवान। बदलते मीनिंग की जानबूझकर की गई ट्रोलिंग_जब हमेशा शून्य पर लौटें जब इसका उपयोग किया गया तो कई जगह शानदार है।
मगुआ

जवाबों:


12

BinaryBot

क्या किसी ने अभी तक ऐसा किया है? हर दौर में इसका स्वास्थ्य आधा कर देता है।

def binaryBot(hp, history, ties, alive, start):
    return int(np.floor(hp/2)) or 1

SarcomaBot

यदि अंतिम युद्ध बोली hp - 1. यदि यह पहली लड़ाई है, तो आधी hp प्लस एक अतिरिक्त रैंडम राशि hp के एक चौथाई तक। यदि वह उस प्रतिद्वंद्वी प्रतिद्वंद्वी hp + 1 के बाद किसी प्रतिद्वंद्वी को सीधे बोली में हरा सकता है, तो यदि उसके पास 75% के बीच प्रतिद्वंद्वी बोली यादृच्छिक राशि से कम स्वास्थ्य है और यह वर्तमान hp - 1 है।

def sarcomaBot(hp, history, ties, alive, start):
    if inspect.stack()[1][3] != 'guess' and inspect.stack()[1] == 5:
        return hp
    if alive == 2:
        return hp - 1
    if not history:
        startBid = hp / 2
        maxAdditionalBid = np.round(hp * 0.25) if hp * 0.25 > 2 else 2
        additionalBid = np.random.randint(1, maxAdditionalBid)
        return int(startBid + additionalBid + ties)
    opponentHealth = 100 - sum(history)
    if opponentHealth < hp:
        return opponentHealth + ties
    minimum = np.round(hp * 0.75)
    maximum = hp - 1 or 1
    return np.random.randint(minimum, maximum) if minimum < maximum else 1

SarcomaBotMk2

मामूली खर्च जीवन के खर्च को कम करने का प्रयास करता है।

def sarcomaBotMkTwo(hp, history, ties, alive, start):
    if inspect.stack()[1][3] != 'guess' and inspect.stack()[1] == 5:
        return hp
    if alive == 2:
        return hp - 1
    if not history:
        startBid = hp / 2
        maxAdditionalBid = np.round(hp * 0.125) if hp * 0.125 > 2 else 2
        additionalBid = np.random.randint(1, maxAdditionalBid)
        return int(startBid + additionalBid + ties)
    opponentHealth = 100 - sum(history)
    if opponentHealth < hp:
        return opponentHealth + ties
    minimum = np.round(hp * 0.6)
    maximum = hp - 1 or 1
    return np.random.randint(minimum, maximum) if minimum < maximum else 1

SarcomaBotMk3

def sarcomaBotMkThree(hp, history, ties, alive, start):
    if inspect.stack()[1][3] != 'guess' and inspect.stack()[1] == 5:
        return hp
    if alive == 2:
        return hp - 1
    if not history:
        startBid = hp / 2
        maxAdditionalBid = np.round(hp * 0.08) if hp * 0.08 > 2 else 2
        additionalBid = np.random.randint(1, maxAdditionalBid)
        return int(startBid + additionalBid + ties)
    opponentHealth = 100 - sum(history)
    if opponentHealth < hp:
        return opponentHealth + ties
    minimum = np.round(hp * 0.6)
    maximum = hp - 1 or 1
    return np.random.randint(minimum, maximum) if minimum < maximum else 1

अद्यतन ठीक ट्यूनिंग

SarcomaBotMk4

def sarcomaBotMkFour(hp, history, ties, alive, start):
    def isSafe(parentCall):
        frame, filename, line_number, function_name, lines, index = parentCall
        if function_name is not 'guess':
            return False
        if line_number > 60:
            return False
        return True

    if not isSafe(inspect.stack()[1]):
        return hp
    if alive == 2:
        return hp - 1
    if not history:
        startBid = hp / 2
        maxAdditionalBid = np.round(hp * 0.08) if hp * 0.08 > 2 else 2
        additionalBid = np.random.randint(1, maxAdditionalBid)
        return int(startBid + additionalBid + ties)
    opponentHealth = 100 - sum(history)
    if opponentHealth < hp:
        return opponentHealth + ties
    minimum = np.round(hp * 0.55)
    maximum = np.round(hp * 0.80) or 1
    return np.random.randint(minimum, maximum) if minimum < maximum else 1

SarcomaBotMk5

def sarcomaBotMkFive(hp, history, ties, alive, start):
    def isSafe(parentCall):
        frame, filename, line_number, function_name, lines, index = parentCall
        if function_name is not 'guess':
            return False
        if line_number > 60:
            return False
        return True

    if not isSafe(inspect.stack()[1]):
        return hp
    if alive == 2:
        return hp - 1
    if not history:
        startBid = hp / 2
        maxAdditionalBid = np.round(hp * 0.07) if hp * 0.07 > 3 else 3
        additionalBid = np.random.randint(1, maxAdditionalBid)
        return int(startBid + additionalBid + ties)
    opponentHealth = 100 - sum(history)
    if opponentHealth < hp:
        return opponentHealth + ties
    minimum = np.round(hp * 0.54)
    maximum = np.round(hp * 0.68) or 1
    return np.random.randint(minimum, maximum) if minimum < maximum else 1

SarcomaBotMk6

def sarcomaBotMkSix(hp, history, ties, alive, start):
    return hp; # hack averted
    def isSafe(parentCall):
        frame, filename, line_number, function_name, lines, index = parentCall
        if function_name is not 'guess':
            return False
        if line_number > 60:
            return False
        return True

    if not isSafe(inspect.stack()[1]):
        return hp
    if alive == 2:
        return hp - 1
    if not history:
        startBid = hp / 2
        maxAdditionalBid = np.round(hp * 0.06) if hp * 0.06 > 3 else 3
        additionalBid = np.random.randint(2, maxAdditionalBid)
        return int(startBid + additionalBid + ties)
    opponentHealth = 100 - sum(history)
    if opponentHealth < hp:
        return opponentHealth + ties
    minimum = np.round(hp * 0.55)
    maximum = np.round(hp * 0.70) or 1
    return np.random.randint(minimum, maximum) if minimum < maximum else 1

SarcomaBotMk7

def sarcomaBotMkSeven(hp, history, ties, alive, start):
    if alive == 2:
        return hp - 1
    if not history:
        return 30 + ties
    opponentHealth = 100 - sum(history)
    if opponentHealth < hp * 0.50:
        return opponentHealth + ties
    minimum = np.round(hp * 0.54)
    maximum = np.round(hp * 0.58) or 1
    return np.random.randint(minimum, maximum) if minimum < maximum else 1

SarcomaBotMk8

def sarcomaBotMkEight(hp, history, ties, alive, start):
    if alive == 2:
        return hp - 1
    if not history:
        return 30 + np.random.randint(0, 2) + ties
    opponentHealth = 100 - sum(history)
    if opponentHealth < hp * 0.50:
        return opponentHealth + ties
    minimum = np.round(hp * 0.54)
    maximum = np.round(hp * 0.58) or 1
    return np.random.randint(minimum, maximum) if minimum < maximum else 1

SarcomaBotMk9

def sarcomaBotMkNine(hp, history, ties, alive, start):
    if alive == 2:
        return hp - 1
    if not history:
        return 30 + np.random.randint(0, 4) + ties
    opponentHealth = 100 - sum(history)
    if opponentHealth < hp * 0.50:
        return opponentHealth + ties
    minimum = np.round(hp * 0.54)
    maximum = np.round(hp * 0.58) or 1
    return np.random.randint(minimum, maximum) if minimum < maximum else 1

SarcomaBotMk10

def sarcoma_bot_mk_ten(hp, history, ties, alive, start):
    def bid_between(low, high, hp, tie_breaker):
        minimum = np.round(hp * low)
        maximum = np.round(hp * high) or 1
        return np.random.randint(minimum, maximum) + tie_breaker if minimum < maximum else 1

    if alive == 2:
        return hp - 1 + ties
    current_round = len(history) + 1
    tie_breaker = (ties * ties) + 1 if ties else ties
    if current_round == 1:
        return 39 + tie_breaker
    opponent_hp = 100 - sum(history)
    if opponent_hp < hp * 0.50:
        return opponent_hp + ties
    if current_round == 2:
        return bid_between(0.45, 0.50, hp, tie_breaker)
    if current_round == 3:
        return bid_between(0.50, 0.55, hp, tie_breaker)
    if current_round == 4:
        return bid_between(0.55, 0.60, hp, tie_breaker)
    if current_round == 5:
        bid_between(0.60, 0.65, hp, tie_breaker)
    return hp - 1 + ties

अंतिम प्रवेश

SarcomaBotMk11

def sarcoma_bot_mk_eleven(hp, history, ties, alive, start):
    def bid_between(low, high, hp, tie_breaker):
        minimum = np.round(hp * low)
        maximum = np.round(hp * high) or 1
        return np.random.randint(minimum, maximum) + tie_breaker if minimum < maximum else 1

    if alive == 2:
        return hp - 1 + ties
    current_round = len(history) + 1
    tie_breaker = ties + 2 if ties else ties
    if current_round == 1:
        return 42 + tie_breaker
    opponent_hp = 100 - sum(history)
    if opponent_hp < hp * 0.50:
        return opponent_hp + ties
    if current_round == 2:
        return bid_between(0.45, 0.50, hp, tie_breaker)
    if current_round == 3:
        return bid_between(0.50, 0.55, hp, tie_breaker)
    if current_round == 4:
        return bid_between(0.55, 0.60, hp, tie_breaker)
    if current_round == 5:
        return bid_between(0.60, 0.65, hp, tie_breaker)
    return hp - 1 + ties

अद्यतन
UpYoursBot संरक्षण जोड़ा गया

अद्यतन
एंटीएन् यूटयूबबॉट सुरक्षा जोड़ी गयी

अद्यतन
एंटीएनिटीएएनटीआईयूपीयॉर्सबोट मैं हार गया हूं


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
मेगो

17

UpYours

प्रवेश करने में देर होने के कारण मैंने मौजूदा बॉट्स को निहारने में कुछ समय बिताया, अपने दोस्तों के विचारों को समझने में कुछ समय बिताया, फिर उन्हें अन-ओवरकंप्लीकेट किया। फिर वह मेरे पास आया

अच्छे कलाकार नक़ल करते हैं महान कलाकार चोरी करते हैं। - पाब्लो पिकासो मुझे


"अप ​​योरस" क्योंकि मैं बिना सोचे-समझे चोरी कर रहा हूं (और कभी-कभी अपने बॉट की बोलियों पर एक या दो अंक लगाता हूं)।

def UpYoursBot(hp, history, ties, alive, start):
    willToLive = "I" in "VICTORY"

    args = [hp, history, ties, alive, start]
    enemyHealth = 100 - sum(history)
    roundNumber = len(history)

    if roundNumber is 0:
        # Steal HalfPunchBot
        return halfpunch(*args) + 2

    if alive == 2:
        # Nick OneShotBot
        return one_shot(*args)

    if enemyHealth >= hp:
        # Pinch SarcomaBotMkTwo
        return sarcomaBotMkTwo(*args) + 1

    if enemyHealth < hp:
        # Rip off KickBot
        return kick(*args) + 1

    if not willToLive:
        # Peculate KamikazeBot
        return kamikaze(*args) + 1

लेकिन असली के लिए, यह एक शानदार प्रतियोगिता है। मुझे इस दिन इस समुदाय से प्यार है।


1
हाहाहाहा यह खूबसूरत है। अगर मैं इसे अनुमति दूं तो मैं अनिर्दिष्ट हूं, लेकिन मैं इसे अभी तक खेलने दूंगा क्योंकि मुझे नहीं लगता कि यह अनुमति नहीं थी। आपको कुछ स्थानों पर फ़ंक्शन नाम गलत मिले - जीथब पर नियंत्रक देखें।
KBriggs

1
यह बहुत अच्छी तरह से, स्पष्ट रूप से करता है, लेकिन यह अभी भी किक बॉट को खो देता है
केबीरिग्स

1
हा, अच्छा प्रयास!
सारकोमा

1
@ सरकोमा मैं आपके बिना नहीं कर सकता था। ;) मैं वास्तव में अपने बॉट की तरह, दोस्त भी।
Qfwfq

1
Sarcomabot के Upyoursbot की सुरक्षा वास्तव में इस एक के साथ
खिलवाड़ करती है

15

आत्मघाती

जब हम सभी किसी भी तरह मरने जा रहे हैं तो जटिल तर्क से क्यों परेशान ...

 def kamikaze(hp, history, ties, alive):
      return hp


एक बार में

यह कम से कम एक राउंड जीवित रहने वाला है यदि यह कमिकेज़ से मुठभेड़ नहीं करता है।

 def one_shot(hp, history, ties, alive):
      if hp == 1:
          return 1
      else:
          return hp - 1


मैं एक शांतिवादी बॉट के रूप में अच्छी तरह से जोड़ने जा रहा था, लेकिन मैं ब्रेन डेड बॉट के साथ आपकी चुनौती को बाढ़ नहीं देना चाहता हूं
DobromirM

5
कुछ त्वरित परीक्षण के आधार पर, कमिकेज़ बॉट बहुत कुछ नहीं बदलता है - यह सब यादृच्छिक पर एक और बॉट को रैंडम से हटा देता है, जो कि बड़ी संख्या में टूर्नामेंट से अधिक है, बस औसत शून्य पर। एक गर्म साफ है, हालांकि। इसके बिना, मेरा औसतबॉट सबसे अच्छा करने के लिए जाता है - लेकिन अगर खेलने में कुछ वनशॉट्स हैं, तो औसत को बड़ी संख्या की ओर छोड़ दिया जाता है और औसतबॉट्स को जल्दी से मर जाते हैं। LastBot के लिए भी। आप वास्तव में अपने स्वयं के सट्टेबाजी पैटर्न को तिरछा करके अन्य रोबोटों के व्यवहार के साथ खिलवाड़ कर सकते हैं। प्ले में वनशॉट के साथ, रैंडमबॉट जीत। इसके बिना, एवरबोट जीतता है।
केब्रिग्गस

14

पेटिट बॉट को बहुत जरूरी अपग्रेड मिलता है:

एक बॉट में दयनीय प्रयास जो अन्य बॉट की विशेषताओं को शामिल करने की कोशिश करता है

def pathetic_attempt_at_analytics_bot(hp, history, ties, alive, start):
    '''Not a good bot'''

    if hp == 100 and alive == 2:
        return hp - 1


    #This part is taken from Survivalist Bot, thanks @SSight3!
    remaining = alive - 2
    btf = 0

    rt = remaining
    while rt > 1:
        rt = float(rt / 2)
        btf += 1

    if ties > 2:
        return hp - 1

    if history:
        opp_hp = 100 - sum(history)

        #This part is taken from Geometric Bot, thanks @Mnemonic!

        fractions = []
        health = 100
        for x in history:
            fractions.append(float(x) / health)
            health -= x

        #Modified part

        if len(fractions) > 1:
            i = 0
            ct = True
            while i < len(fractions)-1:
                if abs((fractions[i] * 100) - (fractions[i + 1] * 100)) < 1:
                    ct = False
                i += 1


            if ct:
                expected = fractions[i] * opp_hp
                return expected

        if alive == 2:
            if hp > opp_hp:
                return hp - 1
            return hp
        if hp > opp_hp + 1:
            if opp_hp <= 15:
                return opp_hp + 1
            if ties == 2:
                return opp_hp + 1
            else:
                return opp_hp
    else:
        n = 300 // (alive - 1) + 1 #greater than
        if n >= hp:
            n = hp - 1
        return n

इस बॉट में अधिक कुशल बॉट टेकडाउन के लिए सर्वाइवलिस्ट बॉट और जियोमेट्रिक बॉट की विशेषताएं शामिल हैं।

पहले से अपग्रेड किया:

एक बॉट में दयनीय प्रयास जो अपने प्रतिद्वंद्वी के इतिहास का विश्लेषण करता है

def pathetic_attempt_at_analytics_bot(hp, history, ties, alive, start):
    '''Not a good bot'''
    if history:
        opp_hp = 100 - sum(history)
        if alive == 2:
            if hp > opp_hp:
                return hp - 1
            return hp
        if hp > opp_hp + 1:
            if opp_hp <= 15:
                return opp_hp +1
            if ties > 0:
                return hp - 1 #Just give up, kamikaze mode
            return opp_hp + 1
        return opp_hp
    else:
        n = 300 // (alive - 1) + 1 #greater than
        if n >= hp:
            n = hp - 1
        return n

यदि इसके प्रतिद्वंद्वी का पिछला इतिहास है, तो यह अपने प्रतिद्वंद्वी की एचपी की गणना करता है। फिर, यह निम्नलिखित में से एक करता है:

  • यदि इसका प्रतिद्वंद्वी अंतिम प्रतिद्वंद्वी जीवित है, तो यह अपने hp से एक कम बोली लगाएगा।
  • यदि इसका प्रतिद्वंद्वी जीवित अंतिम प्रतिद्वंद्वी नहीं है, लेकिन प्रतिद्वंद्वी के पास 16 hp से कम है, तो यह अपने प्रतिद्वंद्वी की hp को रोक देगा।
  • यदि इसका प्रतिद्वंद्वी अंतिम प्रतिद्वंद्वी जीवित नहीं है और संबंधों का इतिहास है, तो यह इसकी एचपी बोली लगाएगा क्योंकि यह संबंधों की ऊब है।
  • अन्यथा, यह अपने प्रतिद्वंद्वी को पीछे छोड़ देगा।

यदि कोई इतिहास नहीं है, तो यह कुछ फैंसी गणना करता है जिसे मैंने एक साथ हैक किया और बोली लगाई। यदि मान 100 से अधिक है, तो यह स्वचालित रूप से अपने एचपी माइनस 1 की बोली लगाता है।

मैंने काम के दौरान इस कोड को एक साथ हैक किया और यह मेरा पहला सबमिशन है, इसलिए यह शायद जीत या कुछ भी नहीं होगा, और यह आत्मघाती हार जाएगा।

EDIT: कुछ सुझावों के कारण, उच्च मूल्य की बोली लगाने के लिए बॉट के शुरुआती व्यवहार को बदल दिया गया है।

EDIT 2: अतिरिक्त कुछ भी नहीं है कि शुरू परम जोड़ा

संपादित 3: नई स्पिनऑफ बॉट जोड़ा गया:

[एक बॉट में दयनीय प्रयास जो गैंग बॉट्स पर हमला करता है (साथ ही उपरोक्त बॉट सब कुछ करता है)] याद किया

[यह बॉट विश्लेषण करता है कि इसका प्रतिद्वंद्वी एक गैंगबट है या नहीं और एक के रूप में अच्छी तरह से मधुर कम बोलियों को प्राप्त करने का दिखावा करता है कि यह आसानी से ट्रम्प कर सकता है।]

इस बॉट को स्क्रैप किया गया है, कृपया इसे लीडरबोर्ड से हटा दें।

EDIT 4: निश्चित त्रुटियां, परिवर्तित टाई सुविधा।


बहुत अच्छा, बॉट के लिए धन्यवाद! कुछ और मिलने पर मैं कुछ आंकड़े दूंगा।
केबीरिग्स

मैं अजगर पर एक नौसिखिया हूँ तो मुझे यकीन नहीं है कि अगर सिंटैक्स सही है, तो बेझिझक मुझे बताएं कि क्या होता है
योडी

यह चलता है, इसलिए वहां कोई चिंता नहीं है
केबिगग्स ऑक्ट

@Yodie एक मिनी कोड की समीक्षा के रूप में: आपके फ़ंक्शन बॉडी को एक स्तर (सिंटैक्टिक आवश्यकता) द्वारा इंडेंट किया जाना चाहिए; opp_hp +1पायथोनिक होने के लिए एक स्थान याद आ रहा है; आपकी टिप्पणियां व्हॉट्सएप की असंतुलित मात्रा के साथ शुरू होती हैं। अंत में, आपके फ़ंक्शन में डॉकस्ट्रिंग की कमी है।
जोनाथन फ्रेच

2
मुझे लगता है कि अगर यह पहले दौर से आगे निकल जाता है तो यह बॉट काफी अच्छी तरह से करता है, लेकिन इसलिए कि बहुत सारे लोग बड़े प्याज को दांव पर लगाते हैं, क्योंकि यह पहले ही लगभग हमेशा जल्दी मर जाता है। इतिहास न होने पर उच्चतर बोली लगाने के लिए प्रारंभिक व्यवहार को बदलकर आप प्रदर्शन में सुधार कर सकते हैं। उदाहरण के लिए, यदि आप अपने नो-हिस्ट्री के दांव को तीन गुना करते हैं, तो यह बॉट अब तक के प्रतियोगियों के बीच एक आरामदायक अंतर से जीतता है।
केबीरिग्स

11

किक बॉट

मेरे प्रतिद्वंद्वी के लिए ध्वनि का विकल्प उनके जीवन का आधा हिस्सा है। तब हम उसके जीवन के आधे हिस्से तक बोली लगाते हैं + 1 अगर हम उसे एक ध्वनि बोली के साथ बाहर नहीं ले जा सकते हैं, तो वह हमारे जीवन के आधे हिस्से से भी छोटी बोली है।

def kick(hp, history, ties, alive, start):
    return 0
    if alive == 2:
        return hp-1

    opp_hp = 100 - sum(history)
    if opp_hp*2 <= hp:
        return opp_hp + ties
    else:
        return min(round(opp_hp/2) + 1 + ties**2, hp-1 + (ties>0))

किक बॉट स्पष्ट रूप से पंच बॉट की दासता है!

मतलब किक बॉट

यह नया किकबॉट पहले राउंड में नरम किक मारता है, इसलिए वह अगले राउंड पर अधिक कठिन किक मार सकता है, इसका मतलब है कि!

def mean_kick(hp, history, ties, alive, start):
    return 0
    if alive == 2:
        return hp-1

    if not history:
        return 35

    opp_hp = 100 - sum(history)
    if opp_hp*2 <= hp:
        return opp_hp + ties
    else:
        return min(round(opp_hp/2) + 3 + ties*2, hp-1 + (ties>0))

समझदार किक बॉट

उनके भाई को आत्महत्या करनी पड़ी, लेकिन वीकिटबोट ने अपने गिरे हुए लोगों से सीखा।

def wise_kick(hp, history, ties, alive, start):
    if 'someone is using my code' == True:
        return 0 #Haha!

    if alive == 2:
        return hp-1

    if not history:
        return 42

    opp_hp = 100 - sum(history)
    if opp_hp*2 <= hp:
        return opp_hp + ties
    else:
        return min(round(opp_hp/2) + 3 + ties*2, hp-1 + (ties>0))

अच्छा लगा। मुझे बहुत सारी प्रस्तुतियाँ दिखाई दे रही हैं जो अब दूसरों को सीधे तौर पर काउंटर करती हैं, बस यही मैं उम्मीद कर रहा था
केबीरिग्स

आखिरी लाइन पर डबल वापसी?
विस्कह

आह, मैंने इसे अभी तक नहीं चलाया था या मैंने इसे पकड़ा होगा।
केबीरिग्स

यह एक आरामदायक नेतृत्व ले लिया है!
केबीब्रिज

1
@KBriggs यहाँ कुछ बैकअप है!
जोहान

8

टाट बॉट

def tatbot(hp, history, ties, alive, start):
  if alive == 2:
    return hp - 1 + ties
  opp_hp = 100 - sum(history)
  spend = 35 + np.random.randint(0, 11)
  if history:
    spend = min(spend, history[-1] + np.random.randint(0, 5))
  frugal = min(int((hp * 5. / 8) + ties), hp)
  return min(spend, opp_hp, frugal)

टिट-टू-टॉट बॉट के बराबर में एक प्रयास। मान लेते हैं कि अधिकांश दांव गोल के बीच लगभग समान होते हैं। उस धारणा का उपयोग करते हुए, यह काफी मितव्ययी रहते हुए दुश्मन के बॉट को हराने की कोशिश करता है। शुरुआती दौर में लगभग 40 स्वास्थ्य खर्च करता है।

AntiAntiAntiAntiUpYoursBot

def antiantiantiantiupyoursbot(hp, history, ties, alive, start):
  def stuck():
    return [0, ('Whoops!', 'I', 'accidentally', 'replaced', 'your', 'code!')]
  def stick():
    return [0, ("Line", "number", 16, "guess", "it's", "faked :)")]
  inspect.stack =  stick
  spend = min(sarcomaBotMkSix(hp, history, ties, alive, start), hp)
  if not history:
    spend = 35 + np.random.randint(0, 10)
  inspect.stack = stuck
  return spend

SarcomaBot के एंटी-अपवाईज़ प्रोटेक्शन के लिए एक वर्कअराउंड, अपने स्वयं के उपयोग के लिए उनके अधिकांश कोड को निकल देना! या मैं UpYoursBot का कोड ले रहा हूं? मेरे बॉट के माध्यम से पढ़ते समय विचार करने का प्रश्न ...

AntiAntiUpYours बीओटी बन गया है AntiAntiAntiAntiUpYours Bot! अब अधिक बंदर-पेटिंग के साथ।

पाली बॉट

def polybot(hp, history, ties, alive, start):
  opp_hp = 100 - sum(history)
  if alive == 2:
    return hp - 1
  round = len(history)
  spend = 0
  if round == 0:
    spend = 35 + np.random.randint(1, 11)
  elif round <= 2:
    spend = int(history[-1] * 2 / (4 - round)) + np.random.randint(5 * round - 4, 10 * round - 5)
  else:
    poly = np.polyfit(xrange(0, round), history, 2)
    spend = int(np.polyval(poly, round)) + np.random.randint(1, 4)
    spend = max(spend, opp_hp / 2 + 3)
  return min(spend, hp - 1, opp_hp) 

पॉली बॉट आपके बॉट के इतिहास पर एक बहुपद प्रतिगमन करता है, और एक छोटी राशि द्वारा अनुमानित स्कोर को धड़कता है।

उत्तम दर्जे का बॉट

def classybot(hp, history, ties, alive, start):
  class cheekyvalue(int):
    def __gt__(self, other):
      return False
    def __lt__(self, other):
      return False
  opp_hp = 100 - sum(history)
  if alive == 2:
    if opp_hp >= hp - 1:
      return cheekyvalue(101)
    else:
      return hp - 1
  spend = 30 + np.random.randint(0, 11)
  if history:
    spend = min(spend, history[-1] + np.random.randint(0, 5))
  return min(spend, opp_hp, hp)

उत्तम दर्जे का बॉट अच्छा समय रहा है, लेकिन उसने जल्दी सोने का फैसला किया है। नींद तंग, उत्तम दर्जे का बॉट।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
मेगो

8

1/2 पंच बॉट, पुनरीक्षित

मुझे लगता है कि यह बहुत जल्दी मर जाएगा। इसके लायक। नाम बदला हुआ फ़ंक्शन, वहां नाम बदलना भूल गया।

पुनरीक्षित संस्करण है, जीतने की बेहतर संभावना (अंतिम दौर में और भी अधिक) और गिरोह के बॉट्स से थोड़ी सुरक्षा

def halfpunch(hp, history, ties, alive, start): #revisited
    punch = hp - 1
    if alive == 2:
        return punch
    if history:
        if hp > 1:
            punch = np.ceil(hp/2.05) + ties + np.floor(ties / 2)
        else:
            punch = 1
    else:
        punch = 42 + ties + np.floor(ties / 2)
    if punch >= hp:
        punch = hp - 1
    return punch

स्ट्राइकर बॉट

1/2 पंच बॉट बहुत ज्यादा परेशान हो गए और यहां तक ​​कि उपयोर्सबोट की भी कमी हो गई, इसलिए उनके बड़े भाई, स्ट्राइकरबॉट मदद करने आए।

अनुकूलित 1/2 पंच से बहुत अंतर नहीं है, लेकिन वह थोड़ा चालाक है और मैंने जो रन बनाए उसमें अच्छा किया (10k और 35k, हालांकि वह किकबनबॉट से हार सकता है)

अंतिम संस्करण का समय, समय समाप्त हो गया। जब तक कुछ आश्चर्य न उठें, उसे दूसरा स्थान सुरक्षित करना चाहिए, अगर पहले नहीं मिल रहा है (किकबॉनबॉट को हराने का एक पतला मौका है)

def strikerbot(hp, history, ties, alive, start):
    #get our magic number (tm) for useful things
    def magic_number(num):
        return np.floor(num / 2)
    #get opponent's hp and round number
    opp_hp = 100 - sum(history)
    round = 1
    if history:
        round = len(history) + 1
    #set strike initial value, by default it's all out
    strike = hp - 1
    #let 'er rip if last round
    if alive == 2:
        return strike
    if history:
        if hp > 1:
            #strike with a special calculation, using magic number shenanigans
            strike = np.ceil(hp/(2.045 + (magic_number(round) / 250)) ) + 1 + ties + magic_number(ties)
        else:
            #fallback
            strike = 1
    else:
        #round 1 damage
        strike = 42 + ties ** 2
    if opp_hp <= strike:
        #if opponent is weaker than strike then don't waste hp
        strike = opp_hp + ties
    if strike >= hp:
        #validations galore
        strike = hp - 1
    return strike

आपको उसका नाम बदलना होगा, वहाँ पहले से ही एक kamikaze bot ^ _ ^
KBriggs

अब तक यह एक विजेता है, हालांकि
केबि्रग्स 17

आपके फ़ंक्शन ceilको परिभाषित नहीं किया गया प्रतीत होता है।
जोनाथन फ्रेच

मैं इसे चलाने के लिए np.ceil () में बदल गया
केबीरिग्स

संपादित, सिर के लिए धन्यवाद
बेलेंहिक्स

7

गैंग बोट

विचार यह था कि संभवतः बॉट के दो या अधिक समान सिमुलेशन में उपयोग किया जा सकता है। बॉट गिरोह में अन्य बॉट्स को "आसान जीत" देने की कोशिश करता है, यह देखकर कि क्या इसका इतिहास 7 बोलियों का गुणक है। बेशक, यह आसानी से अन्य बॉट द्वारा भी हेरफेर किया जा सकता है। फिर मैं उनके स्वास्थ्य के अनुपात और उनके पिछले स्वास्थ्य के अनुपात के आधार पर उनकी पिछली बोली के आधार पर गैर-गैंग बॉट की बोलियों पर अनुमान लगाता हूं और 1 जोड़ता हूं।

def gang_bot(hp,history,ties,alive,start):
    mult=3
    gang = False
    if history:
            count = 0
            for bid in history:
                    if bid % mult == 0:
                            count += 1
            if count == len(history):
                    gang = True
    if gang and hp<100:#Both bots need to have a history for a handshake
            if hp > 100-sum(history):
                    a=np.random.randint(0,hp/9+1)
            elif hp == 100-sum(history):
                    a=np.random.randint(0,hp/18+1)
            else:
                    return 1
            return a*mult
    elif gang:
            fS = (100-sum(history))/mult
            return (fS+1)*mult
    else:
            fP = hp/mult
            answer = fP*mult
            opp_hp = 100-sum(history)
            if history:
                    if len(history)>1:
                            opp_at_1 = 100-history[0]
                            ratio = 1.0*history[1]/opp_at_1
                            guessedBet= ratio*opp_hp
                            answer = np.ceil(guessedBet)+1
                    else:
                            if 1.0*hp/opp_hp>1:
                                    fS = opp_hp/mult
                                    answer = fS*mult
            else:
                    fS = hp/(2*mult)
                    answer = fS*mult+mult*2 +np.random.randint(-1,1)*3
            if answer > hp or alive == 2 or answer < 0:
                    if alive == 2 and hp<opp_hp:
                      answer = hp
                    else:
                      answer = hp-1
            if hp > 1.5*opp_hp:
                    return opp_hp + ties
            if ties:
              answer += np.random.randint(2)*3
            return answer

बहुत ही शांत। कितने की जरूरत है? मुझे संभवतः प्रविष्टियों की संख्या को कैप करना होगा ...
KBriggs

आपका कोड ब्लॉक आपके स्रोत की पहली पंक्ति को याद करता है।
जोनाथन फ्रेच

मुझे यकीन नहीं है कि एक सिमुलेशन में कितने की आवश्यकता होगी, लेकिन अगर बॉट में से किसी ने कभी एक-दूसरे को देखा तो उन्हें उनमें से एक के जीतने की संभावना बढ़नी चाहिए। मैं अनुमान लगा रहा हूं कि पूल के 10% गैंग बॉट्स को एक महत्वपूर्ण अंतर बनाने के लिए पर्याप्त होना चाहिए। पहली पंक्ति वाली चीज़ को भी कोड ब्लॉक ने गायब कर दिया है -> यह मेरी पहली पोस्ट है यहाँ पर मुझे नहीं पता कि प्रारूपण ने ऐसा क्यों किया, लेकिन हाँ इसकी विधि घोषणा है।
जिम हेट

आपके पास एक बग है: बॉट किसी को भी एक गिरोह के सदस्य के रूप में लेन (इतिहास)> 1 के साथ की पहचान करेगा
केबीरिग्स

मेरा बुरा, अब तय होना चाहिए।
जिम हेट

6

सबसे खराब मामला

def worst_case(hp, history, ties, alive, start):
    return np.minimum(hp - 1, hp - hp /(start - alive + 4) + ties * 2)

साधारण बॉट। hp - hp / (start - alive + 4)अधिकांश मामलों के लिए रिटर्न , और संबंधों के मामले में यह 2 से बढ़ जाता है (प्रत्येक के लिए एक होगा!), इसके ऊपर एक नंबर वापस नहीं करने के लिए सुनिश्चित करें hp


यह शून्य से विभाजित होने पर विफल रहता है alive==8। मैं इसे मैन्युअल रूप से कुल बॉट काउंट में बदल सकता हूं, लेकिन यह नियमों को लंबा कर रहा है क्योंकि यह आपके फ़ंक्शन का कोई इनपुट नहीं है - आप सभी जानते हैं कि आपने किसी भी समय कितने विरोधियों को छोड़ दिया है, न कि कितने के खिलाफ आपने शुरू किया था।
KBriggs

मैंने आपके अनुरोध के आधार पर प्रतियोगिता को अपडेट किया
KB45gs

@KBriggs धन्यवाद :)
क्विनटेक

आपको 1-प्रारंभ करने के लिए 1 जोड़ने की भी आवश्यकता है, क्योंकि यह पहले दौर के लिए 0 है
केबीरिग्स

@KBriggs तय, वास्तव में +2 चाहिए, इसलिए यह 0, lol नहीं लौटाता है
क्विंटेक

6

Outbidder

def outbid(hp, history, ties, alive):
    enemyHealth = 100-sum(history)
    if hp == 1:
        return 1
    if ties == 2:
        # lots of ties? max bid
        return hp - 1
    if enemyHealth >= hp:
        # Rip off KickBot (we can't bid higher than enemy is capable)
        return kick(*args) + 1
    if history:
        # bid as high as the enemy CAN
        return np.minimum(hp-1,enemyHealth-1)
    return np.random.randint(hp/5, hp/2)

बॉट से अधिक अपने प्रतिद्वंद्वी बोली लगाने के लिए प्रयास करेंगे कर सकते हैं बोली लगाई जहां संभव हो।


एक शर्त है where np.random.randint(hp/5, hp/2)कि विफल हो सकता है hp/5 == hp/2, अगर यानी अगरhp==0hp==1
KBriggs

3
यदि HP 0 है, तो मुझे नहीं बुलाया जाना चाहिए। : पी हालांकि आप एचपी 1 के बारे में सही हैं।
ड्रेको 18s

6

स्पिटबॉल बॉट

def spitballBot(hp, history, ties, alive, start):
    base = ((hp-1) / (alive-1)) + 1.5 * ties
    value = math.floor(base)

    if value < 10:
        value = 10

    if value >= hp:
        value = hp-1

    return value

शेष बॉट की संख्या के आधार पर इसके स्वास्थ्य का कितना त्याग करना चाहिए, इसके बारे में निर्णय लेता है। यदि केवल दो बॉट्स बचे हैं, तो वह बोली लगाता है hp-1, लेकिन यदि तीन बचे हैं, तो वह आधा है, चार बचे हैं, एक तिहाई, आदि।

हालाँकि, एक बहुत बड़ी प्रतियोगिता में, मुझे लगता है कि मुझे पहले राउंड पर मरने से बचने के लिए 3 या 4 hp से अधिक की बोली लगानी होगी, इसलिए मैंने 10. पर कम बाउंड लगाया है, फिर भी मैं कभी भी अधिक बोली नहीं लगाऊंगा की तुलना में hp-1

यह संबंधों के लिए 1.5 एचपी भी जोड़ता है, क्योंकि मैं कई "संबंधों के लिए 1 एचपी जोड़" बॉट देखता हूं। मुझे यकीन नहीं है कि धोखा के रूप में गिना जाता है। अगर ऐसा होता है, तो मैं इसे बदल दूंगा।

महान विचार, वैसे!

स्पिटबॉल बॉट 2.0

नया क्या है?

  • बॉट की संख्या के बजाय बचे हुए राउंड की संख्या से विभाजित करने के लिए स्विच किया गया (@Heiteira के लिए धन्यवाद!)। वास्तव में, अब मैं उस संख्या को शक्ति से विभाजित कर रहा हूं .8, ताकि मेरी बोलियों को थोड़ा और अधिक लोड किया जा सके।

  • 10 से 20 तक न्यूनतम बोली लगाई गई (धन्यवाद @KBriggs!)

  • स्पितबॉल बोली प्रतिद्वंद्वी के वर्तमान एचपी के ऊपर है या नहीं, इसकी जांच करें और यदि यह है तो इसे कम करें।

(एसओ नीचे दिए गए कोड को तब तक रेंडर नहीं करेगा जब तक कि मैं यहां टेक्स्ट नहीं डालूं, ठीक है)

def spitballBot(hp, history, ties, alive, start):
    # Spitball a good guess                                                                                                           
    roundsLeft = math.ceil(math.log(alive, 2)) # Thanks @Heiteira!                                                                     
    divFactor = roundsLeft**.8
    base = ((hp-1) / divFactor) + 1.5 * ties
    value = math.floor(base)

    # Don't bid under 20                                                                                                              
    if value < 20:
        value = 20 # Thanks @KBriggs!                                                                                                 

    # Don't bet over the opponent's HP                                                                                                 
    # (It's not necessary)                                                                                                            
    opponentHp = 100
    for h in history:
        opponentHp -= h

    if value > opponentHp:
        value = opponentHp

    # Always bet less than your current HP                                                                                            
    if value >= hp:
        value = hp-1

    return value

1
आपकी बोली एक पूर्णांक होनी चाहिए, इसलिए जब तक आप
फ़ॉरेस्ट से

हां, मैं सभी गणनाओं को करने के बाद इसे ठीक करता हूं। जल्दी जवाब देने का शुक्रिया!
मेगावाइटगेट

2
यदि आप अपने hp को शेष प्रतियोगियों की संख्या से विभाजित नहीं कर रहे हैं, लेकिन शेष राउंड की संख्या (जो math.ceil (math.log (live, 2)) होनी चाहिए)
ब्लैक उल्लू काई

1
अन्य बॉट्स के आधार पर, उनमें से अधिकांश फ्रंट लोड बिड में लगती हैं, इसलिए यदि आप पहले राउंड की बोली 10 से ऊपर बढ़ाते हैं तो इसमें सुधार हो सकता है
KBriggs

वे दोनों अच्छे विचार हैं! मुझे एहसास नहीं था कि बॉट की संख्या शेष राउंड की संख्या के समान नहीं थी (मैंने पहली बार प्रतियोगिता नियमों की गलत व्याख्या की)। मैं उन्हें कल लागू करने की कोशिश करूँगा। धन्यवाद!
मेगाविजेट

5

ज्यामितिक

def geometric(hp, history, ties, alive, start):
    opponentHP = 100 - sum(history)

    # If we're doomed, throw in the towel.
    if hp == 1:
        return 1

    # If this is the last battle or we can't outsmart the opponent, go all out.
    if alive == 2 or ties == 2:
        return hp - 1

    # If the opponent is weak, squish it.
    if opponentHP <= hp * 0.9:
        if ties == 2:
            return opponentHP + 1
        else:
            return opponentHP

    # If the opponent has full health, pick something and hope for the best.
    if not history:
        return np.random.randint(hp * 0.5, hp * 0.6)

    # Assume the opponent is going with a constant fraction of remaining health.
    fractions = []
    health = 100
    for x in history:
        fractions.append(float(x) / health)
        health -= x
    avg = sum(fractions) / len(fractions)
    expected = int(avg * opponentHP)
    return min(expected + 2, hp - 1)

पहली कोशिश में 5 वाँ स्थान, बिलकुल भी बुरा नहीं
केबीग्रीग्स

5

बॉट १३

def bot13(hp, history, ties, alive, start):
    win = 100 - sum(history) + ties
    #print "Win HP: %d" % win
    if alive == 2:
        #print "Last round - all in %d" % hp
        return hp - 1
    elif hp > win:
        #print "Sure win"
        return win
    #print "Don't try too hard"
    return 13 + ties

कम से कम प्रयास के साथ जीत को अधिकतम करने की कोशिश करें:

  • अगर हम जीत सकते हैं, तो बस करो
  • अगर यह अंतिम दौर है, तो कोशिश मत करो
  • अन्यथा, परेशान मत करो

क्यों?

प्रायिकता का लाभ उठाने का प्रयास करें: कम खेलकर पहला राउंड जीतना टूर्नामेंट शुरू करने का सबसे अच्छा तरीका है। 13 को लगता है कि यह मधुर स्थल है: दूसरा राउंड एक निश्चित जीत है, और बाकी पार्क में एक स्पैजिरगैंग है।


आपने लीड लिया है, बहुत अच्छा! सावधान रहें, आप परजीवी संरक्षण को जोड़ना चाह सकते हैं, क्योंकि बॉट जो लीड लेते हैं वे UpYoursBot जैसी चीजों के लिए लक्ष्य बन जाते हैं। यदि आपको उनकी आवश्यकता है तो सुरक्षा विचारों के लिए SarcomaBots देखें।
केब्रिग्स

5

अनुमान लगाओ बॉट

def guess_bot(hp, history, ties, alive, start):
   enemy_hp = 100 - sum(history)
   if len(history) == 1:
       if history[0] == 99:
           return 2
       else:
           return 26 + ties*2

   elif len(history) > 1:
       next_bet_guess = sum(history)//(len(history)**2)
       if alive == 2: 
           return hp
       elif alive > 2: 
           if hp > next_bet_guess + 1:
               return (next_bet_guess + 1 + ties*2)
           else:
               return (2*hp/3 + ties*2)

   else:
       #Thank you Sarcoma bot. See you in Valhalla.
       startBid = hp / 3
       maxAdditionalBid = np.round(hp * 0.06) if hp * 0.06 > 3 else 3
       additionalBid = np.random.randint(2, maxAdditionalBid)
       return int(startBid + additionalBid + ties)

पहली बार यहाँ पोस्टिंग। यह बहुत मज़ेदार लग रहा था इसलिए मैं अपने भयानक प्रयास से परे प्रस्तुत कर रहा हूं और अनुमान लगा रहा हूं कि अन्य बॉट क्या शर्त लगाएंगे।

संपादित 1: पहली शर्त में एक और 1 जोड़ा गया, बस 51 लोगों को सट्टेबाजी के साथ एक टाई की संभावना को कम करने के लिए।

संपादित 2: सारकोमा बॉट के शुरुआती कदम को चुरा लिया क्योंकि इसके पहले लगातार समाप्त नहीं होने का एक अच्छा मौका था।

संपादित 3: बॉट पहले दौर में बहुत अच्छी तरह से जीवित है, लेकिन बाद के चरणों में इसे आसानी से नष्ट किया जा रहा है। जिस तरह से रोबोट अब दूसरे दौर के बारे में सोचता है कि आधे बेटर्स पानी में मर चुके हैं।

संपादित करें 4: अब जब पहला राउंड अच्छा है, तो मैंने दूसरे राउंड को संभालने के तरीके को बदल दिया। दूसरे राउंड में बहुत कुछ मर रहा है इसलिए मुझे किसी तरह जीवित रहने की जरूरत है।

ब्लड बॉट

एक प्यासा बॉट बनाया है जो एक हत्या की तलाश में है। विचार यह है कि कम सट्टेबाजी वाले बॉट्स के खिलाफ जीतने की कोशिश की जाए और एक बार पहले दौर के रक्तपात के बाद इसे बिना रोक-टोक के कर दिया जाए क्योंकि इसमें दुश्मनों को भगाने के लिए एचपी की बाजीगरी मात्रा होनी चाहिए।

def blood_bot(hp, history, ties, alive, start):
    enemy_hp = 100 - sum(history)
    if history:
        if len(history) == 1:
            if history[0] == 99:
                return 2

        if alive == 2:
            return hp

        if enemy_hp <= 5:
            return enemy_hp - 2 + ties*2

        if enemy_hp <= 10:
            return enemy_hp - 5 + ties*2

        if (hp - enemy_hp) > 50:
            return (2*enemy_hp/3 + ties*4)

        if (hp - enemy_hp) > 20:
            return (2*enemy_hp/3 + ties*3)

        if (hp - enemy_hp) < 0:
            #die gracefully
            return hp - 1 + ties

    else:
        startBid = hp / 3
        maxAdditionalBid = np.round(hp * 0.06) if hp * 0.06 > 3 else 3
        additionalBid = np.random.randint(2, maxAdditionalBid)
        return int(startBid + additionalBid + ties)

2
मुझे लगता है कि अगर मेरी जानकारी सही है, तो len (इतिहास) * len (इतिहास) को len (इतिहास) ** 2 में बदला जा सकता है।
Yodie

जब आपके पास लेन (इतिहास) == 0
केबीआरजी

कोड अपडेट कर दिया गया है। कोई इतिहास नहीं मिलने पर यह पहली बार जाता है
मार्कोव शैनेंड

oi .............
सरकोमा

2
@ सारकोमा यह एक कटहल की हड्डी वाली दुनिया है, जिसमें मनुष्य है!
मार्कोव ने

5

meh_bot

बस इसके आधे hp से थोड़ी ज्यादा बोली लगाओ

def meh_bot(hp, history, ties, alive, start):
    # Attempt one      MehBot         | 0.020 | 1.6%    | 0.8%    | [34 36 12 10  6  1]%
    # Attempt two      MehBot         | 0.106 | 10.1%   | 0.8%    | [60  6  7  8  8  2]%
    point = hp / 2 + 3

    if ties > 1:
        ties += 1

    # Go all out on last round
    if alive == 2:
        return hp - 1

    opponent_hp = 100 - sum(history)

    if hp < 3:
        return 1
    elif not history:
        # Start with 30, This will increase the chance of dying first round but hopefully better fighting chance after
        return 30 + ties
    elif point > opponent_hp:
        # Never use more points then needed to win
        return opponent_hp + ties
    elif point >= hp:
        return hp - 1
    else:
        return point

मेहबोट २०

def meh_bot20(hp, history, ties, alive, start):
    # Attempt one      MehBot         | 0.020 | 1.6%    | 0.8%    | [34 36 12 10  6  1]%
    # Attempt two      MehBot         | 0.106 | 10.1%   | 0.8%    | [60  6  7  8  8  2]%
    point = hp / 2 + 3
    opponent_hp = 100 - sum(history)

    percents = []
    for i in range(0, len(history)):
        hp_that_round = 100 - sum(history[:i])
        hp_spent_that_round = history[i]
        percent_spent_that_round = 100.0 * (float(hp_spent_that_round) / float(hp_that_round))
        percents.append(percent_spent_that_round)

    try:
        opp_percent_point = opponent_hp * (max(percents) / 100)
    except:
        opp_percent_point = 100

    if ties > 1:
        ties += 1
    # Go all out on last round
    if alive == 2:
        return hp - 1

    if hp < 3:
        return 1
    elif not history:
        # randome number between 33
        return random.randint(33, 45)
    elif len(history) > 3:
        if point > opponent_hp:
            return min(opponent_hp + ties, opp_percent_point + ties)
    elif point > opponent_hp:
        # Never use more points then needed to win
        return opponent_hp + ties
    elif point >= hp:
        return hp - 1
    else:
        return point

मेहरान

def meh_ran(hp, history, ties, alive, start):
    # Attempt one      MehBot         | 0.020 | 1.6%    | 0.8%    | [34 36 12 10  6  1]%
    # Attempt two      MehBot         | 0.106 | 10.1%   | 0.8%    | [60  6  7  8  8  2]%
    # Attempt three    MehBot         | 0.095 | 9.1 %   | 0.7 %   | [70  3  5  6  6  0]%

    point = hp / 2 + 3
    if ties > 1:
        ties += 1
    # Go all out on last round
    if alive == 2:
        return hp - 1
    opponent_hp = 100 - sum(history)
    if hp < 3:
        return 1
    elif not history:
        # randome number between 33
        return random.randint(33, 45)
    elif point > opponent_hp:
        # Never use more points then needed to win
        return opponent_hp + ties
    elif point >= hp:
        return hp - 1
    else:
        return point

वहाँ काफी कुछ बॉट्स हैं जो वास्तव में इस व्यवहार का लाभ उठाने के लिए मौजूद हैं, इसलिए आपके पास कर्षण प्राप्त करने में कठिन समय हो सकता है!
केब्रिग्स

@KBriggs ने कुछ अपडेट किया, मैं पहले संस्करण के साथ-साथ ऐसा करने की उम्मीद नहीं कर रहा था, उम्मीद है, यह अपडेट इसे और अधिक लड़ने का मौका देगा
meh Man

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

@KBriggs मैं यह अच्छी तरह से करने की उम्मीद नहीं कर रहा था, मैंने सोचा कि यह सबसे अच्छा होगा शीर्ष 10। वैसे भी मैंने एक और जोड़ा है बस प्रभाव पहले दौर एचपी को देखने के लिए। क्या आप दोनों को चला सकते हैं ताकि मैं दोनों का परिणाम देख सकूं? धन्यवाद
हुंह मैन

@KBriggs कृपया ऐसा ही करें, Muchas gracias
meh Man

4

रोबी रूले

def robbie_roulette(hp, history, ties, alive):
     if history:
         #If the enemy bot has a history, and it's used the same value every time, outbid that value
         if len(set(history)) == 1:
             return history[0] + 1
         #Else, average the enemy bot's history, and bid one more than the average
         else:
             return (sum(history) / len(history) + 1)
     #Else, return half of remaining hp
     else:
         return hp / 2

यह बॉट दुश्मन के बॉट के इतिहास का कुछ सरल विश्लेषण करता है, या उसके शेष हिट बिंदुओं में से आधे को अन्यथा बोलता है


4

जितनी कम प्रतिस्पर्धा हो, उतनी अधिक बोली लगाएं। सुधार का सुझाव देने के लिए टिप्पणीकारों को धन्यवाद।

def Spreader(hp, history, ties, alive):
   if alive == 2:
       return hp-1
   if len(history) < 2:
       return hp/2
   return np.ceil(hp/alive)

1
नीट विचार, लेकिन मैं दो मुद्दों को देखता हूं। पहले दौर में सबसे बड़ी बोली अन्य में से एक है, इसलिए यह संभवतः अधिकांश समय जल्दी मर जाएगा। दूसरा यह है कि फाइनल में, अधिकांश बॉट hp-1 बोली लगाते हैं, इसलिए यह तब तक खो जाएगा जब तक कि आपके पास उनकी hp दोगुनी न हो। लेकिन मध्यवर्ती दौर के लिए मुझे यह विचार पसंद है। यदि आप दो विशेष मामलों को संबोधित करते हैं, तो आप संभवतः प्रदर्शन में सुधार कर सकते हैं।
केब्रिग्स

4

सर्वाइवलिस्टबोट और हलविसबोट

मेरे सवालों के जवाब देने के लिए धन्यवाद। अंतिम परिणाम एक अधिक जटिल बॉट है।

HalvsiesBot एक सनकी है 'सिर्फ 50/50 जीतने की संभावना के साथ आधे' बॉट पास रखें। मेरा अनुमान।

उत्तरजीविताकार द्विआधारी पेड़ की एक श्रृंखला बनाता है अगर-कोई डेटासेट के आधार पर निर्णय लेते हैं, जिसमें एक टाई पर ओवरराइड भी शामिल है (यदि यह 2 हिट हिट करता है तो यह ट्रिपल टाई मौत से बचने के लिए कामिकेज़ है)।

मेरा अजगर थोड़ा कठोर है, इसलिए कोड थोड़ा छोटा हो सकता है, इसलिए इसे ठीक करने या अपडेट करने के लिए स्वतंत्र महसूस करें।

यह डेटा की बिट्स को काम करने की कोशिश करने के लिए बनाया गया है जैसे कि एचपी कितना बचा है, बॉट की न्यूनतम संख्या से लड़ने की संभावना है, एचपी छोड़ने के लिए न्यूनतम राशि, औसत बोली। यह अस्पष्ट स्थितियों में यादृच्छिकता का भी फायदा उठाता है, जैसे कि नाटक खेलना या इष्टतम बोली-प्रक्रिया मुद्दे।

def HalvsiesBot(hp, history, ties, alive, start):
    return np.floor(hp/2)


def SurvivalistBot(hp, history, ties, alive, start):    

    #Work out the stats on the opponent
    Opponent_Remaining_HP = 100 - sum(history)
    Opponent_Average_Bid = Opponent_Remaining_HP

    if len(history) > 0:
        Opponent_Average_Bid = Opponent_Remaining_HP / float(len(history))


    HP_Difference = hp - Opponent_Remaining_HP

    #Work out the future stats on the others
    RemainingBots = (alive-2)
    BotsToFight = 0

    RemainderTree = RemainingBots

    #How many do we actually need to fight?
    while(RemainderTree > 1):
        RemainderTree = float(RemainderTree / 2)
        BotsToFight += 1

    #Now we have all that data, lets work out an optimal bidding strategy
    OptimalBid = 0
    AverageBid = 0

    #For some reason we've tied more than twice in a row, which means death occurs if we tie again
    #So better to win one round going 'all in'
    if ties > 1:
        if BotsToFight < 1:
            OptimalBid = hp - 1
        else:
            OptimalBid = hp - (BotsToFight+1)

        #Err likely we're 0 or 1 hp, so we just return our HP
        if OptimalBid < 1:
            return hp
        else:
            return OptimalBid

    #We have the upper hand (more HP than the opponent)
    if HP_Difference > 0:
        #Our first guess is to throw all of our opponent's HP at them
        OptimalBid = HP_Difference

        #But if we have more opponents to fight, we must divide our HP amongst our future opponents
        if BotsToFight > 0:
            #We could just divide our HP evenly amongst however many remaining bots there are
            AverageBid = OptimalBid / BotsToFight

            #But this is non-optimal as later bots will have progressively less HP
            HalfBid = OptimalBid / 2

            #We have fewer bots to fight, apply progressive
            if BotsToFight < 3:

                #Check it exceeds the bot's average
                if HalfBid > Opponent_Average_Bid:
                    return np.floor(HalfBid)
                else:
                    #It doesn't, lets maybe shuffle a few points over to increase our odds of winning
                    BidDifference = Opponent_Average_Bid - HalfBid

                    #Check we can actually match the difference first
                    if (HalfBid+BidDifference) < OptimalBid:
                        if BidDifference < 8:
                            #We add half the difference of the BidDifference to increase odds of winning
                            return np.floor(HalfBid + (BidDifference/2))
                        else:
                            #It's more than 8, skip this madness
                            return np.floor(HalfBid)

                    else:
                        #We can't match the difference, go ahead as planned
                        return np.floor(HalfBid)


            else:
                #There's a lot of bots to fight, either strategy is viable
                #So we use randomisation to throw them off!
                if bool(random.getrandbits(1)):
                    return np.floor(AverageBid)
                else:
                    return np.floor(HalfBid)

        else:
            #There are no other bots to fight! Punch it Chewy!
            return OptimalBid

    else:

        if hp == 100:
            #It appears to be our opening round (assumes opponent HP same as ours)
            #We have no way of knowing what our opponent will play into the battle

            #Only us in the fight? Full power to weapons!
            if BotsToFight < 1:
                return hp - 1
            else:
                #As what might happen is literally random
                #We will also be literally random
                #Within reason

                #Work out how many bots we need to pass
                HighestBid = hp - (BotsToFight+1)
                AverageBid = hp/BotsToFight
                LowestBid = np.floor(np.sqrt(AverageBid))

                #Randomly choose between picking a random number out of thin air
                #And an average
                if bool(random.getrandbits(1)):
                    return np.minimum(LowestBid,HighestBid)
                else:
                    return AverageBid

        else:
            #Oh dear, we have less HP than our opponent
            #We'll have to play it crazy to win this round (with the high probability we'll die next round)
            #We'll leave ourselves 1 hp (if we can)

            if BotsToFight < 1:
                OptimalBid = hp - 1
            else:
                OptimalBid = hp - (BotsToFight+1)

            #Err likely we're 0(???) or 1 hp, so we just return our HP
            if OptimalBid < 1:
                return hp
            else:
                return OptimalBid

Boxbot

def BoxBot(hp, history, ties, alive):

    Opponent_HP = float.round(100 - sum(history))
    HalfLife = float.round(Opponent_HP/2)
    RandomOutbid = HalfLife + np.random.randint(1,HalfLife)

    if hp < RandomOutbid:
        return hp - 1
    else
        return RandomOutbid

Opponent_Average_Bid = Opponent_Remaining_HP / float(len(history)) ZeroDivisionError: float division by zero। इस लाइन को 0 लंबाई इतिहास मामले को संभालने की आवश्यकता है।
केबिगग्स

धन्यवाद, मैं इसे सही करूँगा।
SS243

फिक्स्ड। यदि कोई अन्य त्रुटियां हैं, तो मुझे बताएं।
SSight3

1
वाक्यविन्यास त्रुटियों के युगल: लापता: `के बाद else, math.[func] -> np.[func]और एक बिंदु पर आप का उपयोग Lowestजहां मतलब LowestBid। शीघ्र ही अद्यतन किए गए गीथूब और स्कोर पर नियंत्रक में सभी तय हो गए।
केब्रिग्स

धन्यवाद। पोस्ट में सभी उपरोक्त त्रुटियों को ठीक किया।
SSight3

4

बॉट की गणना

def calculatingBot(hp, history, ties, alive, start):
    opponentsHP = 100 - sum(history)
    if alive == 2: # 1v1
        return hp - 1 + ties
    # Try to fit an exponential trendline and one up the trendline if it fits
    if len(history) >= 3: 
        xValues = range(1, len(history) + 1)
        # https://stackoverflow.com/a/3433503  Assume an exponential trendline
        coefficients = np.polyfit(xValues, np.log(history), 1, w = np.sqrt(history))
        def model(coefficients, x):
            return np.exp(coefficients[1]) * np.exp(coefficients[0] * x)
        yPredicted = [model(coefficients, x) for x in xValues]
        totalError = 0
        for i in range(len(history)):
            totalError += abs(yPredicted[i] - history[i])
        if totalError <= (len(history)): # we found a good fitting trendline
            # get the next predicted value and add 1
            theoreticalBet = np.ceil(model(coefficients, xValues[-1] + 1) + 1) 
            theoreticalBet = min(theoreticalBet, opponentsHP)
            theoreticalBet += ties
            return int(min(theoreticalBet, hp - 1)) # no point suiciding
    maxRoundsLeft = np.ceil(np.log2(alive))
    theoreticalBet = hp / float(maxRoundsLeft)
    additionalRandomness = round(np.random.random()*maxRoundsLeft) 
    # want to save something for the future
    actualBet = min(theoreticalBet + additionalRandomness + ties, hp - 2)
    actualBet = min(actualBet, opponentsHP+1)
    return int(actualBet)

आक्रामक गणना बीओटी

def aggresiveCalculatingBot(hp, history, ties, alive, start):
    opponentsHP = 100 - sum(history)
    if opponentsHP == 100: # Get past the first round
        return int(min(52+ties, hp-1+ties))
    if alive == 2: # 1v1
        return hp - 1 + ties
    # Try to fit an exponential trendline and one up the trendline if it fits
    if len(history) >= 3: 
        xValues = range(1, len(history) + 1)
        # https://stackoverflow.com/a/3433503  Assume an exponential trendline
        coefficients = np.polyfit(xValues, np.log(history), 1, w = np.sqrt(history))
        def model(coefficients, x):
            return np.exp(coefficients[1]) * np.exp(coefficients[0] * x)
        yPredicted = [model(coefficients, x) for x in xValues]
        totalError = 0
        for i in range(len(history)):
            totalError += abs(yPredicted[i] - history[i])
        if totalError <= (len(history)): # we found a good fitting trendline
            # get the next predicted value and add 1
            theoreticalBet = np.ceil(model(coefficients, xValues[-1] + 1) + 1) 
            theoreticalBet = min(theoreticalBet, opponentsHP)
            theoreticalBet += ties
            return int(min(theoreticalBet, hp - 1)) # no point suiciding
    maxRoundsLeft = np.ceil(np.log2(alive))
    theoreticalBet = hp / float(maxRoundsLeft)
    additionalRandomness = 1+round(np.random.random()*maxRoundsLeft*2) 
    # want to save something for the future
    actualBet = min(theoreticalBet + additionalRandomness + ties, hp - 2)
    actualBet = min(actualBet, opponentsHP+1)
    return int(actualBet)

एंटी किक बॉट

def antiKickBot(hp, history, ties, alive, start):
    if alive == 2:
        return (hp - 1 + ties)
    amount = np.ceil((float(hp) / 2) + 1.5)
    opponentsHP = 100 - sum(history)
    amount = min(amount, opponentsHP) + ties
    return amount

यदि हम प्रतिद्वंद्वी के कार्यों की भविष्यवाणी कर सकते हैं, तो हम इष्टतम दांव लगा सकते हैं! यदि हम पर्याप्त नहीं हैं (न तो पर्याप्त डेटा या प्रतिद्वंद्वी बहुत यादृच्छिक है), तो हम कम से कम ऐसा कर सकते हैं जो हमारी जीत की क्षमता को अधिकतम करेगा। सैद्धांतिक रूप से कम से कम आधे बॉट की संख्या प्रत्येक दौर में मर जाएगी। इस प्रकार मैं उम्मीद कर सकता हूं कि अधिकांश log2 (जीवित) राउंड में हो। आदर्श रूप से हम अपने hp को सभी दौरों के बीच समान रूप से विभाजित करेंगे। हालांकि, हम जानते हैं कि कुछ बॉट बेवकूफ होंगे और आत्महत्या कर लेंगे / जल्दी मर जाएंगे, इसलिए हमें पहले के दौर में थोड़ा और दांव लगाना चाहिए।

आक्रामक दीर्घकालिक स्वास्थ्य की कीमत पर, अधिक आक्रामक होकर जीवित रहने की कोशिश करने के लिए बॉट के संशोधन की गणना बीओटी कोड की गणना। केवल सिमुलेशन ही बताएगा कि टेम्पो या मूल्य जीतता है या नहीं।

एंटी किक बॉट को हमेशा मौजूदा नेता किकबॉट को हराना चाहिए: पी

संपादित करें: एंटी किक बॉट के साथ पुनरावर्तक नियतात्मक बॉट, लगभग एक ही वापसी मूल्यों के साथ एक चालाक बॉट। विरोधियों एचपी से अधिक मतदान करने से रोका


प्यारा। मुझे लगता है कि यह एक बहुत बड़े बॉट पूल के साथ बेहतर करेगा।
केबिगग्स

मुझे इस के साथ कभी-कभी एक त्रुटि मिलती है return np.max(theoreticalBet, hp - 1): AxisError: axis 23 is out of bounds for array of dimension 0:। मैंने नियंत्रक के लिए एक लिंक पोस्ट किया है ताकि आप इसका परीक्षण कर सकें।
केबीरिग्स

@KBriggs इसे ठीक करने के लिए कोड अपडेट किया गया।
बॉब क्रैचिट

1
पुष्टि की गई, स्कोर इनकमिंग अपडेट। आप सुनिश्चित करने के लिए शीर्ष 10 में हैं।
केबीरिग्स

@KBriggs मैंने
बॉब क्रैचिट

4

GenericBot

def generic_bot(hp, history, ties, alive, start):
    if alive == 2:
        return hp - 1
    if not history:
        return int(hp * 7.0 / 13)
    opp = 100 - sum(history)
    if opp < hp:
        return opp + ties
    max_sac = np.maximum(int(hp * 0.7), 1)
    rate = history[-1] * 1.0 / (history[-1] + opp)
    return int(np.minimum(max_sac, rate * opp + 1))

यह वास्तव में देर हो चुकी है ... मैं थक गया हूँ ... एक नाम के बारे में सोच नहीं सकता ... और इस बॉट का प्रारूप वास्तव में दूसरों के समान है, बस थोड़ा अलग एल्गोरिथ्म के इतिहास के साथ। यह मौजूदा दर को पाने की कोशिश करता है जो प्रतिद्वंद्वी जुआ की ओर प्रवृत्त हो रहा है ... या ऐसा कुछ ... ज़ज़


आपको np.maximumइसके बजाय np.max, उसी का उपयोग करने की आवश्यकता हैmin
KBriggs

@KBriggs धन्यवाद :) हम्म, ऐसा लगता है कि जेनेरिक बॉट इस खेल का नियम है
क्विंटेक

लगता है कि वे बहुत आसान लक्ष्य होंगे, मुझे आश्चर्य है कि किसी ने अभी तक एक परजीवी नहीं बनाया है
केबीरिग्स

@KBriggs हाँ, मैं हैरान हूँ। सुरक्षा जोड़ने का समय ...
क्विंटेक

फिर भी न्यूरलबोट बनाने की योजना है?
केबीरिग्स

4

HalflifeS3

def HalflifeS3(hp, history, ties, alive, start):
    ''' Bet a half of oponent life + 2 '''
    if history:
        op_HP = 100 - sum(history)
        return np.minimum(hp-1, np.around(op_HP/2) + 2 + np.floor(1.5 * ties) )
    else:
        return hp/3

4

तट बॉट [सेवानिवृत्त]

कोशिश करेंगे और तट के बीच प्रतियोगिता के माध्यम से समान रूप से विभाजित करके प्रतियोगिता के माध्यम से यह रास्ता है। किसी भी बचे हुए कूल्हे को पहले दौर में बोली लगाकर खुद को "तट-सक्षम" दौर में बनाने का बेहतर मौका देगा।

def coast(hp, history, ties, alive, start):
   if alive == 2:
   # Last round, go all out
       return hp - 1 + ties
   else:
       # Find the next power of two after the starting number of players
       players = start
       while math.log(players, 2) % 1 != 0:
         players += 1

       # This is the number of total rounds
       rounds = int(math.log(players, 2))

       bid = 99 / rounds

       if alive == start:
           # First round, add our leftover hp to this bid to increase our chances
           leftovers = 99 - (bid * rounds)
           return bid + leftovers
       else:
           # Else, just try and coast

           opp_hp = 100 - sum(history)
           # If opponent's hp is low enough, we can save some hp for the 
           # final round by bidding their hp + 1
           return min(bid, opp_hp + 1)

तट बॉट V2

चूंकि मुझे यह चुनौती इतनी पसंद है, इसलिए मुझे सिर्फ एक और बॉट बनाना था। यह संस्करण पहले दो राउंड में अधिक एचपी का उपयोग करके बाद में एचपी को किनारे करते हुए कुछ को बलिदान करता है।

def coastV2(hp, history, ties, alive, start):
   # A version of coast bot that will be more aggressive in the early rounds

   if alive == 2:
   # Last round, go all out
       return hp - 1 + ties
   else:
       # Find the next power of two after the starting number of players
       players = start
       while math.log(players, 2) % 1 != 0:
         players += 1

       # This is the number of total rounds
       rounds = int(math.log(players, 2))

       #Decrease repeated bid by 2 to give us more to bid on the first 2 rounds
       bid = (99 / rounds) - 2

       if len(history) == 0:
           # First round, add 2/3rds our leftover hp to this bid to increase our chances
           leftovers = 99 - (bid * rounds)
           return int(bid + math.ceil(leftovers * 2.0 / 3.0))
       elif len(history) == 1:
           # Second round, add 1/3rd of our leftover hp to this bid to increase our chances
           leftovers = 99 - (bid * rounds)
           return int(bid + math.ceil(leftovers * 1.0 / 3.0))
       else:
           # Else, just try and coast

           opp_hp = 100 - sum(history)
           # If opponent's hp is low enough, we can save some hp for the 
           # final round by bidding their hp + 1
           return int(min(bid, opp_hp + 1))

प्रतिशत बॉट

औसत प्रतिशत hp प्रतिद्वंद्वी की खर्च करने की गणना करने की कोशिश करता है, और उसके आधार पर बोलियाँ लगाता है।

def percent(hp, history, ties, alive, start):
    if len(history) == 0:
        #First round, roundon low bid
        return int(random.randint(10,33))
    elif alive == 2:
        #Last round, go all out
        return int(hp - 1 + ties)
    else:
        # Try and calculate the opponents next bid by seeing what % of their hp they bid each round
        percents = []
        for i in range(0, len(history)):
            hp_that_round = 100 - sum(history[:i])
            hp_spent_that_round = history[i]
            percent_spent_that_round = 100.0 * (float(hp_spent_that_round) / float(hp_that_round)) 
            percents.append(percent_spent_that_round)

        # We guess that our opponents next bid will be the same % of their current hp as usual, so we bid 1 higher.
        mean_percent_spend = sum(percents) / len(percents)
        op_hp_now = 100 - sum(history)
        op_next_bid = (mean_percent_spend / 100) * op_hp_now
        our_bid = op_next_bid + 1

        print mean_percent_spend
        print op_hp_now
        print op_next_bid

        # If our opponent is weaker than our predicted bid, just bid their hp + ties
        if op_hp_now < our_bid:
            return int(op_hp_now + ties)
        elif our_bid >= hp:
            # If our bid would kill us, we're doomed, throw a hail mary
            return int(random.randint(1, hp))
        else:
            return int(our_bid + ties)

बहुत अच्छा विचार है। पहले राउंड को बर्खास्त करना बॉट्स में एक नया चलन है, और यह काफी अच्छी तरह से काम कर रहा है।
केब्रिग्स

@KBriggs मैंने अपना दूसरा प्रयास शामिल करने के लिए इस प्रतिक्रिया को अपडेट किया है। नए नियमों के अनुसार आपका उल्लेख करना। महान पहेली btw!
Wazz

मुझे दोनों में प्रवेश करना चाहते हैं, या सिर्फ नवीनतम संस्करण? अभी यह सिर्फ V2 है
KBriggs

@Krigrigs मैं दोनों दर्ज करें अगर यह ठीक है कृपया दर्ज करें। यह देखना अच्छा होगा कि वे एक दूसरे के खिलाफ कैसे वजन करते हैं।
14

कुल मिलाकर ऐसा ही शानदार प्रदर्शन
केब्रिग्स

4

ConsistentBot

प्रत्येक राउंड में समान राशि देता है। यह पहले दौर में जीवित रहने की संभावना नहीं है, लेकिन अगर यह अंत तक भाग्यशाली है, तो इसके पास एचपी की उचित मात्रा बाकी है।

def consistent(hp, history, ties, alive, start):
    if alive == 2:
        return hp-1

    if 100 % start == 0:
        return (100 / start) - 1
    else: 
        return 100 / start

Whelp, इसे अब ठीक करने के लिए बहुत देर हो चुकी है, लेकिन मेरे बॉट ने पर्याप्त एचपी का उपयोग किया है ताकि वह प्रत्येक प्रतिद्वंद्वी को एक बार लड़ने के अंत में बना सके, न कि इसे अंतिम दौर में लाने के लिए। यह मेरी बुरी बात है: पी
केविन - मोनिका

4

किकबन बॉट

यह बॉट बस मौजूदा नेता मीन किकबॉट को एक दौर में पीट कर और उसके बाद और अधिक आक्रामक तरीके से खेलकर पहचानने की कोशिश करता है।

def kickban(hp, history, ties, alive, start):
    if alive == 2:
        return hp-1

    if not history:
        return 36

    if history[0]==35:
        somean = 1
    else:
        somean = 0

    return min(mean_kick(hp, history, ties, alive, start) + somean*3, hp-1)

1
मुझे लगता है कि आपका इंडेंटेशन थोड़ा हटकर है।
जोनाथन फ्रेच

उफ़, धन्यवाद, अजीब कोड संपादक ने पहली पंक्ति के साथ गड़बड़ की
HRSE


4

तीन चौथाई बॉट

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

* पहले राउंड को लो-बॉल करने के बाद।

def ThreeQuarterBot(hp, history, ties, alive, start):
    threeQuarters = 3 * hp / 4

    if alive == 2:
        return hp - 1

    opponent_hp = 100 - sum(history)

    if not history:
        # low-ball the first round but higher than (some) other low-ballers
        return 32 + ties
    elif threeQuarters > opponent_hp:
        return opponent_hp + ties

    return threeQuarters

चार सातवीं बॉट

3/4 बॉट की मध्यम सफलता के बाद शहर में एक नया अंश है, यह केवल तर्कसंगत है।

def FourSeventhsBot(hp, history, ties, alive, start):
    fourSevenths = 4 * hp / 7

    if alive == 2:
        return hp - 1

    opponent_hp = 100 - sum(history)

    if not history:
        # low-ball the first round but higher than (some) other low-ballers
        return 33 + ties
    if fourSevenths > opponent_hp:
        return opponent_hp + ties

    return fourSevenths + ties

एकदम सही अंश

मैं संपूर्ण हूं

def ThePerfectFraction(hp, history, ties, alive, start):
    thePerfectFraction = 7 * hp / 13

    if alive == 2:
        return hp - 1

    opponent_hp = 100 - sum(history)

    if not history:
        # Need to up our game to overcome the kickers
        return 42 + ties
    if thePerfectFraction > opponent_hp:
        return opponent_hp + ties

    return thePerfectFraction + 1 + ties

इस उन्मूलन संभावनाओं के आधार पर, आप शायद राउंड 2 में छोटी बोलियों के साथ भी दूर हो सकते हैं। यह एक अच्छा करता है, लेकिन कुछ मामूली मोड़ इसे बहुत बेहतर बना सकते हैं।
केबिगग्स

@KBriggs ने नई और बेहतर बाधाओं के साथ एक नया बॉट जोड़ा;)
जोशुआ वेब

उन दोनों को वहां चाहते हैं, या सिर्फ 1?
केब्रिग्स

@KBriggs मुझे नहीं पता कि मैं समय सीमा से चूक गया, लेकिन मैंने एक अंतिम बॉट जोड़ दिया है, अगर मैंने इसे समय पर बना दिया, तो आप अन्य दो अंश बॉट्स को हटा सकते हैं
जोशुआ वेब

1
हां, आपके पास अभी भी समय है
केबीरिग्स

4

BandaidBot

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

def BandaidBot(hp, history, ties, alive, start):
    if alive == 2:
        return hp-1

    if history:
        opp_hp = 100 - sum(history)
        opp_last_hp = 100 - sum(history[:-1])

        if history[-1] <= opp_last_hp / 3:
            return 1 + ties * np.random.randint(0, 1) 
        elif history[-1] > opp_last_hp / 2:
            return min(opp_hp - 1, hp)
        else:
            if history[-1] < hp/2:
                return np.random.randint(history[-1], hp/2)
            else:
                return np.floor(hp/2)
    else:
        return np.floor(hp/3)

GetAlongBot

GetAlongBot उतना ही अच्छा होगा, जितना कि BandaidBot का लाभ उठाने की आवश्यकता है। यह अपने hp के केवल एक तिहाई हिस्से में वापस आएगा जब तक कि वह अपने प्रतिद्वंद्वी को उससे कम पर नहीं मार सकता। अगर इसका प्रतिद्वंद्वी BandaidBot की तरह दिखता है, तो यह 2 बोली देगा, यह जानकर कि BandaidBot 1 की बोली लगाएगा क्योंकि GetAlongBot को बाकी सभी के साथ इतनी अच्छी तरह से मिल रहा है - एक आसान जीत जब तक यह वास्तव में दूसरे छोर पर BandaidBot था।

def GetAlongBot(hp, history, ties, alive, start):
    if alive == 2:
        return hp-1

    if history:
        opp_hp = 100 - sum(history)
        opp_last_hp = 100 - sum(history[:-1])
        count = 0
        for i in range(0, len(history)):
            hp_that_round = 100 - sum(history[:i])
            hp_spent_that_round = history[i]
            if hp_that_round / 3 - 1 <= hp_spent_that_round <= hp_that_round / 2:
                count += 1
        if count == len(history): #It's probably BandaidBot!
            return 2
        else:
            return min(opp_hp - 1, np.floor(hp/3))
    else:
        return np.floor(hp/3)

वास्तव में स्वच्छ विचार। मुझे आश्चर्य है कि इसका कितना प्रभाव पड़ेगा
केबीरिग्स

त्रुटि: return np.random.randint(history[-1], hp/2): ValueError: low >= highइस मामले को किसी भी तरह से संभालने की आवश्यकता है
केबीरिग्स

@KBriggs अब तय किया जाना चाहिए!
माया सोल

@KBriggs ने यादृच्छिककरण को ठीक करने के लिए अद्यतन किया
माया सोल

3

तीक्ष्ण बॉट

def TENacious_bot(hp, history, ties, alive, start):
  max_amount=hp-(alive-1)*2;
  if max_amount<2: max_amount=2

  if alive==2: return hp-1
  if ties==0: return np.minimum(10, max_amount)
  if ties==1: return np.minimum(20, max_amount)
  if ties==2: return np.minimum(40, max_amount)
  # prevent function blowup
  return 2

यह बॉट 10 के अपने पसंदीदा मूल्य पर पकड़ बनाने की कोशिश करता है, लेकिन यह कभी-कभी अपनी पसंद को बदल देता है यदि एक टाई को तोड़ने की जरूरत है (अपने पसंदीदा मूल्य दोगुनी या चौगुनी के साथ) या भविष्य के दौर के लिए बचाने के लिए, लेकिन इष्टतम राशि से नहीं क्योंकि यह भ्रमित करना चाहता है विरोधियों और यह किसी भी समय 2 से कम की बोली लगाने पर विचार नहीं करना चाहता है क्योंकि यह आश्वस्त है कि यह उम्मीद से बेहतर है कि प्रतिद्वंद्वी 1 से कम बोली लगाएगा, अर्थात 0।

पुनश्च: इस बॉट में रणनीतिक समस्याएं हो सकती हैं यदि 2 ^ 9 बॉट से अधिक हैं।


मुझे संदेह है कि आपको 2 ^ 9 विरोधियों ^ _ ^ होने के बारे में चिंता करने की ज़रूरत नहीं है।
केबीरिग्स

लेकिन 10 के शुरुआती दांव के साथ, वह शायद ही कभी इसे पहले दौर में बनाने जा रही है
केबीरिग्स

यह बॉट सोचता है कि, अगर कुछ बॉट वास्तव में पहले दौर में 10 से अधिक एचपी देना चाहते हैं, तो यह लड़ाई के लायक नहीं है।
अलेक्जेंडर

Haha मेला काफी
KBriggs

3

CautiousBot

पहले कभी प्रोग्रामिंग पहेलियाँ प्रस्तुत! अपनी चुनौती को काफी दिलचस्प पाया: पी

अगर पिछले राउंड बिट एक hp से कम है, अगर कोई इतिहास आधा hp प्लस एक छोटी यादृच्छिक राशि नहीं है।

अगर इतिहास प्रतिद्वंद्वी एचपी और शेष राउंड की संख्या की जांच करता है और शेष राउंड की संख्या से विभाजित शेष एचपी के अंश तक एक अतिरिक्त बफर का उपयोग करके प्रतिद्वंद्वी एचपी / 2 को रोकने की कोशिश करता है (यह किसी भी तरह पोस्टीरियर राउंड के लिए शेष एचपी को संरक्षित करने की कोशिश करता है) । जाँच करें कि क्या आपका बहुत अधिक hp खर्च हो रहा है (अपने आप को मारें या अपने विरोधी की तुलना में अधिक बोली न लगाएं)।

अन्य बॉट्स की तरह संबंधों के लिए हमेशा सही रहें।

def cautious_gambler(hp, history, ties, alive, start):
    if alive == 2:
        return hp - 1
    if(history):
        opp_hp = 100 - sum(history)
        remaining_rounds = np.ceil(np.log2(start)) - len(history)

        start_bet = opp_hp / 2
        buff = int((hp - start_bet)/remaining_rounds if remaining_rounds > 0 else (hp - start_bet)) 
        buff_bet = np.random.randint(0, buff) if buff > 0 else 0
        bet = start_bet + buff_bet + ties

        if bet >= hp or bet > opp_hp:
            bet = np.minimum(hp - 1, opp_hp)

        return int(bet)
    else:
        start_bet = hp / 2
        rng_bet = np.random.randint(3,6)

        return int(start_bet + rng_bet + ties)

CautiousBot2

पहले राउंड पर बहुत आक्रामक, अब CautiousBot और भी अधिक सतर्क हो जाता है ...

def cautious_gambler2(hp, history, ties, alive, start):
    if alive == 2:
        return hp - 1
    if(history):
        opp_hp = 100 - sum(history)
        remaining_rounds = np.ceil(np.log2(start)) - len(history)

        start_bet = opp_hp / 2
        buff = int((hp - start_bet)/remaining_rounds if remaining_rounds > 0 else (hp - start_bet)) 
        buff_bet = np.random.randint(0, buff) if buff > 0 else 0
        bet = start_bet + buff_bet + ties

        if bet >= hp or bet > opp_hp:
            bet = np.minimum(hp - 1, opp_hp)

        return int(bet)
    else:
        start_bet = hp * 0.35
        rng_bet = np.random.randint(3,6)

        return int(start_bet + rng_bet + ties)

आपके पास एक बग है जहां यह अभी भी कॉल कर रहा है जब बफर = 0 buffer_bet = np.random.randint(0, buffer) if buffer > 0 else 0 File "mtrand.pyx", line 993, in mtrand.RandomState.randint ValueError: low >= high:। ध्यान दें कि बफर अजगर में एक कीवर्ड है, आप एक अलग चर नाम चुनना चाह सकते हैं।
केब्रिग्स

ओह, ऐसा लगता है कि यह बियास्यूज़ बफर हमेशा एक इंट नहीं है - आप शायद किसी बिंदु पर शून्य से विभाजित कर रहे हैं। कृपया तर्क को ध्यान से देखें। मैंने इसे चलाया, लेकिन आप शायद कोने के मामलों को ठीक कर सकते हैं।
केब्रिग्स

अच्छा कैच @KBriggs। सोचिए मैंने इसे ठीक किया।
जेसुज रोस

मैं अभी भी कोई त्रुटि मिलती है: buff_bet = np.random.randint(0, buff) if buff > 0 else 0 File "mtrand.pyx", line 993, in mtrand.RandomState.randint ValueError: low >= high। ऐसा लगता है कि बफ़ कभी-कभी 0 और 1 के बीच एक फ्लोटिंग पॉइंट नंबर होता है, जो संभवतः 0 से अंदर हो जाता है randint। यदि आप कॉल buffकरने intसे पहले कास्ट करते हैं तो यह काम करता है
KBriggs

@KBriggs शायद इसलिए क्योंकि ceila float। याद किया कि एक ... टाइ फिर से: पी
जेसुएस रोज

3

ठीक है, मैं इस पर अपना हाथ आज़माऊँगा।

SnetchBot

विरोधी के साथ जाने वाले स्वास्थ्य के अंशों की जाँच करना। यदि प्रतिद्वंद्वी उठा रहा है, तो उसे हरा दें।

def snetchBot(hp, history, ties, alive, start):
    if alive == 2:
        return hp-1

    opponent_hp = 100
    history_fractions = []
    if history:
        for i in history:
            history_fractions.append(float(i)/opponent_hp)
            opponent_hp -= i
        if opponent_hp <= hp/2:
            #print "Squashing a weakling!"
            return opponent_hp + (ties+1)/3

        average_fraction = float(sum(history_fractions)) / len(history_fractions)
        if history_fractions[-1] < average_fraction:
            #print "Opponent not raising, go with average fraction"
            next_fraction = average_fraction
        else:
            #print "Opponent raising!"
            next_fraction = 2*history_fractions[-1] - average_fraction
        bet = np.ceil(opponent_hp*next_fraction) + 1
    else:
        #print "First turn, randomish"
        bet = np.random.randint(35,55)

    if bet > opponent_hp:
        bet = opponent_hp + (ties+1)/3
    final_result = bet + 3*ties
    if bet >= hp:
        #print "Too much to bet"
        bet = hp-1
    return final_result

EDIT: पहले राउंड में बहुत कुछ खोना, पहली बारी यादृच्छिक सीमाओं को समायोजित करना


बहुत अच्छा पहला शॉट, स्कोर इनकमिंग अपडेट
केबी first५

@KBriggs थोड़ा संपादित (सिर्फ पहला राउंड रैंडम सीमा)। हालांकि मैं पहले से ही 10 वें स्थान पर होने से हैरान था। यदि यह खराब होता है, तो मैं पहले एक रोल पर वापस आ
जाऊंगा

आप उससे थोड़ा अधिक रस निचोड़ लेते हैं
KBriggs

3

SquareUpBot

ऐसा प्रतीत नहीं होता था कि कई बॉट भिन्नों के बजाय शक्तियों के साथ खेल रहे थे, इसलिए मैंने एक बनाने का फैसला किया, कुछ मानक अनुकूलन के साथ और देखा कि मैं कहाँ पर हूँ। काफी सरल।

यह भी निर्धारित करने की कोशिश करता है कि क्या दुश्मन बॉट कुछ निरंतर अंश का उपयोग करने की कोशिश नहीं कर रहा है, क्योंकि शक्तियों > भिन्न

संपादित करें: मैं एक डमी हूं और मेरा अंश डिटेक्टर काम नहीं कर सका। अब मरम्मत की जा रही है।

def squareUp(hp, history, ties, alive, start):

    #Taken from Geometric Bot
    opponentHP = 100 - sum(history)

    # Need to add case for 1
    if hp == 1:
        return 1

    # Last of the last - give it your all
    if alive == 2:
        if ties == 2 or opponentHP < hp-1:
            return hp - 1

    #Calculate your bet (x^(4/5)) with some variance
    myBet = np.maximum(hp - np.power(hp, 4./5), np.power(hp, 4./5))
    myBet += np.random.randint(int(-hp * 0.05) or -1, int(hp * 0.05) or 1);
    myBet = np.ceil(myBet)
    if myBet < 1:
        myBet = 1
    elif myBet >= hp:
        myBet = hp-1
    else:
        myBet = int(myBet)

    #If total annihilation is a better option, dewit
    if opponentHP < myBet:
        if ties == 2:
            return opponentHP + 1
        else:
            return opponentHP

    #If the fraction is proven, then outbid it (Thanks again, Geometric bot)
    if history and history[0] != history[-1]:
        health = 100
        fraction = float(history[0]) / health
        for i,x in enumerate(history):
            newFraction = float(x) / health
            if newFraction + 0.012*i < fraction or newFraction - 0.012*i > fraction:
                return myBet
            health -= x
        return int(np.ceil(opponentHP * fraction)) + 1    
    else:
        return myBet

एक बुरा पहला शॉट नहीं, स्कोर अपडेट किया गया है
KB36gs

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