第一次プログラミング言語宗教戦争では、CJC (Colorful Jumbo Chicken) がJavaとPHPの加護を受け法王となった。 CJCによって言語宗教戦争は終結したかのように見えた・・・が、宗教戦争の引き金となった9言語 (C++, C#, Java, JavaScript, Python, Ruby, PHP, OCaml, Haskell)に反旗を翻す言語が現れた。
懐かしのあの言語から、今をときめくあの言語がまさかの参戦! CJCに代わり第二次宗教線でプログラミング言語界を制する法王になるのは誰だ?!
自然言語よりコードをご希望の方に向けて、ルールの疑似コードを用意した。
各 プログラミング言語 の 信者数 によって決まる 勝利点 を、他の プレイヤー より多く得る。
プレイヤーは4人、プログラミング言語は6種類ある。
このゲームはターン制であり、各ターンごとに、プレイヤーたちは好きなプログラミング言語を 布教 して信者を集める。 布教の情報は一部が隠されているため、他のプレイヤーとの駆け引きが重要となる。
9ターンでゲームが終了し、プレイヤーたちはそれぞれのプログラミング言語に対する信者数に応じて勝利点を得る。 各プログラミング言語の信者数が最も多いプレイヤーはその言語に対する勝利点を得るが、信者数が最も少ないプレイヤーは勝利点を失ってしまう。 したがって、目当てのプログラミング言語を積極的に布教して他プレイヤーより多くの信者を集めつつ、 他のプログラミング言語に対する信者数にも気を使って失点を防ぐことが重要である。 勝利点を最も多く獲得したプレイヤーの勝利となる。
ゲームが開始すると、まずそれぞれのプログラミング言語に 注目度 が3から6の間でランダムに設定され、プレイヤーに公開される。 注目度が高いプログラミング言語ほど、ゲーム終了時に得られる(または失う)勝利点が多くなる。
ターンには 平日 ターンと 休日 ターンが存在する。 1ターン目は平日であり、1ターンごとに平日と休日が入れ替わる。 つまり、2ターンで一週間となる。
ターンが始まると、プレイヤーたちは一斉に布教する言語を選ぶ。 平日では1ターンで5回(5日分)布教をするが、休日では1ターンに2回(2日分)布教する。 1回の布教では1種類の言語を布教し、自分の布教した言語に対する信者数が1増える。 ただし、休日は1回の布教につき信者数が2増える。 1ターン中の布教言語の割り振りは自由である。 例えば平日であれば、バラバラの5言語を1回ずつ布教しても良いし、同じ言語を5回布教しても良い。 なお、布教言語が他のプレイヤーと同じであっても、信者数の増加に影響はない。
全プレイヤーが布教言語を選んだら、各プログラミング言語に対する信者数が計算される。 そのターンが平日の場合、誰がどの言語を布教したかが全員に公開される。 そのターンが休日の場合、各プログラミング言語について、その言語がそのターンに布教された合計回数のみ公開される。
下の表は、平日と休日の布教の特徴をまとめたものである。
平日 | 休日 | |
---|---|---|
布教回数 | 5 | 2 |
1回の布教で増える信者数 | 1 | 2 |
布教情報の公開 | 全情報公開 | 各言語に対する布教の回数のみ公開 |
なお、5ターン目の終了時に、各プレイヤーがそれまでに獲得した信者数が休日ぶんも含めて公開される。
9ターン目が終わると、ゲームが終了し、勝利点の計算に入る。
各プログラミング言語で得られる勝利点は、そのプログラミング言語に対する信者数を他のプレイヤーと比べて決められる。 そのプログラミング言語に対する信者数が全プレイヤー中で最も高い場合は、注目度と同じ点数の勝利点を得る。 逆に全プレイヤー中で最も低い場合は、注目度と同じ点数の勝利点を失う。 トップや最下位のプレイヤーが複数いる場合は、注目度をそれらのプレイヤーの人数で割った点数だけ得点あるいは失点する。
各プレイヤーの勝利点をすべてのプログラミング言語に対して計算したら、最も勝利点の高いプレイヤーを勝者とする。 最も勝利点の高いプレイヤーが複数いる場合は、そのゲームは引き分けである。
AIはゲーム開始時に実行される。
ゲームを始める準備ができたらREADY
と出力したのち、ゲームの設定を入力として受け取る。
また、ターンごとに現在の情報を入力として受け取り、そのターンでの布教言語を出力する。
AIの思考時間には制限がある。 制限時間を超過するとAIプログラムが強制的に停止され、それ以降の行動が「全日程で0番のプログラミング言語を布教する」として処理される。
ゲームを開始する準備ができたら、READY
と標準出力に出力する。
ゲーム開始から5秒以内に出力がなければ、AIプログラムが強制的に停止される。
ゲーム開始時、つまり1ターン目の初めに、ゲームの設定が以下のフォーマットで標準入力に渡される。
T P N A0 A1 A2 ... A5
- T: 全ターン数。
- P: プレイヤー数。
- N: プログラミング言語の数。
- An: プログラミング言語nの注目度。
各ターンの初めに、現在の情報が以下のフォーマットで標準入力に渡される。
T D B00 B01 B02 B03 B10 B11 B12 B13 B20 B21 B22 B23 : : B50 B51 B52 B53 R0 R1 R2 ... R5 P0 P1 P2 ... P5
- T: 現在のターン数。1から始まる。
- D: 平日の場合は"W", 休日の場合は"H"。
- Bnm: プログラミング言語nに対するプレイヤーmの公開されている(つまり平日の情報のみでわかる)信者数。このAIプレイヤー自身はプレイヤー0である。6ターン目以降は、5ターン目以前の休日の布教ぶんも含めた信者数となる。
- Rn: プログラミング言語nに対するこのAIプレイヤーの真の(つまり休日も合わせた)信者数。
- Pn: プログラミング言語nが前日の休日に布教をされた回数。
P0 P1 P2 ... P5の行は、平日のターンでのみ含まれる。
そのターンでの布教言語は、以下のフォーマットで標準出力に出力する。
-
平日の場合
L0 L1 L2 L3 HL
-
休日の場合
L0 L1
Ln: 布教するプログラミング言語の番号(0から5で指定)。L0からL4の順番は関係しない。
一度行動を出力すると、そのAIのターンは終了となる。 なお、ターン開始から1秒以内に出力がなければ、AIプログラムが強制的に停止される。
programming_language = (attention, revealed_believers[4], real_believers[4])
main:
init
while turn <= 9:
process_turn
turn += 1
finish
init:
players = player[4]
languages = programming_language[6] (rand(3, 6), [0, 0, 0, 0], [0, 0, 0, 0])
turn = 1
process_turn:
for l in languages:
display_to_all_players(l.attention)
display_to_all_players(l.revealed_believers)
if not is_holiday:
display_to_all_players(l.propagated)
l.propagated = 0
for p in players:
for i in [1 .. (is_holiday ? 2 : 5)]:
target = languages[p.selected[i]]
target.revealed_believers[p] += (is_holiday ? 0 : 1)
target.real_believers[p] += (is_holiday ? 2 : 1)
target.propagated += 1
if turn == 5:
for h in heroines:
h.revealed_believers = h.real_believers
is_holiday:
turn % 2 == 0
finish:
for l in languages:
best_players = players.max_by(p -> l.real_believers[p])
for p in best_players:
p.victory_points += h.attention / best_players.size
worst_players = players.min_by(p -> l.real_believers[p])
for p in worst_players:
p.victory_points -= h.attention / worst_players.size
winners = players.max_by(p -> p.victory_points)
draw if winners.size > 1