0
0

More than 1 year has passed since last update.

多言語対応のAtCoderテストツールをJavaで作成した話

Last updated at Posted at 2022-04-07

初めまして、初投稿になります。記事というものを始めて執筆するため読みづらい部分がありますが、ご了承ください。
私は最近趣味で競技プログラミングを触っていて主にAtCoderと呼ばれるサイトでプログラミングをしています。
AtCoderでは大量の過去のコンテスト問題を触って勉強することができますが、いちいち入力例・解答例をコピーペーストでターミナルに張る作業がめんどくさいと感じてきてしまいました。
そこで過去問をターゲットとして自動で入力例・回答例から正解・不正解を出力してくれるテスト自動化ツールをJavaを使って作成しました。

はじめに

この記事では以下の記事を参考に作成をしています。
実際に以下記事では私のツールでは賄えない部分まで賄えているため一度ご確認お願い致します。

現時点(2022/04/08 04:00)では以下の8言語に対応しています。

  • Java.
  • Python3.
  • COBOL-Free.
  • GoLang.
  • Perl.
  • Ruby.
  • Dart.
  • C++.

動作環境・ソースコード

先にソースコード、動作環境を上げておきます。
ソースだけ見たいという方もこちらからご覧ください。

ソースコード

インストーラー

動作環境

  • OS: MacOSX (Monterey 12.2.1)
  • Java 17.0.2 Amazon Corretto
  • MacBook Pro 14'inch M1 Pro (16GB RAM)

1. 作りたいものを書き出す

  • AtCoderのコンテストページを取得して入力例・回答例のペアを作る
  • 上記ペアと実際のプログラムの出力を確認して一致(正解)するか確かめる
  • ターミナルから1コマンドで実行できるようにする
  • 複数言語に対応する。(コンパイラ・非コンパイラ双方対応したい)
  • 過去問を主として考えているのでレイテンシは最悪遅くてもかまわない。
  • ファイル管理・フォルダ整理等は自分で行うからとりあえずテストが楽になればいい(コンセプト)
  • 自分以外の人にも使ってもらいたい!

作り始めるときに上記のコンセプト・計画で作り始めました。

2. 実装等

普段Javaを使用していることからJavaで作ろうと思い、JavaのライブラリであるJsoupを用いスクレイピングをして、コンテスト情報を取得しました。
実際のテストにはProcessBuilderを使用し、新規プロセスを立ち上げそこに入力をし、出力を取得する方法でプログラムを作成しました。
TLE等の実行時間の判定はProcess#waitforを使用して実装した。
複数言語に対応するとのことでコンパイラ->実行の形式と実行の2形式で実装し、言語ごとに簡単に追加できるようにしました。
zsh / fish用のインストーラを作成し、インストールを簡単にできるようにしました。

3. 動作例

以下の写真は実際の動作例です。
写真の中ではJava・Pythonのみになっていますが、現在は複数言語に対応しています。
実際にコンテストページにアクセスし、時間制限・入力例・出力例を取得しAC等の判定を出しています。

4. 問題点

主にJava用で作り始めたため、Python等インタープリタ言語でCE・RE(判定は謎)が出る場合が稀にある。
COBOL・GO等のコンパイル方式を導入している言語で1回目の実行が200~300msほど遅くなってしまう場合がある。
インストールが少し複雑かつzsh fishのみの対応となっておりWindowsでのテストが未確認。(実装上OS依存の実装はない為、恐らくできるがコマンドプロンプトからは試していない。)

5. あとがき

実際にテストに使用してみて結構便利なのでこれからも言語を追加してみてどうなるか試してみたいと思いました。
今回で別の言語もさわりだけ勉強し、楽しい言語が沢山あったので色んな言語を触れてみたいと思いました。

もし記事が面白いなと思いましたらLGTMをぽちっとして頂けるとやる気につながります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0