AHCのツールについて　第二回　ツール実行方法　（Windows）

# 自己紹介

(ほとんどの人が)初めまして
uetaと申します。

# 今回の目的

競技プログラミング特にAtcoderというサイトで提供されるツールの使用方法を説明します。
本サイトではマラソン系のコンテストは<b>Atcoder heuristic Contest</b>、通称AHCと呼ばれています。

今回はこちらで提供されるツールを  <b>Windows</b> で使うときの使用方法です。




割と新しいコンテストだと
以下のようにツールが与えられます。

![Screenshot 2022-12-15 232120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2695016/dc11d0d1-0a5a-dd41-e6f7-ac8e8b71ed4b.png)

これです。

# 構成
第一回　[ビジュアライザについて](https://qiita.com/ueta7/items/f3a289d755da30faaa0e)
第二回　Windowsでの実行方法　←今回
第三回　[Ubuntu, WSLでの実行方法](https://qiita.com/ueta7/items/1b67bb2fe30e95c42e9a)

# 今回の流れ
1. 前提知識・このツールでできること
2. インタラクティブとアウトプットオンリーとは？
3. 入力ジェネレータ・ローカルテスタの実行（インタラクティブ時）
4. Ex. アウトプットオンリーの時の実行例


## 前提知識・このツールでできること
### 前提知識
- コマンドプロンプト又はパワーシェル　　←存在が分かればいい
- パスの概念　　←ファイル構造やコマンドを用いた移動ができる必要があり

### できること

・ファイルの実行
・得点の算出
・実行ファイルの可視化
・入力値の生成

## インタラクティブとアウトプットオンリー

混同していると理解が進まないことがあるためここに記述しております。

コンテストによって、`インタラクティブ`と`アウトプットオンリー`があります。
この二つで実行方法が異なるので注意が必要です。
(呼称は異議を認めます）
インタラクティブはローカルテスタがないとかなり厳しいですが、アウトプットオンリーではなくても対処が可能です。



- <b>インタラクティブ</b>
入力と出力を繰り返すようなもので、対話を繰り返すもの。
機械側に正しい答えを出力させる必要があります。
これを自動で行ってくれるのがローカルテスタ。
また、図示にも役立つものもあります。
例：[AHC15](https://atcoder.jp/contests/ahc015),[AHC16](https://atcoder.jp/contests/ahc016),[AHC17](https://atcoder.jp/contests/ahc017)

- <b>アウトプットオンリー(正式の呼び方があるかも）</b>
一度入力をするだけで全て出力されるもの。
アルゴリズムのコンテストと仕組みは同じです。
そのため、実行がたやすいです。
また、基本的にツールは必須ではないですが、実行に図示等の機能や得点の算出を内包しているため、使ったほうがいいです。
例：[AHC12](https://atcoder.jp/contests/ahc012),[AHC13](https://atcoder.jp/contests/ahc013),[AHC14](https://atcoder.jp/contests/ahc014), [AHC18](https://atcoder.jp/contests/ahc018),

#### 意識的に区別して考えることと理解が早くなります

<font color="Red">
ツール内には<b>README</b>というファイルが入っており、コマンドの説明が書かれています。

こちらをよく読んでみましょう。</font>

どのコマンドで何ができるかを確認することが重要です。

# 入力ジェネレータ・ローカルテスタの実行(Windows)

実行方法は主に二つあります。
①rustをダウンロードする
②バイナリを使用する

両方を解説しますがWindowsでのC++の実行環境(MinGW) が準備できていないのでpythonのみ実行をしました。

ちなみにお勧めはWSLでやることです。
>本格的にC++でやりたいときは第3回のubuntu を使用することをお勧めします。
windowsには以下のように仮想化してUbuntuを使用できる機能があります。
ちょくだいさんもあーだこーだーで少し言及していた記憶が。

https://qiita.com/AokabiC/items/e9312856f588dd9303ed

>こちらでやると障害が少なくなり、 online-judge-tools が使えるのでお勧めです。
この実行方法はunix, WSLに当たるので[こちら](https://qiita.com/ueta7/items/1b67bb2fe30e95c42e9a)になります。

# ①RUSTによる実行

## 1. rustをダウンロードする



https://www.rust-lang.org/ja/learn/get-started

まず、インストールしましょう。
自分64bit PCなので64bit版を入れました。

## ２. AtCoderのコンテストサイトからツールをダウンロード
ローカル版を選択しダウンロードします。

下にローカル版よりダウンロードした場合のエクスプローラです。

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2695016/a00bb687-2559-629a-d99d-0ae14f9f79c1.png">

各自の展開したい場所に展開するか、展開後に移動させてください。
まずは、展開（Extract all) します。
そのあと、<b>README.html</b>　を開いてもらうと使い方を確認できます。
（初めに英語ができて、あきらめかけますが下に行くと日本語版があります。）



## 3. 実行コマンド

細かいコマンドは毎回少しずつ異なります。
詳しくはREADMEに書かれているためので読みましょう。


:::note info
想定ファイル構造
━tools━in━0001.txt
　　　　┃　┗0002.txt ...
 　　　　┠README.html(手順書が書いてある）
 　　　　┠seeds.txt
______以下は実行用ファイルと実行時に生成されるファイル＿＿＿
 　　　　┠output━0001.txt
　　　　　　   ┗0002.txt ...
　 　　　┠exec.bat　　←これが100個まとめた時の実行用シェル
　 　　　┗a.py　　　←python実行ファイル
:::

<b>以下では上記のような実行コードを同じツール内に置くことを想定しています。
別の場所にしたい場合は相対パス等を勉強して書き直すとよいと思います。</b>

:::note warn
AHC16（ <b>インタラクティブ</b> ）の時のものです
毎回同じではありません。
:::

コマンドプロンプトというアプリを開きます。
(powershellの場合は別のコマンドのため要注意)
そして以下のように実行します。



```cmd:aというファイルを実行するとき
#ディレクトリを移動します（各自環境が合うように変更してください）
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値の入力値が生成されます。

```cmd:入力ファイルの生成
cargo run --release --bin gen seeds.txt
```


<details>
<summary>PowerShellの時のコマンドは</summary>

```
cat in/0000.txt | cargo run --release --bin tester python a.py > out.txt
```
</details>

## ex. 100個をまとめて実行
100個まとめて実行する場合はそれなりに工夫が必要である。
今回は以下のようなバッチファイルを作ってダブルクリックで実行できるようにしました。
ツール内において、エクスプローラーを右クリックして、新規作成(.txt)して開き
以下のコードをコピペして、バッチファイル(.bat)として保存する。
するとダブルクリックで実行できるようになる。

```bat: exec.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ファルダ内の各ファイルに結果が全て出力されている。

![cargo_v.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2695016/83b6c9d3-6ae3-3c23-c55b-503e80e6e148.gif)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2695016/065edefd-2640-d593-dd49-9d54551d6f98.png)

得点計算したい場合は標準エラー出力を別ファイルに出すと
python等で処理しやすい。
```
#コマンドを以下のようにするとフォルダ　output2　内に出力される
mkdir output2
cargo run --release --bin tester python a.py < in/!num!.txt > output/!num!.txt 2>score/!num!.txt
```

# ②バイナリで実行する

細かいコマンドは毎回少しずつ異なります。
詳しくは`README`に書かれているためので読みましょう。


<b>以下では実行コードを同じツール内に置くことを想定しています。
別の場所にしたい場合は相対パス等を勉強して書き直すとよいと思います。</b>

## 1. 実行コマンド

:::note warn
AHC16（ <b>インタラクティブ</b> ）の時のものです
毎回同じではありません。
:::

###### これはREADMEに書かれている内容を説明したものです。

```cmd:aというファイルを実行するとき
#ディレクトリを移動します（各自環境が合うように変更してください）
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に書き込んだ番号の入力値が生成される。

```cmd:入力ファイルの生成
gen.exe seeds.txt
```

## ex. 100個をまとめて実行・得点算出


```bat: exec.bat
@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個連続でできるようになる。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2695016/abb9b57e-c5ae-59f4-7328-9319fa4de6ea.gif)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2695016/d4c229e9-ff08-a6de-9890-74460d323074.png)

# Ex. アウトプットオンリーの時
:::note warn
以下はアウトプットオンリーの時のコマンドです
:::

アウトプットオンリーの時は
1. ファイルの実行
2. ローカルテスターを用いて得点算出・ビジュアライズ

の順序で行います。

インタラクティブ型ではなかったコンテスト[AHC17](https://atcoder.jp/contests/ahc017/tasks/ahc017_a) での実行コードを示します。


### rustの時
```cmd:aというファイルを実行するとき
#ディレクトリを移動します（各自環境が合うように変更してください）
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
```

```bat: exec.bat
@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
```

### バイナリの時
```cmd:aというファイルを実行するとき
#ディレクトリを移動します（各自環境が合うように変更してください）
cd C:\Users\ueta\Documents\qiita\202212\tools

#コードの実行
python a.py < in/0000.txt > out.txt
#結果の図示と得点計算
vis.exe in/0000.txt out.txt
```

```bat: exec.bat
@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での実行方法は[第三回](https://qiita.com/ueta7/items/1b67bb2fe30e95c42e9a)になります。