リーダーボード
154 Calculator
144 Taxman
138 Statistician
137 Solver
137 RandoAggroLawyer
136 Gambler
134 Turncoat
119 Lawyer
119 BloodyMurder
113 Bandit
79 Challenger
74 Mask
64 Random
ログおよびすべての出力ファイルを含む最新の一致のアーカイブが利用可能です。
Brilliandの電卓が勝者です!彼の答えは受け入れられますが、それは挑戦が終わったという意味ではありません。新しいエントリを送信するか、現在のエントリを編集して、彼の王位をノックアウトしてみてください。月末にリーダーに賞金を授与します。
遊びのルール
クーデターは2〜6人のプレイヤー向けに設計されたカードゲームで、2人でプレイします。それは、コインの宝庫(私たちの目的では無限です)と15枚のカードのデッキで構成され、次の各タイプを3枚含んでいます:大使、暗殺者、キャプテン、コンテッサ、デューク。ゲームの開始時に、各プレイヤーにはコインが1枚与えられ、ランダムに2枚のカードが配られます。オブジェクトはあなたの手にカードを持つ最後のプレイヤーになることです。
ターンでは、プレイヤーはカードに関係なく次のいずれかのアクションを実行できます。
- 収入:財務省からコインを1枚受け取ります。ブロックできず、変更不可能。
- 対外援助:国庫から2枚のコインを受け取ります。デュークを持つプレイヤーによってブロックすることができます。挑戦できない。
- クーデター:選択した対戦相手のカードを1枚プレイから取り除きます。コストは7コイン。被害者は、破棄するカードを選択できます。プレイヤーが自分のターンの開始時に10個以上のコインを持っている場合、彼らはクーデターをしなければなりません。ブロックできず、変更不可能。
カードに応じて、プレイヤーは次のいずれかのアクションを自分のターンとして実行することもできます。
- 交換:アンバサダーを持つプレイヤーは、デッキから2枚のカードを取ることができます。その後、彼らは自分の手札と描かれたカードから、元々持っていた数のカードを選ぶことができます。(つまり、カードが1枚しかない場合は、描かれたカードの1つと交換または保管できます。2枚のカードがある場合は、4枚のカードのうち2枚を選択できます。)2枚の不要なカードをデッキに戻します。ブロックできませんが、挑戦的です。
- 暗殺:暗殺者を持つプレイヤーは、ゲームから対戦相手のカードを取り除くために3コインを使うことができます。被害者は、破棄するカードを選択できます。コンテッサを持つプレイヤーによってブロックされる可能性があります。その場合、コインは返却されません。チャレンジ可能、その場合、コインは返却されます。
- 盗む:キャプテンを持つプレイヤーは、相手からコインを2枚取ることができます。相手がコインを1枚持っている場合、そのコインを1枚取ります。相手のコインがゼロの場合、彼らは盗むことはできません。アンバサダーまたはキャプテンを持つプレイヤーがブロックできます。挑戦的。
- 税金:公爵を持つプレイヤーは、財務省から3枚のコインを受け取ることができます。ブロックできませんが、挑戦的です。
クーデターのトリッキーな部分は、プレーヤーが持っているカードについて嘘をつくことを許可されていることです!アクションを実行したり、それに関連付けられたブロックを試みるためにカードを用意する必要はありません。
プレーヤーがカードのアクションを実行すると、対戦相手(そのアクションによって害を受けていない相手も含む)は、俳優に挑戦し、そのアクションのカードを持っているとは思わないと言います。チャレンジャーが正しければ、アクションはキャンセルされ、アクターは選択したカードを1枚捨てる必要があります(該当する場合、消費したコインを取り戻します)。そうでない場合、アクションが実行され、アクターはチャレンジされたカードをデッキに戻し、新しいカードを引きます。チャレンジャーはカードの1つを捨てなければなりません。プレイヤーは、チャレンジしたときにどのカードを持っているかについて正直でなければなりません。
暗殺、クーデター、ロストチャレンジでプレイから除外されたカードはデッキに戻されませんが、勝ったチャレンジの一部として公開されたカードはデッキに戻されます。
ブロックはアクションと同じようにチャレンジされます。たとえば、プレーヤーAが外国援助を主張し、プレーヤーBが「私は公爵を持っているのにあなたの外国援助をブロックしている」と言った場合、Aは「あなたが公爵を持っているとは思わない」と言うかもしれません。その主張が正しい場合、Bは嘘をつかんだためにカードを失い、Aは2枚のコインを受け取ります。そうでない場合、Aはカードを失い、コインを受け取らず、Bはデュークをデッキに戻して新しいカードを引く必要があります。
Assassinateでのブロックとチャレンジの仕組みを具体化する必要があります。プレイヤーAが「私には暗殺者がいて、プレイヤーBを暗殺する」と言ったとします。BがAに挑戦したりブロックしたりしない場合、暗殺が行われます。Bはカードを失い、Aは3枚のコインを支払います。
あるいは、Bは「あなたが暗殺者を持っているとは思わない」と言って挑戦することができます。そうであれば、Aはカードを捨ててコインを返し、Bは影響を受けず、Aのターンは終了します。Bの信念が正しくなく、Aが暗殺者を保持している場合、Bは両方のカードを失い、失敗します。1つは不正なチャレンジで、もう1つは暗殺からです。
挑戦する代わりに、Bは「コンテッサがあり、暗殺者をブロックする」と言うことができます。AがBを信じている場合、Aのターンは終了し、コインは返却されません。しかし、Aはブロックに挑戦して「コンテッサを持っているとは思わない」と言うことができます。Bが実際にコンテッサを保持している場合、Aは不正なチャレンジのカードを失います。しかし、Bがそうしなかった場合、Bは1枚のカードを嘘に巻き込まれ、もう1枚を暗殺から失います。
上記の説明と同様のロジックは、キャプテンのスティール能力に適用され、アクションまたはブロックのいずれかにチャレンジすることができます。
暗殺に挑戦することに失敗した場合、または暗殺を阻止するためのコンテッサを持っていると誤って主張した場合、1ターンで両方のカードを失い、排除することができます。チャレンジから1枚のカードと暗殺から1枚のカードを失います。
チャレンジ
あなたの仕事は、クーデターをプレイするプログラムを書くことです。コマンドライン引数として与えられます:
- これまでのファイルとその対戦者のアクションのリストを含むファイルの名前。
- 相手のコイン数を示す0〜12の整数。
- コイン数を示す0〜12の整数。
- カードを示す1〜4文字の文字列。通常、これはプログラムにある1枚または2枚のカードですが、プログラムがExchangeで成功した場合、n + 2文字の長さになります。nは残りのカードの数です。その後、プログラムは保持したいn枚のカードをSTDOUTに出力する必要があります。(プログラムは、この目的以外でSTDOUTを読み取ったりアクセスしたりしてはいけません。デバッグ出力を生成したい場合は、STDERRに書き込んでください。)
- 法的な動きを示す1つ以上の引数。
(呼び出し例:yourprogram file.txt 1 7 '~!' a c p q
、「あなたの対戦相手は1枚のコインを持っています。あなたは7枚のコイン、大使、コンテッサを持っています。ゲーム履歴と現在のゲームの状態を考慮してfile.txtにa、c、p、q ")
プログラムは、提供されたファイルにアクションを示す1文字または(2つの特定の状況で)2文字を追加する必要があります。ファイルの既存の内容を変更しないでください。希望する新しいファイルが作成される場合がありますが、実行されるディレクトリ内でのみ作成されます。プログラムをコンパイルして実行するために必要なすべてのコマンドを提供してください。
以下にGoで書かれた2つの競合例を示します。
出力形式は次のとおりです。
I\n
:収入。法的応答:任意のターンアクション(暗殺者/クーデター用のコインがあると仮定)。F
:対外援助。法的応答:(d
公爵としてブロックする)、p
(許可する)。C
:クーデター。法的回答:どちらかの_
、'
、<
、=
、0
あなたの手の中にあります。E
: 両替。法的応答:q
(チャレンジ、プレーヤーを信じないで大使を持っています)、p
。T
:税。法的応答:q
(チャレンジ、プレーヤーを信じないでデュークを持っています)、p
。A
:暗殺。法的応答:s
(コンテッサとしてブロック)、q
(挑戦)、およびいずれかの_
、'
、<
、=
、0
あなたの手の中にあります。S
:盗む。法的応答:a
(大使としてブロック)、c
(キャプテンとしてブロック)、q
(挑戦、プレーヤーを信じないでキャプテンを持っています)、p
。d
:デュークとしての外国援助をブロックします。法的応答:(\n
ブロックを受け入れます)、q
(チャレンジ、プレイヤーがデュークを持っているとは思わない)。a
:アンバサダーとしてスチールをブロックします。法的応答:(\n
ブロックを受け入れます)、q
(チャレンジ、プレーヤーに大使がいるとは思わない)。c
:キャプテンとしてスチールをブロックします。\n
(ブロックを受け入れる)、q
(チャレンジ、プレイヤーがキャプテンを持っているとは信じない)。s
:暗殺者をコンテッサとしてブロックします。法的応答:(\n
ブロックを受け入れます)、q
(チャレンジ、プレイヤーがコンテッサを持っていると信じない)。p
:自分の番ではないときに、Exchange / Tax / Stealに挑戦する。使用されませんA
。暗殺に挑戦することを辞退するために1つ書いてください_'<=0
。法的応答:(\n
あなたのターンを終了します)、そしてあなたがExchangeでちょうど成功した場合、STDOUTに4番目のコマンドライン引数から保持したいカードを書きます。q
:最新のアクションまたはブロックに挑戦します。法的対応:異議申し立てが行われたアクションのカードをお持ちの場合は、どちらでも構いません~^*!$
。そうでない場合は、_'<=0
あなたの手のうち、あきらめたい方のいずれか、そしてあなたの番である場合にのみ改行が続きます。~
、^
、*
、!
、$
:あなたは、それぞれ、保持についての真実を語ったことを明らかにし、大使、アサシン、キャプテン、コンテッサ、およびデュークは(また、コマンドライン引数でこれらのカードを表すために使用される、およびExchange内のSTDOUT出力)。法的応答:のいずれか_
、'
、<
、=
、0
あなたが手に持っています。_
、'
、<
、=
、0
:あなたが挑戦を失ったか、Couped /暗殺されたため、それぞれ、罰として大使、そして暗殺者、キャプテン、コンテッサ、およびデュークをあきらめます。法的応答:\n
。\n
:該当する場合、ブロックに挑戦することを拒否して、あなたのターンを終了します。法的応答:大文字のアクション(暗殺/クーペのコインがあり、相手がスチールのコインを持っていると仮定)。
この形式には、次の有用なプロパティがあります。
- ターンは大文字で始まります。
- 行はパターンに従います:大文字、小文字、オプションで句読点、または公開されたカードの場合は0、改行。
- 改行で終わるファイル、または空のファイルは、それがプログラムの順番の始まりであり、大文字のアクションを選択する必要があることを示します。
- 通常、呼び出しで許可される法的措置は、ファイルの最後の文字によって一意に決定されます。例外はで
q
、それに関連付けられたロジックがあります。get_legal_actions
これを理解するには、アービターの関数を参照してください。または、コマンドラインで指定された法的措置を使用することもできます。 - 行の偶数の文字は、ターンがあなたのものであり、プログラムがアクションの選択、ブロックへの挑戦、またはターンの終了を要求されていることを示します。
- 行の奇数の文字は、ターンがあなたのものではないことを示し、プログラムはカードをブロック、チャレンジ、または公開/放棄するように求められます。
すべてのアクションの例を示します。
I\n
理解するのが最も簡単です。プログラムは収入1コインを受け取り、ターンを終了します。これは、収入が唯一のアクションであるため、プログラムは2つのキャラクターを印刷する必要がある2つのケースのうちの1つです。
Fp\n
は、1つのプログラムが外国援助を受け取り、その後、相手がブロックを拒否したことを意味します(p
)。次の呼び出しで、最初のプログラムは、p
この行の最後の小文字および/または偶数文字でこのターンを取りましたが、まだ終了していないため、改行を印刷して現在のターンを終了することを知っています。
C=\n
1つのプログラムがクーデターを開始したことを意味します。相手は、ライン上の奇数の文字で反応するように呼ばれていることを知って、コンテッサをあきらめました。繰り返しますが、最初のプログラムは、行の偶数の文字による次の呼び出しでのこれが不完全なターンであることを知っていたため、ターンを終了するために改行を書きました。
Eq~<\n
1つのプログラムがExchangeを試行し(E
)、相手がチャレンジ(q
)したことを意味します。交換プログラムは、大使(~
)とチャレンジャーが罰としてキャプテンをあきらめた()を誠実に持っていることを明らかにしました<
。チャレンジャーが終了すると、4番目のコマンドライン引数として4文字の文字列(またはカードが1つしかない場合は3文字)で交換プログラムが再度呼び出されます。STDOUTに保持したいカードを表す文字と、ファイルに改行を書き込みます。
Tq'\n
は、あるプログラムが不正な税を試み、挑戦され、暗殺者をあきらめたことを意味します。それは2人のキャラクターが書かれている他のケースを示しています:あなたの順番であり、あなたがカードを放棄することを強制された場合-相手の正しいチャレンジ(ここのように)または間違ったブロックのチャレンジから-あなたは両方を書く必要がありますあなたが放棄したカードとあなたのターンを終了する改行。
Asq!'\n
プレーヤーBはプレーヤーAを暗殺しようA
としたが、Aはそれをブロックするコンテッサを持っていると主張したことを意味します(s
)。BはAを信じず、挑戦しました(q
)。Aが実際にコンテッサ(!
)を持っていることが明らかになりました。Bはアサシンを罰としてあきらめ、コインを失い、ターン('\n
)を終了し、その特別な場合のように2つのキャラクターを書きました。(Aがブロックまたはチャレンジしないことを決定した場合、Aは書かれていたかもしれませんが=
、相手はターンが終わったことを確認し、改行を書きました。その行はA=\n
クーデターの例のように読まれました。)
Sq*0\n
1つのプログラムがスチールを試みることを意味します。対戦相手は、泥棒がキャプテンを持っているとは信じずに挑戦します。元のプログラムではキャプテンが明らかになるため、チャレンジは失敗し、チャレンジャーはデュークを罰として放棄します。(対戦相手の別の選択肢は、書き込みによってスチールを受け入れることp
です。その後、対戦相手はターンの終わりを検出して書き込み\n
、結果としての行になりSp\n
ます。)
アービター
このPythonスクリプトによってプログラムが呼び出されます。10ラウンドを実施します。このラウンドでは、すべての競技者が1番目と2番目の両方で他のすべての競技者と対戦します。カードとコイン数を追跡し、最初のプログラムで敗者を特定し、句読点で2回行を終了します。ゼロ以外のステータスで終了するプログラム、ファイルを変更する、ファイルに不正な移動を書き込む、または不正なExchangeを試みるプログラムは自動的に没収されます。各プレイヤーがブロックやチャレンジを含む100を超えるアクションを実行し、勝者がいない場合、両方のプログラムが負けます。勝者には1ポイントが付与されます。最も多くのポイントを獲得したプログラムのプレイヤーが勝ちます。
アービターのソースコード、特にget_legal_actions
関数を読むことをお勧めします。仕様を理解し、独自のプログラムを作成するのに役立ちます。
import itertools
import os
import random
import subprocess
class Player:
def __init__(self, name, command):
self.name = name
self.command = command
self.score = 0
self.coins = 1
self.cards = ""
actions_dict = {
'E': '_', 'T': '0', 'A': "'", 'S': '<',
'd': '0', 'a': '_', 'c': '<', 's': '='
}
punishment_to_reveal = {'_': '~', "'": '^', '<': '*', '=': '!', '0': '$'}
reveal_to_punishment = {
punishment_to_reveal[k]: k for k in punishment_to_reveal
}
def get_legal_actions(history, player, opponent):
c = history[-1]
result = ""
# Our turn begins; choose an action.
if c == '\n':
if player.coins >= 10:
return ["C"]
ret = ['I\n'] + list("FET")
if player.coins >= 3:
ret.append("A")
if player.coins >= 7:
ret.append('C')
if opponent.coins > 0:
ret.append("S")
return ret
# Opponent attempted foreign aid; can pass or claim Duke to block.
elif c == 'F':
return list('dp')
# We have been Couped; must surrender a card.
elif c == 'C':
return player.cards
# We failed a challenge; must surrender a card and print a newline
# if it is our turn.
elif c in '~^*!$':
if history[-3] in 'acds':
return [card + '\n' for card in player.cards]
return player.cards
# Opponent attempted Exchange or Tax; can pass or challenge.
elif c == 'E' or c == 'T':
return list('pq')
# Opponent attempted an Assassination; can block, challenge, or give in.
elif c == 'A':
return list('sq') + player.cards
# Opponent attempted to Steal; can pass, block as Ambassador/Captain,
# or challenge.
elif c == 'S':
return list('acpq')
# Opponent blocked; can challenge or withdraw.
elif c in 'acds':
return list('q\n')
# Opponent passed on blocking Foreign Aid/Tax/Exchange or they gave up a
# card as punishment, must end turn.
elif c in "p_'<=0":
return ['\n']
# Opponent challenged us.
elif c == 'q':
challenged_action = history[-2]
# If we have the card they challenged us over, must reveal it.
necessary_card = actions_dict[challenged_action]
if necessary_card in player.cards:
return [punishment_to_reveal[necessary_card]]
# Otherwise, we can give up either of our cards, writing a newline
# if it is our turn.
if challenged_action in 'acds':
return list(player.cards)
else:
return [card + '\n' for card in player.cards]
else:
return None
deck = ['_', "'", '<', '=', '0'] * 3
random.shuffle(deck)
def determine_turn_effects(line, output, cards, current_player, opponent):
last_action = line[-2]
# Only operate if the opponent declined to challenge (p) or the
# program successfully challenged their block
if last_action in "p_'<=0":
primary_action = line[0]
# Foreign Aid
if primary_action == 'F':
print current_player.name, "received 2 coins of Foreign Aid"
current_player.coins += 2
# Tax
elif primary_action == 'T':
print current_player.name, "received 3 coins of Tax"
current_player.coins += 3
# Steal
elif primary_action == 'S':
stolen_coins = 1 if opponent.coins == 1 else 2
print current_player.name,\
"stole %d coins from %s" % (stolen_coins, opponent.name)
current_player.coins += stolen_coins
opponent.coins -= stolen_coins
# Exchange, store desired cards and replace undesired ones
elif primary_action == 'E':
print current_player.name, "tried to take %r" % output, "from", cards
legal_outputs = [''.join(p) for p in itertools.permutations(
cards, len(current_player.cards))]
if output not in legal_outputs:
print current_player.name, "forfeits by illegal exchange"
return opponent
current_player.cards = [
reveal_to_punishment[c] for c in output
]
undesired_cards = list(cards)
for c in output:
undesired_cards.remove(c)
for card in undesired_cards:
deck.append(reveal_to_punishment[card])
random.shuffle(deck)
# Coins are not returned from a successful Contessa block
elif last_action == 's':
print current_player.name, "lost 3 coins from a Contessa block"
current_player.coins -= 3
return None
def play_game(player1, player2, round_number, game_number):
outfilename = os.path.abspath(__file__)[:-len(__file__)] + '_'.join([
player1.name, player2.name, str(round_number), str(game_number)
]) + '.txt'
print outfilename
f = open(outfilename, 'w')
f.close()
players_list = [player1, player2]
player1.cards = [deck.pop(), deck.pop()]
player2.cards = [deck.pop(), deck.pop()]
current_player_index = 0
for i in range(200):
current_player = players_list[current_player_index]
opponent = players_list[(current_player_index+1) % 2]
legal_actions = []
original_contents = []
original_contents_joined = ""
with open(outfilename, 'r') as outfile:
original_contents = outfile.readlines()
original_contents_joined = ''.join(original_contents)
if len(original_contents) == 0:
legal_actions = ['I\n'] + list("FEST")
else:
legal_actions = get_legal_actions(
original_contents[-1], current_player, opponent)
if not legal_actions:
print "Error: file ended in invalid character"
return current_player
# Has the player completed an Exchange? Pass them new cards if so.
exchange_cards = ""
old_last_line = original_contents[-1] if len(original_contents) > 0 else '\n'
if old_last_line[-1] != '\n' and old_last_line[0] == 'E' and \
len(old_last_line) % 2 == 0 and old_last_line[-1] in "p_'<=0":
exchange_cards = punishment_to_reveal[deck.pop()] + \
punishment_to_reveal[deck.pop()]
cards = exchange_cards + ''.join(
punishment_to_reveal[card] for card in current_player.cards)
args = current_player.command + [
outfilename,
str(opponent.coins),
str(current_player.coins),
cards
] + legal_actions
print ' '.join(args)
output = ""
os.chdir(current_player.name)
try:
output = subprocess.check_output(args)
# Competitors that fail to execute must forfeit
except subprocess.CalledProcessError:
print current_player.name, "forfeits by non-zero exit status"
return opponent
finally:
os.chdir('..')
new_contents = []
new_contents_joined = ""
with open(outfilename, 'r') as outfile:
new_contents = outfile.readlines()
new_contents_joined = ''.join(new_contents)
if original_contents_joined != new_contents_joined[:-2] and \
original_contents_joined != new_contents_joined[:-1]:
print current_player.name, "forfeits by modifying the file"
print "old:", original_contents
print "new:", new_contents
return opponent
new_last_line = new_contents[-1]
the_move_made = ""
for action in legal_actions:
if new_last_line.endswith(action):
the_move_made = action
break
# Competitors that make an illegal move must forfeit
if not the_move_made:
print current_player.name, "forfeits with an illegal move,",\
"last line: %r" % new_last_line
print opponent.name, "wins!"
return opponent
print current_player.name, "played %r" % the_move_made
# Side effects of moves.
#
# Income, give the current player a coin.
if the_move_made == "I\n":
print current_player.name, "received 1 coin of income"
current_player.coins += 1
# The program surrendered a card on its turn; take it away.
elif len(the_move_made) == 2:
print current_player.name, "lost a card from being challenged"
current_player.cards.remove(the_move_made[0])
# Coins are not returned from a successful Contessa block
if new_last_line[-3] == '!':
print current_player.name, "lost 3 coins from a Contessa block"
current_player.coins -= 3
# The program surrendered a card when it was not its turn.
elif the_move_made in "_'<=0":
print current_player.name, "gave up a", the_move_made
current_player.cards.remove(the_move_made)
if new_last_line[0] == 'C':
opponent.coins -= 7
elif new_last_line[0] == 'A':
opponent.coins -= 3
# Did the program unsuccessfully challenge an Assassination
# (e.g. Aq^0\n)
# or get caught falsely blocking with a Contessa
# (e.g. Asq0\n)?
# If yes, it loses right away.
if new_last_line[0] == 'A' and new_last_line[1] in 'qs' and \
len(new_last_line) == 4:
print current_player.name, "lost both cards in the same turn."
print opponent.name, "wins!"
return opponent
elif the_move_made == 'S':
print current_player.name, "attempted Steal"
elif the_move_made == 'T':
print current_player.name, "attempted Tax"
elif the_move_made == 'A':
print current_player.name, "attempted Assassinate"
elif the_move_made == 'C':
print current_player.name, "launched a Coup"
elif the_move_made == 'F':
print current_player.name, "attempted Foreign Aid"
elif the_move_made == 'E':
print current_player.name, "attempted Exchange"
elif the_move_made == 'q':
print current_player.name, "challenged"
elif the_move_made == 'p':
print current_player.name, "passed"
elif the_move_made == 'a':
print current_player.name, "blocked with an Ambassador"
elif the_move_made == 'c':
print current_player.name, "blocked with a Captain"
elif the_move_made == 's':
print current_player.name, "blocked with a Contessa"
elif the_move_made == 'd':
print current_player.name, "blocked with a Duke"
# The program revealed a card from an opponent's unsuccessful challenge.
# Give it a new card.
# Special case: a program whose Exchange is unsuccessfully challenged
# may keep the Ambassador it revealed in the Exchange, so give a new
# card for a revealed Ambassador only if it was used to block a Steal.
elif the_move_made in '^*!$' or (the_move_made == '~' and
new_last_line[0] == 'S'):
p = reveal_to_punishment[the_move_made]
current_player.cards.remove(p)
current_player.cards.append(deck.pop())
deck.append(p)
random.shuffle(deck)
print current_player.name, "did have a", the_move_made
# The program ended its turn. We must examine the rest of the line to
# determine the side effects.
elif the_move_made == '\n':
potential_winner = determine_turn_effects(
new_last_line, output.strip(), cards, current_player,
opponent)
if potential_winner:
print potential_winner.name,\
"wins because their opponent made an illegal exchange!"
return potential_winner
# One player has lost all their cards. Victory for the opponent!
if current_player.cards == []:
print opponent.name, "wins by eliminating both opponent cards!"
return opponent
current_player_index += 1
current_player_index %= 2
return None
competitors = []
competitors.append(Player("Challenger", ["./challenger"]))
competitors.append(Player("Random", ["./random"]))
# ...More competitors here
for i in range(10):
print "-- Round", i
j = 0
for pairing in itertools.permutations(competitors, 2):
player1, player2 = pairing
print '--- Game', j, ':', player1.name, 'vs.', player2.name
winner = play_game(player1, player2, i, j)
if not winner:
j += 1
continue
winner.score += 1
player1.coins = 1
player1.cards = ""
player2.coins = 1
player2.cards = ""
deck = ['_', "'", '<', '=', '0'] * 3
random.shuffle(deck)
j += 1
competitors.sort(reverse=True, key=lambda player: player.score)
for player in competitors:
print '%5d %s' % (player.score, player.name)
その他
あるプログラムは別のプログラムに固有のコードを持つことはできず、プログラムは互いに助け合うことはできません。(複数のプログラムが存在する場合がありますが、それらは互いに相互作用することはできません。)
プログラムが同じターンに両方のカードを失った場合、1枚だけを書く必要があります。アービターは、それが除去されたことを検出します。
プログラムがファイル内のゲームの履歴を調べることは可能であり、奨励されていますが、必須ではありません。そうすることで、彼らは相手が持っていると主張しているカードを特定し、それらを嘘に捕らえることができます。
クーデターの実際のゲームでは、アクションに挑戦し、同じターンにそれをブロックしようとすることができます。許可しても仕様を機能させることができなかったため、特定のアクションに挑戦するかブロックすることができますが、両方はできません。
以前にこれを投稿した@PeterTaylorに謝罪し、サンドボックスに投稿し、STDOUT / STDINで出力をパイプでやり取りするためにプロトコルを修正しました。私はそれを試してみましたが、その仕事をするのに一生懸命で、その仕事に一日を費やしました(元の課題を書くのに一日中過ごしていたとき)。しかし、取引所はそのように実装するのが非常に複雑であることに加えて、自分のコイン数を追跡することを要求することで提出の複雑さを増すでしょう。だから、私はチャレンジを元々多かれ少なかれ投稿しました。
S
、プログラムAが書き込み、プログラムBが書き込みをブロックc
、A が書き込みを拒否し\n
ます。スティールのチャレンジは成功します:Aの書き込みS
、B の書き込みによるチャレンジq
、Aは書き込みによるチャレンジを認め_\n
ます。Exchangeへの法的対応は、合格と挑戦です。