Sumpit bermutasi dengan poin KoTH

13

Aturan dasar (berbeda dengan saya)

Cerita

Ini adalah tahun 4579, manusia sekarang memiliki 2 tangan dengan masing-masing 1001 jari. Sumpit telah menjadi dasar dari poin. Dan @Dennis memiliki lebih banyak rep daripada @Martin ... Lingkaran merah digambar tangan sekarang diturunkan ... Jon Skeet telah mencapai 2 triliun rep di setiap situs SE ... Ya menakutkan saya tahu

Sumpit adalah permainan tangan yang telah diselesaikan. Jadi untuk menyiasati ini saya telah membuatnya bermutasi. Saya meningkatkan jumlah jari.

Aturan mainnya

Cara ini dimainkan

Semua orang mulai dengan 2 tangan. Setiap tangan memiliki 1001 jari. Setiap tangan dimulai dengan 1 (satu) jari di atas masing-masing tangan. Selama giliran Anda, Anda dapat "memukul" tangan pemain lain. Untuk memukul Anda memilih 1 tangan Anda untuk memukul dan 1 tangan mereka untuk memukul. Tangan yang dipukul sekarang memiliki jumlah jari pada awalnya dan jumlah jari yang ada pada tangan yang Anda pukul.

EX

P1: 1,1 P2: 1,1. P1[0]hit P2[1]. Sekarang jari P1:1,1 P2:1,2. Sekarang P2[1]hit p1[0]. Jari-jarinya sekarang P1: 3,1P2 1,2.

Jika satu tangan sampai 1001 jari ke atas atau lebih maka tangan itu keluar. Kemudian pemain yang mendapat hand out (untuk giliran mereka) dapat "membagi". Membelah adalah ketika Anda mengambil tangan yang ada di dalam dan membagi dua jumlah jari (bulat) dan memberikan jari-jari ke tangan lain untuk mendapatkannya kembali.

EX

P1: 1000,2P2 7,7. P2[0]hit P1[0]. Skor adalah P1: 0,2P2 1,1. P1[1]membagi untuk gilirannya dan skornya adalah P1: 1,1dan P2 7,7.

Permainan berakhir ketika satu pemain memiliki kedua tangan. Poin dicetak dengan jumlah jari yang dimiliki pemenang. Lebih banyak poin = lebih baik. Yang kalah tidak mendapatkan poin.

Ada aturan lain yang digunakan tetapi ini adalah yang digunakan di sini.

Semua orang memainkan semua orang (round robin)

Akhir permainan

Jumlahkan poin Anda dari setiap putaran yang Anda menangkan. Kemudian rata-rata semua orang menunjukkan poin. Bagilah total Anda dengan poin rata-rata dan dapatkan skor akhir Anda. Sebagian besar poin menang.

Aturan yang sebenarnya

Celah standar

Jangan tidak mencoba memecahkan permainan. Saya sebenarnya harus bisa menjalankannya: P

Pastikan bot bisa berlari cepat. Dengan panjang putaran menilai ini akan memakan waktu cukup lama

Semua perpustakaan yang dibutuhkan dalam program Anda harus berada di perpustakaan python default. Juga daftarkan yang Anda perlu impor. Impor hanya akan menjadi impor dasar (untuk matematika saya lakukan import math:)

Jawaban harus bekerja dalam Python 3.x

Handler

Bot Anda akan menjadi file Python 3 sendiri dengan playfungsi.

playakan melewati dua daftar dari dua angka masing-masing. Angka ini menunjukkan berapa banyak jari di atas masing-masing tangan. Daftar pertama adalah tangan Anda sendiri.

Jika Anda memilih untuk memukul tangan pemain lain, maka kembalikan daftar dua bit. Bit pertama adalah indeks dari tangan yang Anda gunakan untuk memukul ( 0untuk yang pertama, 1untuk yang terakhir), dan bit kedua adalah indeks dari tangan yang Anda pukul lawan.

Jika Anda memilih untuk membagi, kembalikan nilai kebenaran lainnya.

Tada!

Kontroler dapat ditemukan di sini . Simpan setiap bot di file sendiri dan daftar setiap nama file bot (tanpa .py) di botnames.

Catatan akhir:

Anda dan bot lain akan bergiliran pergi terlebih dahulu. Jika permainan tidak berakhir dalam 100.000 (seratus ribu) putaran, permainan akan dihentikan dan bot tidak akan menang.

Kontroler tidak terlindung dari gerakan yang berlangsung selamanya, tetapi overhead yang tidak perlu akan sangat disukai.

Christopher
sumber
Sandbox
Christopher
Bisakah "Aturan KOTH Standar" menjadi tautan? Dan mungkin "celah Standar" juga.
trichoplax
My handler is very simple, your bot must do it's logic then adjust the the finger scores as needed, remember! Apa, jadi kita yang melakukan perhitungan untuk KoTH?
HyperNeutrino
@HyperNeutrino memperbaiki opps.
Christopher
4
Dennis memiliki lebih banyak perwakilan daripada Martin sekarang . Ya Tuhan, dari mana asal 996 jari ini?
caird coinheringaahing

Jawaban:

6

Algoritma CodingAnd

Jawaban ini sebenarnya menggunakan coding dan algoritma, tidak seperti yang lain sejauh ini!referensi: imgur (juga mengalahkan semua jawaban yang diposting sebelum ini)

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))]
betseg
sumber
Saya mendapat referensi XD
Christopher
Ini baru saja menang. Itu tidak pernah hilang.
Christopher
Selamat! Saya kira saya harus puas di tempat kedua. Pengkodean dan algoritme Anda lebih kuat dari milik saya
Value Ink
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 tidak ingin menyebabkan terlalu banyak masalah, jadi itu mengenai tangan lawan yang lebih kecil dengan tangan yang lebih kecil jika memiliki kedua tangan, dan jika tidak terbelah. Namun, CautionBot bukan orang bodoh, jadi jika ia bisa mengeluarkan tangan lawan tanpa segera kehilangan giliran berikutnya, itu akan dilakukan alih-alih langkah normalnya.

Nilai Tinta
sumber
Secara tidak resmi ini menang
Christopher
Keren! Kita akan melihat bagaimana keadaan dari sini karena saya tidak akan terkejut ketika seseorang mengembangkan strategi yang lebih baik. Saya baru saja menerapkan apa yang saya pahami sebagai strategi vanilla Chopstick (jadilah pengecut dan berpisah sering agar tidak terbunuh) dengan cara yang paling sesuai dengan aturan baru (jadilah pengecut dan tekan rendah agar tidak terbunuh, sejak terbelah / menyatu saat Anda memiliki kedua tangan Anda adalah ilegal) lol
Value Ink
3

Equalizer

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

Jika Equalizer hilang tangan, itu akan terbelah. Kalau tidak, ia akan memukul lawan terkecilnya dengan tangan terbesarnya sendiri.

Lirik
sumber
Menurut aturan yang dimutasi ini, AFAIK Anda hanya dapat membagi jika satu tangan keluar.
Nilai Tinta
Oh ya, aku akan memperbaikinya.
LyricLy
"Jika Equalizer tidak memiliki tangan ..." Yah, maksudku jika tidak ada tangan, maka itu sudah hilang? Tapi itu hanya nitpicking, ambil +1 saya untuk mengkompensasi
Nilai Tinta
3

Agresor

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

Bot pemula yang lain, Aggressor akan memukul tangan lawan yang lebih besar dengan tangan yang lebih besar jika kedua tangannya tidak kosong; jika tidak, itu akan pecah.

HyperNeutrino
sumber
2

RandomBot

import random

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

Hanya untuk memulai, inilah bot yang membuat pukulan acak jika kedua tangannya tidak kosong; jika tidak, perpecahan.

Golf karena mengapa tidak: 3

HyperNeutrino
sumber
Saya memperbaikinya
Christopher
@Christopher Maaf, tidak melihat komentar Anda. --- Setelah Anda memperbaikinya saya akan menghapus ini .--- Saya hanya akan menghapus ini karena itu xD bodoh
HyperNeutrino
@Christopher Note: Saya sudah mengedit ini menjadi kiriman yang valid. Saya akan menambahkan solusi lain juga; katakan padaku jika controller tidak berfungsi dengan benar :)
HyperNeutrino
Senang mencoba mereka
Christopher
@Christopher Apakah controller berfungsi dengan baik?
HyperNeutrino
2

Kesalahan

Ya, itulah nama bot itu.

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))]

Saya tiba di sini dengan menguji dengan bot lain. Namun secara konsisten kedua-terakhir dalam simulasi saya. Jadi aku akan membuat bot lain pada akhirnya.

Sunting: Sepertinya saya tidak bisa menulis bot apa pun yang mengalahkan CautionBot, dan pengujian tambahan saya tampaknya menunjukkan bahwa ini adalah yang terbaik kedua, bukan yang terburuk kedua.

Magenta
sumber
1

Maraton

Saya men-tweak kode Aggressor yang disediakan oleh "HyperNeutrino" hanya untuk menekan yang lebih kecil dari dua tangan lawan dengan yang lebih kecil dari tangannya. Tentu saja ini adalah strategi yang sangat konyol, tetapi saya tidak bisa menolak untuk berada di puncak tangga lagu! (Meskipun grafik itu akan menjadi kerugian)

Saya tidak yakin apakah kode ini akan berjalan tanpa kesalahan karena saya tidak dapat mengujinya karena sedang bekerja. Namun, itu harus berjalan dengan sempurna.

def play(s, o):
     return [s.index(min(s)),o.index(min(o))]if all(s)else 1
Yordania
sumber
Jawaban pertama yang bagus! Anda memilih pertanyaan yang bagus: P (tidak bias)
Christopher
Terima kasih :) Saya cukup gugup karena saya tidak yakin apakah mengubah kode orang lain seperti saya diizinkan atau tidak. Saya menganggap itu selama Anda membuatnya jelas. Dan saya akan mencoba membuat yang hanya akan memainkan tangan terbesar melawan lawan terbesar tapi HyperNeutrino mengalahkan saya dengan yang tepat! haha
Jordan
Ya. Pada kode tweaking SE ini sering digunakan: P
Christopher
Jawaban keren! Satu hal yang saya khawatirkan (tidak dapat mengujinya sekarang) adalah bahwa saya tidak tahu bagaimana controller akan merespons jika Anda mencoba mengenai tangan kosong, atau bagaimana faktor-faktor itu menjadi aturan.
Nilai Tinta
1
Ini sangat mirip dengan Equalizer tetapi Equalizer akan memeriksa untuk memastikan itu tidak mengenai tangan kosong lawan jika ada. @LyricLy
HyperNeutrino