自己紹介
(ほとんどの人が)初めまして
uetaと申します。
今回の目的
競技プログラミング特にAtcoderというサイトで提供されるツールの使用方法を説明します。
本サイトではマラソン系のコンテストはAtcoder heuristic Contest、通称AHCと呼ばれています。
今回はこちらで提供されるツールを Windows で使うときの使用方法です。
割と新しいコンテストだと
以下のようにツールが与えられます。
これです。
構成
第一回 ビジュアライザについて
第二回 Windowsでの実行方法 ←今回
第三回 Ubuntu, WSLでの実行方法
今回の流れ
- 前提知識・このツールでできること
- インタラクティブとアウトプットオンリーとは?
- 入力ジェネレータ・ローカルテスタの実行(インタラクティブ時)
- Ex. アウトプットオンリーの時の実行例
前提知識・このツールでできること
前提知識
- コマンドプロンプト又はパワーシェル ←存在が分かればいい
- パスの概念 ←ファイル構造やコマンドを用いた移動ができる必要があり
できること
・ファイルの実行
・得点の算出
・実行ファイルの可視化
・入力値の生成
インタラクティブとアウトプットオンリー
混同していると理解が進まないことがあるためここに記述しております。
コンテストによって、インタラクティブ
とアウトプットオンリー
があります。
この二つで実行方法が異なるので注意が必要です。
(呼称は異議を認めます)
インタラクティブはローカルテスタがないとかなり厳しいですが、アウトプットオンリーではなくても対処が可能です。
-
インタラクティブ
入力と出力を繰り返すようなもので、対話を繰り返すもの。
機械側に正しい答えを出力させる必要があります。
これを自動で行ってくれるのがローカルテスタ。
また、図示にも役立つものもあります。
例:AHC15,AHC16,AHC17 -
アウトプットオンリー(正式の呼び方があるかも)
一度入力をするだけで全て出力されるもの。
アルゴリズムのコンテストと仕組みは同じです。
そのため、実行がたやすいです。
また、基本的にツールは必須ではないですが、実行に図示等の機能や得点の算出を内包しているため、使ったほうがいいです。
例:AHC12,AHC13,AHC14, AHC18,
意識的に区別して考えることと理解が早くなります
ツール内にはREADMEというファイルが入っており、コマンドの説明が書かれています。こちらをよく読んでみましょう。
どのコマンドで何ができるかを確認することが重要です。
入力ジェネレータ・ローカルテスタの実行(Windows)
実行方法は主に二つあります。
①rustをダウンロードする
②バイナリを使用する
両方を解説しますがWindowsでのC++の実行環境(MinGW) が準備できていないのでpythonのみ実行をしました。
ちなみにお勧めはWSLでやることです。
本格的にC++でやりたいときは第3回のubuntu を使用することをお勧めします。
windowsには以下のように仮想化してUbuntuを使用できる機能があります。
ちょくだいさんもあーだこーだーで少し言及していた記憶が。
こちらでやると障害が少なくなり、 online-judge-tools が使えるのでお勧めです。
この実行方法はunix, WSLに当たるのでこちらになります。
①RUSTによる実行
1. rustをダウンロードする
まず、インストールしましょう。
自分64bit PCなので64bit版を入れました。
2. AtCoderのコンテストサイトからツールをダウンロード
ローカル版を選択しダウンロードします。
下にローカル版よりダウンロードした場合のエクスプローラです。
各自の展開したい場所に展開するか、展開後に移動させてください。
まずは、展開(Extract all) します。
そのあと、README.html を開いてもらうと使い方を確認できます。
(初めに英語ができて、あきらめかけますが下に行くと日本語版があります。)
3. 実行コマンド
細かいコマンドは毎回少しずつ異なります。
詳しくはREADMEに書かれているためので読みましょう。
想定ファイル構造
━tools━in━0001.txt
┃ ┗0002.txt ...
┠README.html(手順書が書いてある)
┠seeds.txt
______以下は実行用ファイルと実行時に生成されるファイル___
┠output━0001.txt
┗0002.txt ...
┠exec.bat ←これが100個まとめた時の実行用シェル
┗a.py ←python実行ファイル
以下では上記のような実行コードを同じツール内に置くことを想定しています。
別の場所にしたい場合は相対パス等を勉強して書き直すとよいと思います。
AHC16( インタラクティブ )の時のものです
毎回同じではありません。
コマンドプロンプトというアプリを開きます。
(powershellの場合は別のコマンドのため要注意)
そして以下のように実行します。
#ディレクトリを移動します(各自環境が合うように変更してください)
cd C:\Users\ueta\Documents\qiita\202212\tools
cargo run --release --bin tester python a.py < in/0000.txt > out.txt
すると、a.py
にin/0000.txt
の入力値が入力され実行されます。
結果はout.txt
に出力されます。
また、入力ジェネレータも入っているため入力ファイルの生成も可能である。
seeds.txt
に書き込んだseed値の入力値が生成されます。
cargo run --release --bin gen seeds.txt
PowerShellの時のコマンドは
cat in/0000.txt | cargo run --release --bin tester python a.py > out.txt
ex. 100個をまとめて実行
100個まとめて実行する場合はそれなりに工夫が必要である。
今回は以下のようなバッチファイルを作ってダブルクリックで実行できるようにしました。
ツール内において、エクスプローラーを右クリックして、新規作成(.txt)して開き
以下のコードをコピペして、バッチファイル(.bat)として保存する。
するとダブルクリックで実行できるようになる。
@echo off
mkdir output
setlocal ENABLEDELAYEDEXPANSION
for /l %%a in (0,1,99) do (
set num=000%%a
set num=!num:~-4,4!
cargo run --release --bin tester python a.py < in/!num!.txt > output/!num!.txt
)
@echo on
pause
exit
以下はバッチファイルを実行したときの流れをGIFにしたものである。
100個連続で実行され、outputファルダ内の各ファイルに結果が全て出力されている。
得点計算したい場合は標準エラー出力を別ファイルに出すと
python等で処理しやすい。
#コマンドを以下のようにするとフォルダ output2 内に出力される
mkdir output2
cargo run --release --bin tester python a.py < in/!num!.txt > output/!num!.txt 2>score/!num!.txt
②バイナリで実行する
細かいコマンドは毎回少しずつ異なります。
詳しくはREADME
に書かれているためので読みましょう。
以下では実行コードを同じツール内に置くことを想定しています。
別の場所にしたい場合は相対パス等を勉強して書き直すとよいと思います。
1. 実行コマンド
AHC16( インタラクティブ )の時のものです
毎回同じではありません。
これはREADMEに書かれている内容を説明したものです。
#ディレクトリを移動します(各自環境が合うように変更してください)
cd C:\Users\ueta\Documents\qiita\202212\e8280aa7\tools_x86_64-pc-windows-gnu
tester.exe python a.py <in\0000.txt> out.txt
入力ファイルの生成も可能である。
seeds.txtに書き込んだ番号の入力値が生成される。
gen.exe seeds.txt
ex. 100個をまとめて実行・得点算出
@echo off
mkdir output output2
setlocal ENABLEDELAYEDEXPANSION
for /l %%a in (0,1,99) do (
set num=000%%a
set num=!num:~-4,4!
tester.exe python a.py < in/!num!.txt > output/!num!.txt
)
@echo on
pause
exit
これはダブルクリックで実行でき、100個連続でできるようになる。
Ex. アウトプットオンリーの時
以下はアウトプットオンリーの時のコマンドです
アウトプットオンリーの時は
- ファイルの実行
- ローカルテスターを用いて得点算出・ビジュアライズ
の順序で行います。
インタラクティブ型ではなかったコンテストAHC17 での実行コードを示します。
rustの時
#ディレクトリを移動します(各自環境が合うように変更してください)
cd C:\Users\ueta\Documents\qiita\202212\tools
#コードの実行
python a.py < in/0000.txt > out.txt
#結果の図示と得点計算
cargo run --release --bin vis in/0000.txt out.txt
@echo off
mkdir output
setlocal ENABLEDELAYEDEXPANSION
for /l %%a in (0,1,99) do (
set num=000%%a
set num=!num:~-4,4!
python a.py < in/!num!.txt > output/!num!.txt
cargo run --release --bin vis in/!num!.txt output/!num!.txt
)
@echo on
pause
exit
バイナリの時
#ディレクトリを移動します(各自環境が合うように変更してください)
cd C:\Users\ueta\Documents\qiita\202212\tools
#コードの実行
python a.py < in/0000.txt > out.txt
#結果の図示と得点計算
vis.exe in/0000.txt out.txt
@echo off
mkdir output
setlocal ENABLEDELAYEDEXPANSION
for /l %%a in (0,1,99) do (
set num=000%%a
set num=!num:~-4,4!
python a.py < in/!num!.txt > output/!num!.txt
vis.exe in/!num!.txt output/!num!.txt
)
@echo on
pause
exit
まとめ
個人的には会心の出来であったので拡散いただけると幸いです。
もし可能ならWSLでやることをお勧めします。
WSLだと、並列処理と得点の平均を算出が容易いためです。
WSLやUnixでの実行方法は第三回になります。