この記事は Elixir その2 Advent Calendar 2020 25日目(最終日) です。
前日は @tamanugiさんのex_at_coderを使ってみる (Elixir) でした。
走りきりました!
@mnishiguchi さん、ありがとうございます!
はじめに
- Elixir楽しんでいますか
- @g_kenkunさんのg-kenkun/kyopuroを使ってみます
What is AtCoder?
- 世界最高峰の競技プログラミングサイトです
- だいたい毎週土曜や日曜の21時すぎにコンテストが行われているようです
- 出題された問題の答えを出力するプログラムを書いて提出することで自動的に採点されます
- 実行時間が長かったり、メモリの使用量が多いとパスできません
- 競技プログラミングというもの自体に私は馴染みがなかったのですが、最近はじめました
プロジェクト作成
$ mkdir awesome_at_coder2
$ cd awesome_at_coder2
$ asdf local elixir 1.10.2-otp-22
$ mix new .
このパッケージで使用しているhtml5everパッケージはNifsにRustを使用しているので、予めRustの環境を構築する必要があります。
とのことです。
Rust をインストール に従いインストールしました。
$\huge{Rust をインストール}$
あ、私はmacOS 10.15.7を使っています
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ source $HOME/.cargo/env
$ rustc --version
rustc 1.48.0 (7eac88abb 2020-11-16)
defp deps do
[
{:kyopuro, "~> 0.4.0"}
]
end
$ mix deps.get
とりあえずここで、mix test
やってみよう。
$ mix test
...
==> kyopuro
warning: the dependency :kyopuro requires Elixir "~> 1.11" but you are running on v1.10.2
Compiling 10 files (.ex)
== Compilation error in file lib/kyopuro/at_coder/client.ex ==
** (CompileError) lib/kyopuro/at_coder/client.ex:8: cannot find or invoke local is_struct/2 inside guard. Only macros can be invoked in a guard and they must be defined before their invocation. Called as: is_struct(error, Mint.TransportError)
(elixir 1.10.2) lib/kernel/utils.ex:213: Kernel.Utils.defguard/3
(elixir 1.10.2) expanding macro: Kernel.Utils.defguard/2
lib/kyopuro/at_coder/client.ex: Kyopuro.AtCoder.Client.is_transport_error/1
could not compile dependency :kyopuro, "mix compile" failed. You can recompile this dependency with "mix deps.compile kyopuro", update it with "mix deps.update kyopuro" or clean it with "mix deps.clean kyopuro"
- なんかエラーがでた
- たぶん、Elixir 1.11以上を使えばいいのかな
$ asdf local elixir 1.11.2-otp-23
$ elixir -v
Erlang/OTP 23 [erts-11.0.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
Elixir 1.11.2 (compiled with Erlang/OTP 23)
$ mix test
...
Generated awesome_at_coder2 app
..
Finished in 0.03 seconds
1 doctest, 1 test, 0 failures
- 準備は整いました
https://atcoder.jp/contests/abc185 をやってみます
- READMEに従って進めます
import Config
config :kyopuro,
username: "awesomey", # ← 雑魚🐟 ご自身のアカウントに置き換えてね。いまは雑魚だけどいつまでも雑魚だとは言わない。いつかは大海原を自由に泳ぎ回りたい。
password: "secret"
$ mix kyopuro.login
...
==> awesome_at_coder2
Compiling 1 file (.ex)
Generated awesome_at_coder2 app
* creating .cookie
$ mix kyopuro.new abc185
* creating lib/awesome_at_coder2/abc185/a.ex
* creating test/awesome_at_coder2_test/abc185/a_test.exs
* creating lib/awesome_at_coder2/abc185/b.ex
* creating test/awesome_at_coder2_test/abc185/b_test.exs
* creating lib/awesome_at_coder2/abc185/c.ex
* creating test/awesome_at_coder2_test/abc185/c_test.exs
* creating lib/awesome_at_coder2/abc185/d.ex
* creating test/awesome_at_coder2_test/abc185/d_test.exs
* creating lib/awesome_at_coder2/abc185/e.ex
* creating test/awesome_at_coder2_test/abc185/e_test.exs
* creating lib/awesome_at_coder2/abc185/f.ex
* creating test/awesome_at_coder2_test/abc185/f_test.exs
- すごい! すごい! めちゃ速い
- 問題ページからテストケースが作成されたっぽい
- とりあえずA問題のテストを実施してみます
$ mix test
...
Finished in 0.1 seconds
1 doctest, 20 tests, 19 failures
- 期待通り失敗
A - ABC Preparationを解く
- ここからは自分の力を信じてがんばるしかありません
- がんばってみましょう 💪
- 問題文はリンク先をご参照ください
ひとりごと
自分で解きたい人はみないでください
ふむふむ、4つ整数を読み取って最小のものを答えにすればいいのだな こんな感じだな ![スクリーンショット 2020-12-25 0.26.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/39befc35-33d5-d70e-0e5f-31aee125ffd5.png)コードスニペット貼るとうまく折りたたまれなかったので画像です
ソースコードができたらもう一回テストしてみましょう
$ mix test test/awesome_at_coder2_test/abc185/a_test.exs
Compiling 1 file (.ex)
..
Finished in 0.03 seconds
2 tests, 0 failures
- Yay!!!
- これで自信をもって提出できます
提出
mix kyopuro.submit abc185 a
-
提出結果
- やったね
- そういえば提出のときにモジュール名を
Main
にしてくれているなあー
Wrapping Up
- すごいです! 便利です!
- 問題文をスクレイピングして自動でテストケース作ってくれてありがとナイスです
- 私は「AtCoderをElixirでやってみる」という記事を書いたことがあります
- こんなところをちょっと立ち止まって自動化してみよう! という発想ができることがうらやましいです
- 私はこういうことがそもそも思いつかない頭の回路になっているようです
- 育っててきた環境が違うから好き嫌いは否めない セロリが好きだったりするのね
- そして思いついた不便を解消することを実現されている!
- ただただすごいです!
-
g-kenkun/kyopuroのソースコードは斜め読みくらいしかできていませんが、キレイに書かれていてやっていることはだいたいわかった(何、目線)ので、これからも使っていってもしなにかあったらIssuesをあげるとともにできることなら改善案もご提案したいとおもっています (もしなにかあったら)
- おもっています (あくまでも、おもっています)
- Enjoy Elixir !!!
この記事を書いた時間 45 分くらい。
ありがとう! Qiita Advent Calendar 2020
$\huge{毎日が12月だったらいいのに!}$
ありがとう! Qiita Advent Calendar 2020
$\huge{毎日が12月だったらいいのに!}$
こちらにQiita Advent Calendar 2020の私のまとめを書きました。
ぜひご覧ください
グラフうねうね (作り方 編) (Elixir/Phoenix)