囚人のジレンマv.2-バトルロワイヤル


15

この質問、ゲームはプレイヤーは、囚人のジレンマでペアでペアオフお互いに直面する他の人に対する最高得点反復どの戦略を決定するためにここで考案されました。

、この質問、私は複数の人が同時に互いに全てに対して囚人のジレンマを再生する方法を考案しました。このバリエーションでは、ペイオフマトリックスは不要であり、2人のプレーヤーの各ペア間の各結果は、機能的に独立した2つの決定の合計です。

あなたの仕事は、可能な限り最高のスコアを達成するマルチプレイヤーPrisoner's Dilemmaのこの対称的で一般化されたバージョンをプレイするAIを構築することです。


ゲームのルール

このマルチプレイヤー、マルチラウンドの囚人のジレンマの各ラウンドでは、プレイヤーはA他のプレイヤーから「1」を取ることを決定できBます。この状況では、Aのスコアは1増加しますが、Bのスコアは2減少します。この決定は、順序付けられた各プレーヤーペア間で行われます。

これは、各プレイヤーに対して行われる唯一の決定です。他のプレイヤーから「1をテイク」するか、「テイク1」をしないかは、それぞれ離反と協力に相似です。2人の選手間の効果的なペイオフ行列P1P2ルックス、次のように:

  P1/P2     P1 Take1   P1 Don't
P2 Take1     -1/-1      -2/+1
P2 Don't     +1/-2       0/ 0

トーナメント手順

ゲームはP * 25ラウンドで構成されますP。ここで、参加しているプレーヤーの数です。すべてのプレーヤーはスコアで始まり0ます。各ラウンドは次の手順で構成されます。

ラウンドの開始時に、各プログラムには、次の形式で標準入力から以前のラウンドの履歴が与えられます。

  • 3つの数字を含む一行、PD、とN

    • Pゲーム内のプレイヤーの総数です。各プレイヤーはランダムにID番号が割り当てられている1P、ゲームの開始時に。

    • D 現在のプレーヤーのIDです。

    • N プレイされたラウンドの数です。

  • N行。各行はラウンドの結果を表します。の行kN、スペースで区切られたいくつかn_kの順序付きペア(a, b)があります。これは、aID bを持つプレイヤーがそのラウンドのID を持つプレイヤーから「1を奪った」ことを表します。

  • から(2 64-1Rまでの一様な乱数。擬似乱数シードとして機能します。これらの数値は、事前に生成されたファイルから読み取られます。このファイルは、トーナメントの終了時にリリースされるため、ユーザーは自分で結果を確認できます。018446744073709551615

  • 前のラウンドでプログラムがこのような出力を生成した場合、プログラムに読み込まれる何らかの形式の状態を表す1行追加。ゲームの開始時には、この行は常に空です。この行は、スコアリングコードまたは他のプログラムによって変更されません。

各プログラムは、以下を生成するための戦略を使用する標準出力に

  • Kこのラウンドから「1」を取得するプログラムのIDである番号のリスト。空の出力は、何もしないことを意味します。

  • 必要に応じて、後のラウンドに渡す状態の何らかの形式を表す1つの追加行。この正確な行は、次のラウンドでプログラムにフィードバックされます。

以下は、34人用のゲームでIDのプレイヤーのゲームを開始するための入力例です。

4 3 0
4696634734863777023

以下は、すでにいくつかのラウンドがプレイされている同じゲームの入力例です。

4 3 2
(1, 2) (1, 3) (1, 4) (4, 2)
(1, 3) (2, 1) (2, 4) (3, 1) (4, 1)
4675881156406346380

各プログラムにはD、各プログラムに固有のID番号を除いて、ラウンドでまったく同じ入力が与えられます。

以下は、プレーヤー3が他の全員から1を取得する出力例です。

1 2 4

必要なすべてのラウンドの終わりに、最終スコアが最も高いプレーヤーが勝者になります。


タイムライン

このトーナメントのコーディングは、合計7日間続きます。提出期限は2014-05-09 00:00 UTCです。

この日付より前に実際のプログラムを投稿しないでください-プログラムのソースコードのSHA256ハッシュをコミットメントとして投稿してください。このハッシュは、締め切り前であればいつでも変更できますが、締め切り後に投稿されたコミットメントは判断のために受け入れられません。(私の検証プログラムはbase 64を吐き出し、よりコンパクトな表記法なので、ハッシュにはbase 64表記を使用してください。)

期限が過ぎた後、あなたは2014-05-10 00:00 UTCあなたの提出のためにあなたのプログラムの実際のソースコードを投稿するために1日(まで)を持っています。投稿されたソースコードのSHA256ハッシュが、締め切り前に投稿したどのハッシュとも一致しない場合、コードはトーナメントに受け入れられません。

この後、すべての提出物を自分のコンピューターにダウンロードし、このバトルロワイヤルのすべてのトーナメントエントリを実行します。できれば2日以内に結果を投稿します2014-05-12 00:00 UTC

最も高いスコアの回答を受け入れ、その最終スコアがより大きい場合、その回答に+100の賞金を授与し0ます。

トーナメントが終わったら、コンテストの運営に使用するランダムシードファイルを投稿します。そして、トーナメントで使用されているものに勝つために、他のソリューションの投稿を開始するかもしれません。しかし、彼らは受け入れや報奨金の対象にはなりません。

ホストマシン

コンピューター上の仮想マシンでこれらのソリューションを実行します。この仮想マシンは、2ギガバイトのRAMを備えたUbuntu Linux 14.04を実行します。私のベースマシンには、3.40 GHzで動作するIntel i7-2600Kプロセッサが搭載されています。

必要条件

プログラムは、プログラムをコンパイルするコンパイラーまたはインタープリターが存在し、Ubuntu Linuxの最新バージョンですぐに使用できる言語で作成する必要があります。これにより、すべての提出物を実行し、仮想マシンでそれらを判断できます。

あなたのプログラムは、2.000 seconds各ラウンドを実行するのに必要な時間を超えてはいけません。プログラムが時間切れになるか、エラーが発生した場合、そのラウンドの出力は空と見なされます。

プログラムは確定的でなければなりません。つまり、同じ入力に対して常に同じ出力を返す必要があります。擬似ランダムソリューションが許可されます。ただし、それらのランダム性は、入力として与えられたランダムシードに依存する必要があります。シードファイルはPythonを使用して生成されましたos.urandom。合計500行(必要に応じてさらに生成されます)が含まれ、SHA256ハッシュはK+ics+sFq82lgiLanEnL/PABQKnn7rDAGmO48oiYxZk=です。トーナメントが終了すると、ここにアップロードされます。


植物

物事を開始するために、初期のナイーブ戦略を表す4つの「植物」があります。これらはあなたの提出物とともにトーナメントでプレイされます。ただし、それらの1つが勝つというまれなケースでは、植物以外のプレーヤーが獲得した最高スコアが勝者と見なされます。

各プラントのファイルのハッシュを計算するには、4つのスペースのすべてのグループをタブに置き換えます。ここでのフォーマッターはタブ文字を好まないようです。

怠zy-何もしません。

n1bnYdeb/bNDBKASWGywTRa0Ne9hMAkal3AuVZJgovI=

pass

The Greedy —常に他の全員から1を受け取ります。

+k0L8NF27b8+Xf50quRaZFFuflZhZuTCQOR5t5b0nMI=

import sys

line1 = sys.stdin.readline()
n = [int(i) for i in line1.split()]
for i in range(n[0]):
    if i+1 != n[1]:
        print i+1,
print

The Wrathful —最初のラウンドで他の全員から1枚を受け取り、その後、前のラウンドで1枚を取ったすべての人から1枚を受け取ります。

Ya2dIv8TCh0zWzRfzUIdFKWj1DF9GXWhbq/uN7+CzrY=

import sys
import re

line1 = [int(i) for i in sys.stdin.readline().split()]

players = line1[0]
pid = line1[1]
rounds = line1[2]

lines = []

if rounds == 0:
    for i in range(players):
        if i+1 != pid:
            print i+1,
    print
else:
    for i in range(rounds):
        lines.append(sys.stdin.readline())
    lastline = lines[-1]
    takes = re.findall(r'\([0-9]+, [0-9]+\)', lastline)
    for take in takes:
        sides = [int(i) for i in re.findall(r'[0-9]+', take)]
        if sides[1] == pid:
            print sides[0],
    print

The Envious —現在の最高スコアのプレイヤーの50%から1を取り、それ自体を切り捨てます。

YhLgqrz1Cm2pEcFlsiIL4b4MX9QiTxuIOBJF+wvukNk=

import sys
import re

line1 = [int(i) for i in sys.stdin.readline().split()]

players = line1[0]
pid = line1[1]
rounds = line1[2]

lines = []
scores = [0] * players

if rounds == 0:
    for i in range(players):
        if i+1 != pid:
            print i+1,
    print
else:
    for i in range(rounds):
        takes = re.findall(r'\([0-9]+, [0-9]+\)', sys.stdin.readline())
        for take in takes:
            sides = [int(i) for i in re.findall(r'[0-9]+', take)]
            scores[sides[0] - 1] += 1
            scores[sides[1] - 1] -= 2
    score_pairs = [(i+1, scores[i]) for i in range(players)]
    score_pairs.sort(key=lambda x:(x[1], x[0]))
    score_pairs.reverse()
    taken = 0
    j = 0
    while taken < (players) / 2:
        if score_pairs[j][0] != pid:
            print score_pairs[j][0],
            taken += 1
        j += 1

これら4つの中100ラウンドのトーナメントでは、以下のスコアを受け取ります:

Lazy: -204
Greedy: -100
Wrathful: -199
Envious: -199

審査プログラム

Githubで使用するジャッジプログラムを投稿しました。それをダウンロードしてテストします。(バグを見つけた場合は、1つまたは2つ修正してください。:P)

現時点ではPython以外のコンパイルオプションはありません。後でそれらを含めます-他の言語のコンパイルまたは解釈スクリプトを人々が提供できるなら、私は大いに義務づけられるでしょう。


フェーズ2:ソースコードの提出

tournamentコンテストのGithubリポジトリに、pd_randファイルと他のプラントエントリを含む新しいブランチを投稿しました。ここにソースコードを投稿するか、プルリクエストとしてそのブランチに送信できます。

出場者の順番は次のとおりです。

'begrudger'
'regular'
'patient'
'lazy'
'backstab'
'bully'
'lunatic'
'envious'
'titfortat'
'greedy'
'wrathful'
'judge'
'onepercent'

最終スコア

私のテストプログラムの出力:

Final scores:
begrudger -2862
regular -204
patient -994
lazy -2886
backstab -1311
bully -1393
lunatic -1539
envious -2448
titfortat -985
greedy -724
wrathful -1478
judge -365
onepercent -1921

ランキング:

 1. regular      -204
 2. judge        -365
 3. greedy       -724
 4. titfortat    -985
 5. patient      -994
 6. backstab    -1311
 7. bully       -1393
 8. wrathful    -1478
 9. lunatic     -1539
10. onepercent  -1921
11. envious     -2448
12. begrudger   -2862
13. lazy        -2886

それで、勝者は確かにプレーヤーであることがわかります-それは-204ポイントで、レギュラーです!

残念ながら、そのスコアはポジティブではありませんでしたが、誰もが勝つためにプレイしているIterated Prisoner's Dilemmaのシミュレーションでは、ほとんど期待できません。

いくつかの驚くべき結果(少なくとも驚くべきことだと思った):

  • 貪欲はTatでTitを上回り、実際、一般的にほとんどの得点者よりも高くなっています。

  • ジャッジは、一種の「道徳エンフォーサー」キャラクター(基本的には、平均以上の回数で誰かから1を獲得した人から1を獲得した)を意図していましたが、シミュレーションテストでは実際にスコアが高くなりました。かなり低いスコアを取得します。

そして、(私が思った)それほど驚くことではなかった他のもの:

  • 患者は、The Wrathfulよりも484ポイント満点でした。初めて協力することは本当に有益です。

  • 彼らがダウンしている間、1パーセントはすぐにキックする人がほとんどいませんでした。ゲームに参加しているプレイヤーの数が多いため、1%はそのようにしかとれないようです。

とにかく、トーナメントが終わったので、好きなだけ多くの追加のプレイヤーを投稿して、ジャッジプログラムを使って彼らと一緒にテストしてください。


3
制御プログラムおよび/または植物にソースを投稿すると、何かを傷つけるでしょうか?とにかく彼らが何をするのか知っているので、5つの余分なプログラムを書くことなく何かに対してテストできるようにしたいと思います。
ジオビット14年

2
分かりません。常に1を使用しているすべての人に何らかのペナルティがありますか?常に1をとるのが最も有利ではないでしょうか?
DankMemes 14年

1
欲張りはどのようにしてダメージを最大化しないのですか?他のプレイヤーから取得した場合、他のプレイヤーは-1または-2しか取得できませんが、取得しなかった場合、他のプレイヤーは1または0を取得できます。そして、貪欲は決して負けません。そして、あなたが言ったように、すべての敵も貪欲でなければ、ほとんど常に勝ちます。
14年

1
@Trimstyチャレンジが最初に上がったとき、植物のコードは表示されませんでした。コーディングフェーズ全体を通して、他の答えを見ることができませんでした。非常に明白な貪欲な戦略を選択することにより、純粋に偶然に重複が発生した可能性があります。
ジオビット

2
@justhalf繰り返しの囚人のジレンマの戦略に関する研究を実際に読んだことがあるなら、あなたが言っていることが間違っていることを知っているでしょう。Wikipediaの記事は、開始するには良い場所です。
ジョーZ.

回答:


3

レギュラー

私はトーナメントのために選択した、このエントリのバージョン(SHA-256は:ggeo+G2psAnLAevepmUlGIX6uqD0MbD1aQxkcys64oc=)を使用していますジョーイの「ランダム吸盤最後のコンテストで2位になった(マイナー、おそらく些細な変更とはいえ)」戦略を、。残念ながら、新しい、より効果的なバージョンは、期限が重大なバグになる3分25秒前に送信されたため、使用できませんでした。それにもかかわらず、このバージョンはまだ比較的うまくいく。

<?php

$secretKey = '95CFE71F76CF4CD2';
$hashOutput = '';
$hashSeq = 0;
$hashIndex = 64;

function psRand($min = null, $max = null) {
    global $secretKey, $state, $hashOutput, $hashSeq, $hashIndex;
    if ($hashIndex > 56) {
        $hashOutput = hash_hmac('sha256', ++$hashSeq . ' ' . $state['rand'], $secretKey);
        $hashIndex = 0;
    }

    $num = (int)(hexdec(substr($hashOutput, $hashIndex, 8)) / 2);
    $hashIndex += 8;

    return $min === null ? $num : (int)($min + $num * ($max - $min + 1) / 2147483648);
}

$line = fgets(STDIN);
sscanf($line, "%d %d %d", $numPlayers, $myPlayerId, $roundsPlayed);
$roundsCount = 25 * $numPlayers;
$roundsRemaining = $roundsCount - $roundsPlayed - 1;

$betrayalCount = array_fill(1, $numPlayers, 0);
for ($round = 0; $round < $roundsPlayed; ++$round) {
    $line = fgets(STDIN);
    preg_match_all('/\((\d+), (\d+)\)/', $line, $matches, PREG_SET_ORDER);
    foreach ($matches as $m) {
        $defector = (int)$m[1];
        $victim = (int)$m[2];
        if ($victim === $myPlayerId) {
            ++$betrayalCount[$defector];
        }
    }
}

$hashOutput = rtrim(fgets(STDIN), "\n");
$state = unserialize(rtrim(fgets(STDIN), "\n"));
if (!$state) {
    $state = ['rand' => ''];
}

$state['rand'] = hash_hmac('sha256', $state['rand'] . $line, $secretKey);
$victims = [];

if ($roundsPlayed > 1) {
    for ($other = 1; $other <= $numPlayers; ++$other) {
        if ( $other === $myPlayerId) {
            continue;
        }

        if ($betrayalCount[$other] > 7 || psRand() % 1024 < 32 || !$roundsRemaining ) {
            $victims[] = $other;
        }
    }
}

echo implode(' ', $victims), "\n", serialize($state), "\n";

バグのあるバージョンのSHA-256ハッシュは2hNVloFt9W7/uA5aQXg+naG9o6WNmrZzRf9VsQNTMwo=次のとおりです。

<?php

$secretKey = '95CFE71F76CF4CD2';
$hashOutput = '';
$hashSeq = 0;
$hashIndex = 64;

function psRand($min = null, $max = null) {
    global $secretKey, $state, $hashOutput, $hashSeq, $hashIndex;
    if ($hashIndex > 56) {
        $hashOutput = hash_hmac('sha256', ++$hashSeq . ' ' . $state['rand'], $secretKey);
        $hashIndex = 0;
    }

    $num = (int)(hexdec(substr($hashOutput, $hashIndex, 8)) / 2);
    $hashIndex += 8;

    return $min === null ? $num : (int)($min + $num * ($max - $min + 1) / 2147483648);
}

$line = fgets(STDIN);
sscanf($line, "%d %d %d", $numPlayers, $myPlayerId, $roundsPlayed);
$roundsCount = 25 * $numPlayers;
$roundsRemaining = $roundsCount - $roundsPlayed - 1;

$betrayalCount = array_fill(1, $numPlayers, 0);
$scoreWindow = array_fill(1, $numPlayers, array_fill(1, $numPlayers, 0));
$lastMove = array_fill(1, $numPlayers, array_fill(1, $numPlayers, false));
for ($round = 0; $round < $roundsPlayed; ++$round) {
    $line = fgets(STDIN);
    preg_match_all('/\((\d+), (\d+)\)/', $line, $matches, PREG_SET_ORDER);
    foreach ($matches as $m) {
        $defector = (int)$m[1];
        $victim = (int)$m[2];
        if ($victim === $myPlayerId) {
            ++$betrayalCount[$defector];
        }
TAB>TAB>if ($round >= $roundsPlayed - 10) {
TAB>TAB>TAB>$scoreWindow[$defector][$victim] -= 2;
TAB>TAB>TAB>$scoreWindow[$victim][$defector] += 1;
TAB>TAB>}
TAB>TAB>if ($round === $roundsPlayed - 1) {
TAB>TAB>TAB>$lastMove[$defector][$victim] = true;
TAB>TAB>}
    }
}

$line .= fgets(STDIN);
$state = unserialize(rtrim(fgets(STDIN), "\n"));
if (!$state) {
    $state = ['rand' => '', 'copying' => array_fill(1, $numPlayers, 0)];
}

$state['rand'] = hash_hmac('sha256', $state['rand'] . $line, $secretKey);
$victims = [];

if ($roundsPlayed > 1) {
    for ($other = 1; $other <= $numPlayers; ++$other) {
        if ($other === $myPlayerId) {
            continue;
        }

TAB>TAB>if ($roundsPlayed >= 10) {
TAB>TAB>TAB>$myScore = $scoreWindow[$other][$myPlayerId];
TAB>TAB>TAB>foreach ($scoreWindow[$other] as $betterPlayer => $betterScore) {
TAB>TAB>TAB>TAB>if ($betterScore >= 0.5 * $myScore && !psRand(0, $betterPlayer)) {
TAB>TAB>TAB>TAB>TAB>$state['copying'][$other] = $betterPlayer;
TAB>TAB>TAB>TAB>}
TAB>TAB>TAB>}
TAB>TAB>}

TAB>TAB>if ($state['copying'][$other]) {
TAB>TAB>TAB>if ($lastMove[$state['copying'][$other]][$other]) {
TAB>TAB>TAB>TAB>$victims[] = $other;
TAB>TAB>TAB>}
        } elseif ($betrayalCount[$other] > 7 || psRand() % 1024 < 32 || !$roundsRemaining ) {
            $victims[] = $other;
        }
    }
}

echo implode(' ', $victims), "\n", serialize($state), "\n";

修正するには、次の置換を行います。

  • 元に戻し$hashOutput = rtrim(fgets(STDIN), "\n");$line .= fgets(STDIN);(それは本当に重要ではないということ)。
  • 交換するif ($betterScore >= 3 * $myScore) {if ($betterScore >= 0.5 * $myScore && !psRand(0, $betterPlayer)) {(これは、それを殺したものです)。

1
締め切りの3分25秒前。私が感銘を受けた。
ジョーZ.

わかりやすいお知らせ:コーディングフェーズが終了しました。ソースコードを投稿する日があります。(手順は質問の下部にあります。)
ジョーZ.

古いバージョンを使用するか新しいバージョンを使用するかに関係なく、プログラムが最初に出てきます。おめでとう!
ジョーZ.

2

1%

b61189399ae9494b333df8a71e36039f64f1d2932b838d354c688593d8f09477

彼が彼の下にあると考える囚人を見下ろします。


単に自分以下のポイントを持っている全員から取得します。仮定は、それらの囚人が見返りに取る可能性が低い(または、より多く持っている)ことです。それがどれだけ良い仮定かはわかりませんが、それが彼が取り組んでいるものです。

また、最後のラウンドでから取ります。誰もその後復re盗むことができないので、文字通りこれには欠点はありません。

貼り付けたコードのタブ/スペースが原因でハッシュを取得できない場合は、ファイルへのリンクをご覧ください。

import java.io.BufferedReader;
import java.io.InputStreamReader;

class OnePercent {

    static int numPlayers;
    static int me;
    static int turn;
    static int[] values;

    public static void main(String[] args) {
        if(!readInput())
            return;
        String out = "";
        for(int i=1;i<values.length;i++){
            if(i != me && (values[i] <= values[me] || turn > (numPlayers*25-2)))
                out += i + " ";
        }
        out.trim();
        System.out.print(out);
    }

    static boolean readInput(){
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String line = reader.readLine();
            if(line == null)
                return false;
            String[] tokens = line.split(" ");
            if(tokens.length < 3)
                return false;
            numPlayers = Integer.valueOf(tokens[0]);
            me = Integer.valueOf(tokens[1]);
            turn = Integer.valueOf(tokens[2]);
            values = new int[numPlayers+1];
            for(int i=0;i<values.length;i++)
                values[i]=0;

            for(int i=0;i<turn;i++){
                line = reader.readLine();
                line = line.replaceAll("[)]",",");
                line = line.replaceAll("[( ]", "");
                tokens = line.split(",");
                for(int j=0;j<tokens.length-1;j+=2){
                    int thief = Integer.valueOf(tokens[j]);
                    int poor = Integer.valueOf(tokens[j+1]);
                    if(thief<1||poor<1||thief>numPlayers||poor>numPlayers)
                        continue;
                    values[thief]++;
                    values[poor] -= 2;
                }
            }
            reader.close();
        } catch(Exception e) {
            return false;
        }
        return true;
    }

}

05-09 00:00締め切りまでソリューションを改善し続けることができます。
ジョーZ.

うん。私は何か他のものを考える場合、私はします。しかし、誰もがその報奨金を主張するとは信じられません。このゲームでポジティブになることは...珍しいことです。
ジオビット14年

ええ、私は誰も実際にその恵みに達するとは期待していません。Stack Exchangeでのわずか100の評判ではなく、ゲーム理論に反した成果であり、おそらく研究の可能性(2人以上が常に協力するよりもうまくいくソリューション!想像してみてください!)
ジョーZ.

1
@JoeZ。他の人が何をするかを知っていると、確かに;)未知のエントリに対して、私は非常に信頼できる戦略を見ることはできません。外れ値は外れ値になります。
ジオビット14年

1
あなたのコードの戦略は悪意のあるものではないようであり、とにかくそれを問題にするための参加者が少なすぎるため、今回もそれを受け入れると思います。
ジョーZ.

1

ゲームに参加する植物がさらにいくつかあります。これらはより高度であり、ソースコードはコーディングフェーズが終了するまで公開されません。

質問の4つのプラントと同様に、他のすべてのプレーヤーよりも高いスコアを獲得した場合、実際の出場者が達成した最高スコアのみが勝者と見なされます。


いじめっ子

29AGVpvJmDEDI5Efe/afmMJRLaJ+TpjwVcz1GkxgYZs=

人を選ぶ。


裁判官

yjdCQ3uQ4YKe7xAKxdTFLF4d72fD4ACYpDLwkbzdISI=

不正行為者を罰します。


ルナティック

m3FsRPocekCcK6GDswgnobV2CYOxX8LquChnKxrx1Wo=

何をしているのわかりません。


患者

nd7Pt3bVpFnuvDVeHQ5T9EPTq7KjNraVzp/KGtI73Vo=

最初の一歩を踏み出すことはありません。


これらが植物だけの場合、許可しない理由はありません。彼らが勝つことができる出場者である場合、上記
ジオビット14年

私の簡潔でもそれは完全に不公平な提案だと判断し、その後、自分のエントリを持つと考えられている場合、ゲームの非常に多くの他の要素は私の制御下にあるので、私は、より多くのものを入力します。したがって、ここに入力するエントリはすべて植物になります。
ジョーZ.

私が人々が植物でさえ彼らを望んでいないと思った理由は、それはゲームの初めには利用できなかった利用可能な(そして基本戦略)基本プレイヤーのかなり急進的な変化を表すからです。しかし、植物として挿入されたプレーヤーに関係なく、ソリューションが最適になるようにコード化されるべきであるという仮定で行くなら、私もそれらを入力できると思います。
ジョーZ.

関係するプレイヤーに関係なく、エントリを「最適」にコーディングする必要があります(存在する場合)。とにかく他の回答が表示されないからです。これらが「勝つ」ことができないことを除いて、これらがプログラムに対するプログラムまたは他の回答であった場合、違いはありません。勝者が最高得点の非植物として定義されていると仮定すると、それがどのように重要なのかわかりません。私はそれらで聞かせて言う。
Geobits

1

シジュウカラ

9GkjtTDD2jrnMYg/LSs2osiVWxDDoSOgLCpWvuqVmSM=

Wrathfulに似ていますが、いくつかの(できれば)パフォーマンスを向上させる変更があります。

import sys
import re

line1 = [int(i) for i in sys.stdin.readline().split()]

players = line1[0]
pid = line1[1]
rounds = line1[2]

lines = []

if rounds == 0:
    print
elif rounds == 25 * players - 1:
    for i in range(players):
        if i+1 != pid:
            print i+1,
    print
else:
    for i in range(rounds):
        lines.append(sys.stdin.readline())
    lastline = lines[-1]
    takes = re.findall(r'\([0-9]+, [0-9]+\)', lastline)
    for take in takes:
        sides = [int(i) for i in re.findall(r'[0-9]+', take)]
        if sides[1] == pid:
            print sides[0],
    print

私のメールアドレスを入手しましたか?
ジョーZ.

@ジョー; はい; ありがとう。(必要になるかどうかは
わかり

さて、私はそれを削除したかったので知りたいだけです。
ジョーZ.

1
@luserdroog人々は、プログラム自体ではなく、プログラムのソースコードのハッシュを投稿しています。コードを書くための7日間が終了すると、テスト用に実際のプログラムを公開します。
ジョーZ.

1
ええ、それは本当です。投稿にはおそらくタイトルと、少なくともGeobitsのようなキャッチフレーズが必要です。
ジョーZ.

1

バックスタブ

Python 3

名前にもかかわらず、このボットは実際には非常に優雅です。しかし、それをオフにしないでください。

import sys, math

inp = [int(i) for i in sys.stdin.readline().split()]
inp.append([])
for i in range(inp[2]):
    inp[3].append(
        [eval(i+')') for i in sys.stdin.readline().split(')')[:-1]]
    )
inp += sys.stdin.readline()

# inp is [P, D, N, [M1, M2...], R]

dat = [[], inp[2] % 2] # average runlength take and don't per player, parity of round

lastatk = []

for i in range(inp[0]):
    dat[0].append([])
    lastatk.append(0)

for i,r in enumerate(inp[3]): # each round
    for m in r: # each move
        if m[1] == inp[1]:
            dat[0][m[0]-1].append(i) # round num they attacked
            lastatk[m[0]-1] = i # keep track of last attack

# now that we know who attacked me when, i can do some stats

nav = []
rl = []

for i in range(inp[0]):
    nav.append([[0], False])
    rl.append([[], []]) # attack, don't

for i in range(inp[2]): # each round
    for p in range(1, inp[0]+1): # each player
        if p != inp[1]: # let's not judge ourselves
            if i in dat[0][p-1]: # p attacked me in round i
                if nav[p-1][1]: # attack chain?
                    nav[p-1][0][-1] += 1
                else: # start attack chain!
                    rl[p-1][1] += [nav[p-1][0][-1]] # copy peace chain
                    nav[p-1][0].append(1)
                    nav[p-1][1] = True
            else: # peace!
                if not nav[p-1][1]: # peace chain?
                    nav[p-1][0][-1] += 1
                else: # peace to all!
                    rl[p-1][0] += [nav[p-1][0][-1]] # copy atk chain
                    nav[p-1][0].append(1)
                    nav[p-1][1] = False

print(nav)

print(inp[3])

# now, rl has runlengths for each player.

print(rl)

rl = [[sum(i[0])/len(i[0]+[0]), sum(i[1])/len(i[1]+[0])] for i in rl]

# rl now contains the averages w/ added zero.

# So, now we have average runtime and last attack. Let's quickly make some descisions.

out = []

for p in range(1, inp[0]+1): # each player
    if p != inp[1]: # again, let's not judge ourselves
        if lastatk[p-1] == inp[0]-1: # they attacked us!
            out.append(p)
        else: # whew, we can recover
            if inp[0] - lastatk[p-1] > rl[p-1][0]: # they're due to defend!
                out.append(p)
            elif int(__import__('binascii').b2a_hex(inp[-1].encode()), 16) % 4 == 0: # 1 in 4 chance of doing this
                out.append(p) # backstab!!1!!1one!!!1!!

print(*out)

編集2:投稿されたソース。わーい。

編集:いくつかのテストの後、私は見つけたいくつかの欠陥を修正しました。それらはアルゴリズムではなく、入力を読み取る際のいくつかの問題です。


わかりやすいお知らせ:コーディングフェーズが終了しました。ソースコードを投稿する日があります。(手順は質問の一番下にあります。)
ジョーZ.

@JoeZ。投稿しました。間に合うことを願っています。:P
cjfaure

P、D、N、Rは、車がシフトできるドライブのように聞こえます。
ジョーZ.

1
@JoeZ。xD彼らはあなたの投稿からです; 3
cjfaure

ああ、私の悪い。ごめんなさい:S
ジョーZ.

1

Begrudger

g1TXBu2EfVz/uM/RS24VeJuYMKLOaRatLxsA+DN1Mto=

コード

私はこれに多くの時間を費やしなかったことを認めます...

import sys
p, d, n, o = input().split(' ') + ['']
p, d, n = int(p), int(d), int(n)
for i in range(n):
    r = input()
    r = r[1:len(r)-1].split(') (')
    for a in r:
        if int(a.split(', ')[1]) == d and not a.split(', ')[0] in o:
            o += a.split(', ')[0] + " "

input()
print(o)

わかりやすいお知らせ:コーディングフェーズが終了しました。ソースコードを投稿する日があります。(手順は質問の一番下にあります。)
ジョーZ.

私はこれを実行しようとしましたが、次のバグに遭遇しました:o += a.split(', ')[0]数字の間にスペースを残しません。
プリーズスタンド

@PleaseStand私はそれを修正しましたが、競争が終わったので、テストされたバージョンはバグで終わると思います。
kitcar2000 14年

ええ、あなたのコードは私がそれを実行するたびにバグを生成しました。それを修正する方法がわかりませんでした。ただし、The Lazyよりもわずかに優れていました。
ジョーZ.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.