ตะเกียบกลายเป็นจุด


13

กฎพื้นฐาน (แตกต่างจากของฉัน)

เรื่องราว

ปี 4579 เป็นมนุษย์ตอนนี้มี 2 มือแต่ละมือมี 1,100 นิ้ว ตะเกียบได้กลายเป็นจุดด้อย และ @Dennis ก็มีตัวแทนมากขึ้นแล้ว @Martin ... วงกลมสีแดงที่วาดด้วยมือตอนนี้ถูกลดระดับลง ... Jon Skeet ได้ตี 2 ล้านล้านตัวแทนในทุกไซต์ SE ... ใช่น่ากลัวฉันรู้

Chopsticks เป็นเกมมือที่ได้รับการแก้ไขแล้ว เพื่อให้ได้รอบนี้ฉันได้สร้างมันกลายพันธุ์ ฉันเพิ่มปริมาณนิ้ว

กฎของเกม

วิธีการเล่นนี้

ทุกคนเริ่มต้นด้วย 2 มือ มือแต่ละข้างมี 1001 นิ้ว ทุกมือเริ่มต้นด้วย 1 (หนึ่ง) นิ้วในแต่ละมือ ในช่วงเทิร์นของคุณคุณสามารถ "ตี" มือผู้เล่นอื่น ในการตีคุณเลือก 1 ในมือของคุณเพื่อตีด้วยและ 1 ในมือเพื่อตี มือที่ถูกโจมตีตอนนี้มีจำนวนนิ้วที่เป็นของพวกเขาในตอนแรกและจำนวนนิ้วที่คุณมีในมือที่คุณตีด้วย

EX

P1: 1,1 P2: 1,1. เพลงฮิตP1[0] ตอนนี้นิ้วP2[1] P1:1,1 P2:1,2ตอนนี้ฮิตP2[1] p1[0]นิ้วมือตอนนี้ P1: P23,11,2

หากมือข้างหนึ่งได้รับ 1001 นิ้วขึ้นไปมือนั้นจะหมด จากนั้นผู้เล่นที่ได้รับแจก (สำหรับตาของพวกเขา) สามารถ "แยก" การแยกคือเมื่อคุณจับมือที่อยู่และลดจำนวนนิ้ว (ปัดขึ้น) และให้นิ้วเหล่านั้นกลับเข้าที่อีกครั้ง

EX

P1: P21000,2 เพลงฮิต คะแนนเป็น P1: P2 แยกเลี้ยวและคะแนนของเขาก็คือ P1: และ P27,7P2[0]P1[0]0,21,1P1[1]1,17,7

เกมจะจบลงเมื่อผู้เล่นคนหนึ่งมีมือทั้งสองข้างออกมา คะแนนจะถูกทำคะแนนตามจำนวนนิ้วที่ผู้ชนะมี คะแนนมากขึ้น = ดีขึ้น ผู้แพ้ไม่ได้รับคะแนน

มีกฎอื่น ๆ ที่ใช้อยู่ แต่เป็นกฎที่ใช้ที่นี่

ทุกคนเล่นกับทุกคน (round robin)

ฤทธิ์

รวมคะแนนของคุณขึ้นจากทุกรอบที่คุณชนะ จากนั้นคะแนนเฉลี่ยของทุกคนก็สูงขึ้น หารผลรวมของคุณด้วยคะแนนเฉลี่ยและรับคะแนนสุดท้ายของคุณ คะแนนส่วนใหญ่ชนะ

กฎที่แท้จริง

ช่องโหว่มาตรฐาน

โปรดอย่าได้พยายามที่จะแก้เกม จริง ๆ แล้วฉันต้องสามารถเรียกใช้: P

ตรวจสอบให้แน่ใจว่าบอทสามารถทำงานได้อย่างรวดเร็ว ด้วยความยาวของรอบตัดสินว่าจะใช้เวลาสักครู่

ไลบรารีทั้งหมดที่จำเป็นในโปรแกรมของคุณต้องอยู่ในไลบรารี python เริ่มต้น นอกจากนี้ยังมีรายการสิ่งที่คุณต้องการนำเข้า การนำเข้าจะเป็นเพียงการนำเข้าขั้นพื้นฐาน (คณิตศาสตร์ที่ฉันทำ: import math)

รู้รอบต้องทำงานใน Python 3.x

ผู้ดำเนินการ

บอทของคุณจะเป็นไฟล์ Python 3 ของตัวเองพร้อมplayฟังก์ชั่น

playจะถูกส่งผ่านสองรายการของตัวเลขสองตัวต่อกัน ตัวเลขนี้ระบุจำนวนนิ้วมือที่ขึ้นอยู่กับแต่ละมือ รายการแรกคือมือของคุณเอง

หากคุณเลือกที่จะตีมือของผู้เล่นคนอื่นแล้วกลับรายการสองบิต บิตแรกคือดัชนีของมือที่คุณใช้ตี ( 0สำหรับอันดับแรก1สำหรับสุดท้าย) และบิตที่สองคือดัชนีของมือที่คุณกดปุ่มบนคู่ต่อสู้

หากคุณเลือกที่จะแยกคืนค่าความจริงอื่น ๆ

Tada!

ควบคุมสามารถพบได้ที่นี่ บันทึกแต่ละบอทในไฟล์ของตัวเองและรายการชื่อไฟล์แต่ละธนาคารแห่งประเทศไทย (ไม่.py) botnamesใน

หมายเหตุสุดท้าย:

คุณและบอทคนอื่น ๆ จะผลัดกันก่อน หากเกมไม่ยุติในรอบ 100,000 (หนึ่งแสน) เกมจะถูกยกเลิกและจะไม่ชนะบอท

ตัวควบคุมไม่ได้รับการป้องกันจากการเคลื่อนไหวที่ต้องทำตลอดไป แต่ค่าใช้จ่ายที่ไม่จำเป็นจะถูกขมวดคิ้วอย่างมาก



"กฎ KOTH มาตรฐาน" เป็นลิงก์ได้หรือไม่ และอาจจะ "ช่องโหว่มาตรฐาน" ด้วย
— trichoplax

My handler is very simple, your bot must do it's logic then adjust the the finger scores as needed, remember!อะไรเราจึงเป็นคนทำการคำนวณเพื่อ KoTH?
— HyperNeutrino

@HyperNeutrino ตรงข้ามการแก้ไข
— Christopher

4
เดนนิสมีตัวแทนมากกว่ามาร์ตินในขณะนี้ พระเจ้าของฉัน 996 นิ้วพิเศษเหล่านี้มาจากไหน!
— caird coinheringaahing

คำตอบ:


6

CodingAndAlgorithms

คำตอบนี้ใช้การเข้ารหัสและอัลกอริทึมจริง ๆ แล้วต่างจากคำอื่น ๆ ! การอ้างอิง: imgur (เช่นเดียวกันกับทุกคำตอบที่โพสต์ก่อนหน้านี้)

def play(A, B):
    if sum(A) == 1:
        return [A.index(1), B.index(max(B))]
    elif max(A) + max(B) > 1000:
        return [A.index(max(A)), B.index(max(B))]
    elif 0 in A:
        return 1
    elif 0 in B:
        return [A.index(min(A)), 1-B.index(0)]
    else:
        return [A.index(min(A)), B.index(min(B))]

ฉันได้รับข้อมูลอ้างอิงนั้น XD
— Christopher

นี่เพิ่งจะชนะ มันไม่เคยหายไป
— Christopher

ขอแสดงความยินดี! ฉันเดาว่าฉันจะต้องจัดการกับสถานที่ที่สอง การเข้ารหัสและอัลกอริทึมของคุณแข็งแกร่งกว่าของฉัน
— หมึกมูลค่า

3

CautionBot

def play(s,o):
 if max(s)+max(o)>1000 and (all(s) or max(s)+min(o)<1001):
  return [s.index(max(s)),o.index(max(o))]
 else:
  return [s.index(min(s)),o.index(min(filter(bool,o)))]if all(s) else 'split'

CautionBot ไม่ต้องการทำให้เกิดปัญหามากเกินไปดังนั้นมันจะกระทบมือของฝ่ายตรงข้ามที่เล็กกว่าด้วยมือที่เล็กกว่าถ้ามันมีมือทั้งสองและแยกออก อย่างไรก็ตาม CautionBot นั้นไม่ใช่เรื่องโง่เขลาดังนั้นหากสามารถหยิบมือของฝ่ายตรงข้ามได้โดยไม่สูญเสียตาต่อไปในทันทีมันจะทำเช่นนั้นแทนการเคลื่อนไหวตามปกติ


สิ่งนี้เป็นการชนะอย่างไม่เป็นทางการ
— Christopher

เย็น! เราจะดูว่าสิ่งต่าง ๆ ไปจากที่นี่เพราะฉันจะไม่แปลกใจเมื่อมีคนพัฒนากลยุทธ์ที่ดีกว่า ฉันเพิ่งใช้สิ่งที่ฉันเข้าใจว่าเป็นกลยุทธ์ของวนิลา Chopstick (เป็นคนขี้ขลาดและแยกกันบ่อย ๆ เพื่อหลีกเลี่ยงการถูกฆ่า) ในวิธีที่เหมาะสมกับกฎใหม่ที่สุด (เป็นคนขี้ขลาดและกดต่ำเพื่อหลีกเลี่ยงการถูกฆ่า มีมือทั้งสองของคุณผิดกฎหมาย) lol
— Value Ink

3

ควอไลเซอร์

def play(s, o):
    if not all(s):
        return 1
    else:
        return [s.index(max(s)), o.index(min(filter(bool, o)))]

หากไม่มีอีควอไลเซอร์มือก็จะแยก มิฉะนั้นมันจะกระทบมือที่เล็กที่สุดของฝ่ายตรงข้ามด้วยมือที่ใหญ่ที่สุดของมันเอง


ตามกฎที่กลายพันธุ์เหล่านี้ AFAIK คุณสามารถแยกได้ถ้ามือข้างหนึ่งหมด
— Value Ink

โอ้ใช่ฉันจะแก้ไขเรื่องนั้น
— LyricLy

"ถ้าอีควอไลเซอร์ไม่มีมือ ... " ฉันหมายถึงว่าถ้ามันไม่มีมือแล้วมันก็หายไปแล้ว? แต่นั่นก็เป็นเพียงการเติมให้ใช้ +1 ของฉันเพื่อชดเชย
— Value Ink

3

ผู้รุกราน

def play(s, o):
    return [s.index(max(s)),o.index(max(o))]if all(s)else 1

บอตเริ่มต้นอีกตัว Aggressor จะตีมือของคู่ต่อสู้ที่ใหญ่กว่าด้วยมือที่ใหญ่กว่าถ้ามือทั้งสองไม่ว่างเปล่า มิฉะนั้นจะแยก


2

RandomBot

import random

def play(s, o):
    return [random.randint(0,1)for i in'  ']if all(s)else 1

เพื่อเริ่มต้นสิ่งต่าง ๆ นี่คือบอทที่สร้างการโจมตีแบบสุ่มถ้ามือของมันไม่ว่างเปล่า มิฉะนั้นให้แยก

กอล์ฟเพราะทำไมไม่: 3


ฉันกำลังแก้ไขนั้น
— Christopher

@Christopher ขออภัยไม่เห็นความคิดเห็นของคุณ --- เมื่อคุณแก้ไขฉันจะลบนี้ --- ฉันจะลบมันเพราะมันโง่ xD
— HyperNeutrino

@Christopher หมายเหตุ: ฉันได้แก้ไขสิ่งนี้ลงในการส่งที่ถูกต้อง ฉันจะเพิ่มโซลูชันอื่นด้วย บอกฉันว่าควบคุมไม่ได้ทำงานอย่างถูกต้อง :)
— HyperNeutrino

ดีลองพวกเขาออกมา
— Christopher

@Christopher คอนโทรลเลอร์ทำงานถูกต้องหรือไม่?
— HyperNeutrino

2

ความผิดพลาด

ใช่นั่นคือชื่อของบอท

def play(s, o):
    if max(s)+max(o)>1000:
        return [s.index(max(s)),o.index(max(o))]
    if 0 in s:return ''
    return [s.index(max(s)),o.index(min(o))]

ฉันมาถึงที่นี้โดยการทดสอบกับบ็อตอื่น ๆ อย่างไรก็ตามมันเป็นครั้งที่สองในการจำลองของฉัน ในที่สุดฉันก็จะทำบอทตัวอื่น

แก้ไข: ฉันดูเหมือนจะไม่สามารถเขียนบอทใด ๆ ที่เต้น CautionBot และการทดสอบเพิ่มเติมของฉันดูเหมือนจะบ่งบอกว่านี่เป็นอันดับที่สองที่ดีที่สุดไม่ใช่อันดับที่สองที่เลวร้ายที่สุด


1

วิ่งมาราธอน

ฉันปรับแต่งโค้ดของ Aggressor ที่จัดทำโดย "HyperNeutrino" เพียงแค่กดสองมือที่เล็กลงของฝ่ายตรงข้ามด้วยมือที่เล็กลง แน่นอนว่ามันเป็นกลยุทธ์ที่โง่มาก แต่ฉันก็ไม่สามารถที่จะอยู่อันดับต้น ๆ ของแผนภูมิได้! (แม้ว่าแผนภูมินั้นจะเป็นขาดทุน)

ฉันไม่แน่ใจว่ารหัสนี้จะทำงานโดยไม่มีข้อผิดพลาดหรือไม่เพราะฉันไม่สามารถทดสอบได้เนื่องจากทำงานอยู่ อย่างไรก็ตามควรรันอย่างไม่มีที่ติ

def play(s, o):
     return [s.index(min(s)),o.index(min(o))]if all(s)else 1

คำตอบแรกที่ดี! คุณเลือกคำถามที่ยอดเยี่ยม: P (ไม่มีอคติ)
— Christopher

ขอบคุณ :) ฉันรู้สึกประหม่าเพราะฉันไม่แน่ใจว่าการปรับแต่งรหัสของคนอื่นเหมือนฉันได้รับอนุญาตหรือไม่ ฉันถือว่ามันเป็นตราบใดที่คุณทำให้มันชัดเจน และฉันจะพยายามทำสิ่งที่จะเล่นมือที่ใหญ่ที่สุดกับฝ่ายตรงข้ามที่ใหญ่ที่สุด แต่ HyperNeutrino เอาชนะฉันไปที่นั้น! ฮ่าฮ่า
— จอร์แดน

ใช่. ในการปรับเปลี่ยนรหัส SE นี้มักจะใช้: P
— Christopher

คำตอบที่ยอดเยี่ยม! สิ่งหนึ่งที่ฉันกังวล (ไม่สามารถทดสอบได้ในตอนนี้) คือฉันไม่รู้ว่าตัวควบคุมจะตอบสนองอย่างไรถ้าคุณพยายามตีมือเปล่าหรือปัจจัยที่เป็นกฎ
— หมึกมูลค่า

1
สิ่งนี้คล้ายกับ Equalizer แต่ Equalizer จะตรวจสอบเพื่อให้แน่ใจว่าจะไม่ตีมือเปล่าของฝ่ายตรงข้ามถ้ามี @LyricLy
— HyperNeutrino
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.