Skip to content

Commit 3b8eba8

Browse files
author
Nobuaki Tanaka
committed
本戦テスター
1 parent f079d77 commit 3b8eba8

21 files changed

+1867
-9
lines changed

final_A/tester/README.md

+55-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,56 @@
1-
第4回 RECRUIT日本橋ハーフマラソン 本戦A問題のテスター置き場です。
1+
# ハイパー覆面すごろく テスター
22

3-
コンテスト開始と同時にpushします。
3+
* これは
4+
[第4回 RECRUIT 日本橋ハーフマラソン 本戦](https://atcoder.jp/contests/rcl-contest-2020-final/)
5+
6+
[A 問題 - ハイパー覆面すごろく](https://atcoder.jp/contests/rcl-contest-2020-final/tasks/rcl_contest_2020_final_a)
7+
のテストを行うプログラムです。
8+
* これを用いることで、ローカル環境で回答プログラムを実行し、スコアを確認できます。
9+
* このプログラム上で計算された得点は、当コンテストでの得点を保証するものではありません。
10+
* このプログラムを使用することによるあらゆる損害は保障しかねますので、予めご了承ください。
11+
* このプログラムに関する質問は受け付けていません。予めご了承ください。
12+
* このプログラムの一部を、コンテストの解答に流用してもかまいません。
13+
14+
# 実行
15+
`-command` オプションにあなたの回答プログラムを実行するコマンドを渡してテスターを実行すると、テスターが問題の仕様にしたがってあなたのプログラムとやりとりを行い、スコアを計算します。また、好きな乱数シードを整数で与えることができます。
16+
17+
以下のコマンドは、回答プログラムが `a.out` という実行可能バイナリにコンパイルされて `tester.py` と同じディレクトリに配置されており、 `334` という値を乱数シード値としてテストを実行する場合の例です。
18+
```bash
19+
python tester.py -seed 334 -command "./a.out"
20+
```
21+
または
22+
```bash
23+
python3 tester.py -seed 334 -command "./a.out"
24+
```
25+
26+
回答プログラムをRubyで `main.rb` というファイルに記述している場合は、たとえば次のようになります。 `-command` に渡すオプションは、スペースが含まれていても1つの文字列として認識されるよう、`"` で囲ってください。
27+
```bash
28+
python tester.py -seed 334 -command "ruby main.rb"
29+
```
30+
または
31+
```bash
32+
python3 tester.py -seed 334 -command "ruby main.rb"
33+
```
34+
35+
36+
# デバッグ
37+
あなたの回答プログラムが標準エラー出力へ出力した内容は、テスターの標準エラー出力へリダイレクトして書き出します。
38+
39+
また、テスターに `-debug` というオプションを与えると、各マスに到達した時の状況をテスターの標準エラー出力に書き出します。 多くの出力がされるので、適宜ファイルにリダイレクトするなどしてください。このオプションを指定した例を以下に示します。
40+
```bash
41+
python tester.py -seed 334 -command "./a.out" -debug
42+
```
43+
または
44+
```bash
45+
python3 tester.py -seed 334 -command "./a.out" -debug
46+
```
47+
48+
# 情報出力
49+
テスターに `-info` というオプションを与えると、最初と最後に情報をテスターの標準エラー出力に書き出します。このオプションを指定した例を以下に示します。
50+
```bash
51+
python tester.py -seed 334 -command "./a.out" -info
52+
```
53+
または
54+
```bash
55+
python3 tester.py -seed 334 -command "./a.out" -info
56+
```

final_A/tester/tester.py

+147
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
import argparse
2+
import subprocess as sp
3+
import sys
4+
5+
N = 500
6+
M = 5000
7+
8+
9+
class XorShift:
10+
mask = (1 << 64) - 1
11+
12+
def __init__(self, seed=None):
13+
self.x = seed or 88172645463325252
14+
15+
def next(self):
16+
self.x ^= self.x << 13
17+
self.x &= self.mask
18+
self.x ^= self.x >> 7
19+
self.x ^= self.x << 17
20+
self.x &= self.mask
21+
return self.x
22+
23+
def next_int(self, n):
24+
upper = self.mask // n * n
25+
v = self.next()
26+
while upper <= v:
27+
v = self.next()
28+
return v % n
29+
30+
31+
class Tester:
32+
def __init__(self, seed, info):
33+
self.rnd = XorShift(seed)
34+
self.v = [0] * (N + 1)
35+
self.v[N] = 5000
36+
for _ in range(100):
37+
size = self.rnd.next_int(10) + 1
38+
add = self.rnd.next_int(200) + 1
39+
pos = self.rnd.next_int(N - 5 - size) + 1
40+
for i in range(size):
41+
self.v[pos + i] += add
42+
43+
if info:
44+
print("各マスの値", file=sys.stderr)
45+
for i in range(0, N + 1, 20):
46+
v_str = map(lambda x: "%3d" % x, self.v[i:i+20])
47+
print("%3d: %s" % (i, " ".join(v_str)), file=sys.stderr)
48+
49+
def judge(self, command, info, debug):
50+
score = 0
51+
goal = 0
52+
with sp.Popen(command, shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sys.stderr,
53+
universal_newlines=True) as proc:
54+
proc.stdin.write("%d %d\n" % (N, M))
55+
proc.stdin.flush()
56+
prev_dice = [1, 2, 3, 4, 5, 6]
57+
prev_pos = 0
58+
pos = 0
59+
hide = [False] + [True] * (N - 6) + [False] * 5
60+
pos_count = [0] * (N + 1)
61+
for t in range(M):
62+
row = proc.stdout.readline()
63+
try:
64+
dice = list(map(int, row.split()))
65+
except Exception:
66+
print("[ERROR] 出力が不正です : %s" % row)
67+
proc.kill()
68+
sys.exit(1)
69+
70+
if len(dice) != 6:
71+
print("[ERROR] 値が6個ではありません : %s" % dice)
72+
proc.kill()
73+
sys.exit(1)
74+
75+
change_count = 0
76+
for i in range(6):
77+
if dice[i] < 1 or 6 < dice[i]:
78+
print("[ERROR] 値が範囲外です : %d" % dice[i])
79+
proc.kill()
80+
sys.exit(1)
81+
if dice[i] != prev_dice[i]:
82+
change_count += 1
83+
84+
if change_count > 1:
85+
print("[ERROR] 2つ以上のサイコロの面を変更しました : %s => %s" %
86+
(prev_dice, dice))
87+
proc.kill()
88+
sys.exit(1)
89+
90+
dice_index = self.rnd.next_int(6)
91+
move = dice[dice_index]
92+
pos += move
93+
if pos > N:
94+
pos = N - (pos - N)
95+
move_pos = pos
96+
score += self.v[pos]
97+
pos_count[pos] += 1
98+
proc.stdin.write("%d %d %d\n" % (move, self.v[pos], pos))
99+
proc.stdin.flush()
100+
if pos == N:
101+
pos = 0
102+
goal += 1
103+
hide[pos] = False
104+
105+
if debug:
106+
dice_str = []
107+
for j in range(6):
108+
if j == dice_index:
109+
dice_str.append("[%d]" % dice[j])
110+
else:
111+
dice_str.append(" %d " % dice[j])
112+
print("%4d, pos: %3d => %3d, dice: %s score: %d goal: %d" %
113+
(t, prev_pos, move_pos, "".join(dice_str), score, goal),
114+
file=sys.stderr)
115+
values = []
116+
indexes = []
117+
for j in range(pos, pos + 20):
118+
if hide[j % N]:
119+
values.append(" ?")
120+
else:
121+
values.append("%3d" % self.v[j % N])
122+
indexes.append("%3d" % (j % N))
123+
print("value: %s\nindex: %s\n" % (" ".join(values), " ".join(indexes)),
124+
file=sys.stderr)
125+
126+
prev_dice = dice
127+
prev_pos = pos
128+
129+
if info:
130+
print("各マスに到達した回数", file=sys.stderr)
131+
for i in range(0, N + 1, 20):
132+
count_str = map(lambda x: "%3d" % x, pos_count[i:i+20])
133+
print("%3d: %s" % (i, " ".join(count_str)), file=sys.stderr)
134+
135+
return (score, goal)
136+
137+
138+
if __name__ == '__main__':
139+
parser = argparse.ArgumentParser()
140+
parser.add_argument("-seed", type=int, required=True)
141+
parser.add_argument("-command", required=True)
142+
parser.add_argument("-info", action='store_true')
143+
parser.add_argument("-debug", action='store_true')
144+
args = parser.parse_args()
145+
tester = Tester(args.seed, args.info)
146+
result = tester.judge(args.command, args.info, args.debug)
147+
print("score: %d goal: %d" % result)

final_A/visualizer/README.md

-3
This file was deleted.

final_B/tester/README.md

+56-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,57 @@
1-
第4回 RECRUIT日本橋ハーフマラソン 本戦B問題のテスター置き場です。
1+
# ハイパーお掃除ロボット テスター
22

3-
コンテスト開始と同時にpushします。
3+
* これは
4+
[第4回 RECRUIT 日本橋ハーフマラソン 本戦](https://atcoder.jp/contests/rcl-contest-2020-final)
5+
6+
[B 問題 - ハイパーお掃除ロボット](https://atcoder.jp/contests/rcl-contest-2020-final/tasks/rcl_contest_2020_final_b)
7+
のテストケースジェネレータとジャッジのためのプログラムです。これらを用いることで、ローカル環境でプログラムのテストを行うことができます。
8+
* これらのプログラム上で計算された得点は、当コンテストでの得点を保証するものではありません。
9+
* これらのプログラムを使用することによるあらゆる損害は保障しかねますので、予めご了承ください。
10+
* これらのプログラムに関する質問は受け付けていません。予めご了承ください。
11+
* これらのプログラムの一部を、コンテストの解答に流用してもかまいません。
12+
13+
# テストケース生成
14+
好きな乱数シードを整数で与えることで、問題文の条件を満たすテストケースを生成できます。以下のコマンドでは `12345` という値を乱数シード値として、`input.txt` というテキストファイルにテストケースを保存しています。
15+
16+
```bash
17+
python generator.py 12345 > input.txt
18+
```
19+
または
20+
```bash
21+
python3 generator.py 12345 > input.txt
22+
```
23+
24+
シード値に `1`, `2`, `3` を与えて生成したテストケースを、それぞれ `input_1.txt`, `input_2.txt`, `input_3.txt` として置いています。
25+
26+
# 得点計算
27+
テストケースのテキストファイルと、自分のプログラムの出力結果のテキストファイルから、テストケースに対する得点を計算することができます。以下のコマンドでは、 `input.txt` というテキストファイルに保存されたテストケースに対する `output.txt` というテキストファイル内の出力から得られる得点を計算しています。
28+
29+
```bash
30+
python judge.py input.txt output.txt
31+
```
32+
または
33+
```bash
34+
python3 judge.py input.txt output.txt
35+
```
36+
37+
# 情報出力
38+
テスターに `-info` というオプションを与えると、連鎖数の情報をテスターの標準エラー出力に書き出します。このオプションを指定した例を以下に示します。
39+
```bash
40+
python judge.py input.txt output.txt -info
41+
```
42+
または
43+
```bash
44+
python3 judge.py input.txt output.txt -info
45+
```
46+
47+
出力例
48+
```
49+
C x 1 chain -> 1
50+
D x 2 chain -> 4
51+
Q x 1 chain -> 1
52+
A x 1 chain -> 1
53+
L x 1 chain -> 1
54+
A x 4 chain -> 16
55+
F x 1 chain -> 1
56+
H x 1 chain -> 1
57+
```

final_B/tester/generator.py

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from sys import argv
2+
from testcase import TestCase
3+
4+
5+
if __name__ == '__main__':
6+
seed = 1 if len(argv) <= 1 else int(argv[1])
7+
tc = TestCase(seed)
8+
print(tc)

final_B/tester/input_1.txt

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
40 300 1000
2+
----------------x-------xx---------x----
3+
-xx--x-xxx-------x---------x--x---------
4+
-------------x--x----x---x--x---x-x-----
5+
-----x--------------xx---x---x--------xx
6+
--x--x----x------x------x---x--x--------
7+
-x-------x--------x-x-x---x---x-o-------
8+
x--------------x------x----x----x--x----
9+
--xxx--x--xx----------xx---x--x--xx-----
10+
----x-xx-----x---------------x----x---x-
11+
-xx---------xx--x--x-x-xx--x------------
12+
-----xx-x---x----x-----xx--x------x-----
13+
-xxx----x--x----xx---x-----------x-----x
14+
---------xx-------x---x-----x-----x-x---
15+
--x-------x----x-x--------x--xx-xx---x--
16+
------x------------x---x--x------x-----x
17+
-----x----x-----xxxx-xx---xxx----x--x---
18+
--------x----x--x------------x-x----x---
19+
---------xx-----------------x---x-------
20+
--x----x----x--------xx---x--x----x----x
21+
x----x---x-------x---------x--------x---
22+
----x---x---xx-----------x---x------x---
23+
-x---x-----------------x----------------
24+
x------------------x------xxxx-x--------
25+
--------x-x-xx----------x--x----xxx-----
26+
-x----x--x---------x-----xx-----x----x--
27+
-x-----x----------x-----x---x------x-x--
28+
--------------x-----------x-x-----------
29+
------x------xx--x----x-----x-----x-----
30+
----x----xxxx----x--xx-x--x-----x-----x-
31+
x----------x----------x---x---xx--x-----
32+
--x--------------------x-xx---x-x-------
33+
-------------------------x--x-x--x-x---x
34+
--x-x-----x-x---x---------xxx--------x--
35+
xx-----xx--------x--x-------xx-x-----xx-
36+
---------x--x------x-x--x-----x--x------
37+
---------x----------------x----------x--
38+
-xx-x--x----x---x---x-xx------x---x----x
39+
--x-x---x-----x---------x--x-x-x----x---
40+
-----x---------x-xx-x-----------x--x----
41+
--x-----x---x----------------x----------
42+
QODVIZGYXEHCFEUAZXBQFYYRKIXNLKBHLESDGKEH
43+
HAFTIRBQUFBULQTDDWNKUERWHWQZKHXHAJWGGRJV
44+
AOWMPFQTIJQAXFQIKLJCCSKTEYZOHMDNMAMURMHW
45+
QAMTYRUMPSYHXAANRTIWVMUEBTWOKMXHRZFJLBLP
46+
MOTWTXSLOAXHPXMKHWJLNUHEQKZTWPSGJJIIGZDH
47+
KAPDZNMPCUKNKVJHWWIJPXJYKNKUHZONDFDSPXBB
48+
YJZAOYXJPICGNZDEVAWSBVREHKIINHAHNHTZMLMC
49+
MHFCZHEBWHZVXLYJOWGXGVPMEOCKFHEPPFMHLWYJ
50+
UZZTTLONVEAMAOZGOLXTLCXBSAXORKUHHSQABUCQ
51+
LSHYMMXJABNAAHPCLZKSGECZZTPUOQDOODTOGFFR
52+
HBRTAPJKXPLRDOSMBVXEIAEHGAFAMPOPARSCRZWE
53+
FYUOYPXAPCUMRUWYLEUIKLEOQCTWIWAWKLYXZTBQ
54+
CPHRRRKHIHRSGLOKIBSVGOQOXHPLYLBQKMPTODWS
55+
OCTDPWKHHAKWEYXKURKHYLLUWANRRJDRMZIEIKII
56+
SYJAVDHJWZVCFSBIVHIWOMUMCFGWDXYMRXQHYPOT
57+
RBMUVJDZACXAHSEENNVYJWIYQCKUVJOUWLHBMCPN
58+
ABNUEPEESSJHBEPEBXTTHYQTSEKBKWEEEYTHGALA
59+
EIRUMEMHFPQSQEAXXXTRVOOLZZIZYFWYVHIQOAVV
60+
JYIPGQOJSXLNTSRKQFJUAKGOPJUBJJKNZDXISXIM
61+
FNDHWVACUXFQOEWAJOAYVSPSMFPQKNJYTSPWCJDS
62+
KGLTTVLRTPHVZLSMIXSCGGTFAGMPQQDYRWSKXOFE
63+
IYKQVKQHTQHMJKUNSLFJVFBIBLAOPZAXSCGYSPWB
64+
NUGFCXNIERJRELCQJAOBKUEJDLWBIRATGREKJXZF
65+
KYHCVPHPADMDXGZXSCJSJLUUSUGEIBLPGNDUJNCL
66+
SGAQATHRGKIULQTFZOIPEXGHFALXKGNZEQHKILDU
67+
IJUPGYTOWMFJOIOEUJYPNKBHZORCJXJAMIBKTNPQ
68+
RHHDOSJPUZVHIWLTWPIBRYCCLFHUVVPQYIEXPDRH
69+
UERLQKDCYEEYDASSIRTTJSCGGNUATFPMQCILWYUK
70+
AXFHLRIGSJNMXZKAIXKGNDZAABRXABNLRKBTPRRR
71+
ECMKVRWDDQAEVCXPIZTHLZRLUFTTRMZAXFGKEUXT
72+
BRPCPUMBWRWQYIPPZTOZUBZHMAXLQFBLMTHDIBVE
73+
QQTXKKVOWTZQJPLMUWNEQPTSKSIXAFQMIZPAQKBW
74+
YVTEAUNVDWWCBFOMKEBKUPIHCUKZHQPQPKLCXYPV
75+
FUJGYLGUIAVVPVIVREWOZHLTUSKSVPPEKDFICRAL
76+
PJXCWUQKFZADPXDFWFTEVVBWAMDNHSZBIJYZRIMB
77+
ENTDJQNVFRRIWFLSULSGXEUCFLYIBFMSRNTYOEPM
78+
QTDONBERVUSGVUGZYZJWXUUCEIGZIAFDQOEAWCSX
79+
ASLQHABUMOCWLKGCSJNYWRLRVXFUTHREHYEZBVEO
80+
JIELMXCLYYOWRNWLLNJECSPJOQGDLMZUJXXYMDBV
81+
CEIHEFYXEONKTJVAAQXUSBRCULJHJJCLEGPOTXEW

0 commit comments

Comments
 (0)