この記事は、「Elixir その2 Advent Calendar 2020」 24日目です。
前日は「「動的計画法を使う問題をElixirで関数型っぽく解いてみる」のFibonacci3をガード節を使って書き直してみる」でした。
はじめに
What is AtCoder?
- 世界最高峰の競技プログラミングサイトです
- だいたい毎週土曜や日曜の21時すぎにコンテストが行われているようです
- 出題された問題の答えを出力するプログラムを書いて提出することで自動的に採点されます
- 実行時間が長かったり、メモリの使用量が多いとパスできません
- 競技プログラミングというもの自体に私は馴染みがなかったのですが、最近はじめました
プロジェクト作成
$ mkdir awesome_at_coder
$ cd awesome_at_coder
$ asdf local elixir 1.10.2-otp-22
$ mix new .
mix.exs
defp deps do
[
{:ex_at_coder, ">0.0.0"}
]
end
$ mix deps.get
- 準備は整いました
https://atcoder.jp/contests/abc185 をやってみます
$ mix atcoder.new abc185
==> awesome_at_coder
* creating lib/abc185
* creating lib/abc185/a.ex
* creating lib/abc185/test_case
* creating lib/abc185/test_case/a.yml
* creating lib/abc185/b.ex
* creating lib/abc185/test_case/b.yml
* creating lib/abc185/c.ex
* creating lib/abc185/test_case/c.yml
* creating lib/abc185/d.ex
* creating lib/abc185/test_case/d.yml
* creating lib/abc185/e.ex
* creating lib/abc185/test_case/e.yml
* creating lib/abc185/f.ex
* creating lib/abc185/test_case/f.yml
✨ Generate code for abc185
👍 Good Luck
- すごい! すごい!
- 問題ページからテストケースが作成されたっぽい
- 今回は使っていませんが、以下の機能があります
- ログインができる
- 今回は過去問なのでログインしませんでした
- 詳しくはAtCoder用のmixタスクを作ってみた -- ログイン をご参照ください
- 提出用ファイルの雛形を自分の好みにカスタマイズすることができる
- 詳しくはAtCoder用のmixタスクを作ってみた -- 提出用コードの作成 をご参照ください
- ログインができる
- とりあえずA問題のテストを実施してみます
$ mix atcoder.test abc185 a
abc185 a
running 2 test...
-------------------------------------
sample1 WA 0ms
actual:
expected:
3
-------------------------------------
sample2 WA 0ms
actual:
expected:
1
A - ABC Preparationを解く
- ここからは自分の力を信じてがんばるしかありません
- がんばってみましょう 💪
- 問題文はリンク先をご参照ください
問題をブラウザで開くコマンド 

mix atcoder.open abc185 a
...
==> browser_launcher
warning: the dependency :browser_launcher requires Elixir "~> 1.11" but you are running on v1.10.2
Compiling 1 file (.ex)
Generated browser_launcher app
...
✨ Open URL for abc185 a
- これは貢献のチャンスか
ひとりごと
自分で解きたい人はみないでください
ふむふむ、4つ整数を読み取って最小のものを答えにすればいいのだな こんな感じだな  コードスニペット貼るとうまく折りたたまれなかったので画像ですソースコードができたらもう一回テストしてみましょう
$ mix atcoder.test abc185 a
abc185 a
running 2 test...
-------------------------------------
sample1 AC 0ms
actual:
3
expected:
3
-------------------------------------
sample2 AC 0ms
actual:
1
expected:
1
- やったね
- これで自信をもって提出できます
提出
- モジュール名を
Abc185.A.Main
=>Main
に変えて提出 - ここ手動でコピペしちゃいました
- いまのところは、それでよいのですよね
- 提出用コマンドがありましたらごめんなさい
- いまのところは、それでよいのですよね
-
提出結果
- やったね
- やったね
Wrapping Up 






- すごいです! 便利です!
- 問題文をスクレイピングして自動でテストケース作ってくれてありがとナイス
です
- スクレイピングしてテストケース作成しているのは、たぶん: https://github.com/tamanugi/ex_at_coder/blob/6975990d2c188039722df9e00050087462d2a0c7/lib/ex_at_coder/repo.ex このへん
- 私は「AtCoderをElixirでやってみる」という記事を書いたことがあります
- こんなところをちょっと立ち止まって自動化してみよう! という発想ができることがうらやましいです
- 私はこういうことがそもそも思いつかない頭の回路になっているようです
- 育っててきた環境が違うから好き嫌いは否めない セロリが好きだったりするのね
- @kentaro さんのブラウザを開くことをタスクにするプルリクが採用されています!
mix atcoder.open
タスクを追加します #1- 私はなんの疑問も持たずにブラウザを手動でダブルクリックしていました
- browser_launcher こんなHexあったんだー とおもってのぞきにいったら、これは@kentaro さん作でした!
- 期せずして、私にはやっぱりこういう発想ができないことが証明されました
- 私はこういうことがそもそも思いつかない頭の回路になっているようです
- そして思いついた不便を解消することを実現されている!
- ただただすごいです!
-
tamanugi/ex_at_coderのソースコードは斜め読みくらいしかできていませんが、キレイに書かれていてやっていることはだいたいわかった(何、目線
)ので、これからも使っていってもしなにかあったらIssuesをあげるとともにできることなら改善案もご提案したいとおもっています
(もしなにかあったら)
- おもっています (あくまでも、おもっています)
- Enjoy Elixir !!!