ポイントで変異した箸KoTH


13

基本的なルール(私のルールとは異なります)

物語

4579年、人間はそれぞれ1001本の指を持つ2つの手になりました。箸はポイントに基づいています。そして、@ Dennisは@Martinよりも多くの担当者がいます...手描きの赤い丸は今では投票されていません... Jon SkeetはすべてのSEサイトで2兆回の担当者を叩いています...ええ、怖いです

箸は解決されたハンドゲームです。これを回避するために、変異させて作成しました。指の量を増やしました。

ゲームのルール

これが演奏される方法

誰もが2つの手で始まります。各手には1001本の指があります。すべての手は上の1(1)指で起動し、それぞれの手。ターン中に、他のプレイヤーの手を「ヒット」できます。ヒットするには、ヒットするハンドを1つ、ヒットするハンドを1つ選択します。ヒットしたハンドには、最初は指の数があり、ヒットした手に持っていた指の数があります。

EX

P1: 1,1 P2: 1,1P1[0]ヒットP2[1]。今指はP1:1,1 P2:1,2です。今P2[1]ヒットp1[0]。指はP1:3,1P2になりました1,2

片方の手が1001本以上の指に達すると、その手は外に出ます。その後、(自分のターンで)ハンドを手にしたプレイヤーは「スプリット」できます。分割とは、中にある手を取り、指の量を半分に切り上げ(切り上げ)、それらの指をもう一方の手に渡して戻すことです。

EX

P1:1000,2P2 7,7P2[0]ヒットP1[0]。スコアはP1:0,2P2 1,1です。P1[1]彼のターンでスプリットし、スコアはP1:1,1とP2 7,7です。

1人のプレイヤーが両方の手を出したらゲームは終了します。ポイントは、勝者が持っている指の量によって得点されます。ポイントが多いほど良い。敗者はポイントを獲得しません。

使用される他のルールがありますが、これらはここで使用されるものです。

みんながみんなで遊ぶ(ラウンドロビン)

終盤

あなたが勝つすべてのラウンドからあなたのポイントを合計します。次に、全員のポイントを平均します。合計を平均ポイントで割り、最終スコアを取得します。ほとんどのポイントが勝ちます。

実際のルール

標準抜け穴

ゲームを解決しようとしないでください。私は実際にそれを実行できる必要があります:P

ボットが高速で実行できることを確認します。ラウンドの長さを判断するにはこれには時間がかかります

プログラムに必要なすべてのライブラリは、デフォルトのpythonライブラリに含まれている必要があります。インポートする必要があるものもリストします。輸入はちょうど(数学のために私は:基本的なインポートされますimport math

回答はPython 3.xで動作する必要があります

ハンドラ

ボットは、play機能を持つ独自のPython 3ファイルになります。

playそれぞれ2つの数字の2つのリストが渡されます。この数字は、各手に何本の指が上がっているかを示しています。最初のリストは自分の手です。

他のプレイヤーのハンドをヒットすることを選択した場合、2ビットのリストを返します。最初のビットは、ヒットする0ために使用しているハンドのインデックス(最初、1最後)であり、2番目のビットは、相手にヒットしているハンドのインデックスです。

分割することを選択した場合、他の真の値を返します。

多田!

コントローラはここにあります。各ボットを独自のファイルに保存し、各ボットのファイル名を(なしで.py)にリストしbotnamesます。

最後のメモ:

あなたと他のボットが最初に交代します。ゲームが100,000(10万)ラウンドで終了しない場合、ゲームは終了し、どちらのボットも勝ちません。

コントローラーは、永久に移動することから保護されていませんが、不要なオーバーヘッドは強く眉をひそめます。



「標準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 oppsの修正。
クリストファー

4
デニスは現在マーティンより多くの代表を持っています。なんてこった、この余分な996本の指はどこから来たのか!
コメアリンガーアーイング

回答:


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を手に入れました
クリストファー

これはちょうど勝った。それは決して失われませんでした。
クリストファー

おめでとう!私は2位に落ち着かなければならないと思う。あなたのコーディングとアルゴリズムは私のものよりも強かった
Value Ink

3

注意ボット

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'

注意ボットはあまり大きなトラブルを引き起こしたくないので、両手がある場合は小さな手で相手の小さい方の手に当たり、そうでなければ割れます。ただし、CottionBotはバカではないため、次のターンをすぐに失うことなく相手の手を奪うことができる場合、通常の動きの代わりにそうします。


非公式にはこれが勝ちです
クリストファー

涼しい!誰かがより良い戦略を開発しても驚かないので、ここから物事がどのように進むかを見ていきます。バニラチョップスティック戦略であると理解したものを、殺すのを避けるためにしばしば(病者であり、分割する)、新しいルールに最もよく適応する方法で適用しました両方の手を持っていることは違法です)lol
バリューインク

3

イコライザ

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

イコライザーに手札がない場合、それは分割されます。さもなければ、それはそれ自身の最大の手で相手の最小の手に当たります。


これらの変更されたルールによれば、片手が出ている場合にのみ分割できます。
値インク

そうそう、私はそれを修正します。
LyricLy

「イコライザーに手がない場合...」まあ私はそれが手を持っていない場合、それはすでに失われているということですか?しかし、それはちょうどつべこべだ、補償するための私の1を取る
バリューインク

3

攻撃者

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

もう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申し訳ありませんが、コメントは表示されませんでした。あなたはそれを修正したら---私はこの.---それは愚かなxDさんだから、私はちょうどこれを削除します削除します
HyperNeutrino

@Christopher注:私はこれを有効な提出物に編集しました。別のソリューションも追加します。コントローラーが正常に動作しない場合は教えてください:)
HyperNeutrino

それらを試してみてください
クリストファー

@Christopherコントローラーは正常に動作しますか?
ハイパーニュートリノ

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

私は他のボットでテストすることでこれに到達しました。ただし、私のシミュレーションでは一貫して2番目に最後です。したがって、最終的には別のボットを作成します。

編集:CautionBotに勝るボットを書くことはできないようで、追加のテストでは、これが2番目に悪いものではなく、2番目に良いことを示しているようです。


1

マラソン選手

「HyperNeutrino」が提供するAggressorのコードを調整して、小さい方の手で相手の小さい方の2つの手を単純にヒットさせました。もちろん非常に馬鹿げた戦略ですが、チャートのトップに立つことを断ることはできません!(そのチャートは損失になりますが)

作業中のためテストできなかったため、このコードがエラーなく実行されるかどうかはわかりません。ただし、問題なく実行されるはずです。

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

素敵な最初の答え!あなたは素晴らしい質問を選びました:P(バイアスなし)
クリストファー

おかげで:)私がやったように誰かのコードを微調整することが許可されているかどうかわからなかったので、私はかなり緊張していました。私はあなたがそれを明らかにする限りそれが仮定します。そして、私はちょうど最大の対戦相手に対して最大のハンドをプレイするものを作ろうとしましたが、HyperNeutrinoはまさにその1つに私を打ち負かしました!ハハ
ヨルダン

うん。このSEでは、コードの調整がよく使用されます。P-
クリストファー

クールな答え!私が心配することの1つ(今はテストできません)は、空の手を打とうとした場合にコントローラーがどのように応答するか、またはルールにどのように影響するかがわからないことです。
バリューインク

1
これはイコライザーと非常に似ていますが、イコライザーは、存在する場合に相手の空の手に当たらないことを確認します。しゅう
HyperNeutrino
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.