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


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.