LoginSignup
0

More than 3 years have passed since last update.

@g_kenkunさんのg-kenkun/kyopuroを使ってみる (Elixir)

Last updated at Posted at 2020-12-24

この記事は Elixir その2 Advent Calendar 2020 25日目(最終日) です。
前日は @tamanugiさんのex_at_coderを使ってみる (Elixir) でした。
走りきりました!
@mnishiguchi さん、ありがとうございます!


はじめに

What is AtCoder?

  • 世界最高峰の競技プログラミングサイトです
  • だいたい毎週土曜や日曜の21時すぎにコンテストが行われているようです
  • 出題された問題の答えを出力するプログラムを書いて提出することで自動的に採点されます
  • 実行時間が長かったり、メモリの使用量が多いとパスできません
  • 競技プログラミングというもの自体に私は馴染みがなかったのですが、最近はじめました

プロジェクト作成

$ mkdir awesome_at_coder2
$ cd awesome_at_coder2
$ asdf local elixir 1.10.2-otp-22
$ mix new .
  • 2020/12/20現在、AtCoderで使えるElixirのバージョンが1.10.2なのであわせています
    • あ、私はasdfでバージョンの切り替えを行っています

このパッケージで使用している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)
mix.exs
  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
  • 準備は整いました :tada::tada::tada:

https://atcoder.jp/contests/abc185 をやってみます

  • READMEに従って進めます
config/config.exs
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
  • すごい! すごい! めちゃ速い :rocket::rocket::rocket:
  • 問題ページからテストケースが作成されたっぽい
  • とりあえず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

コードスニペット貼るとうまく折りたたまれなかったので画像です

ソースコードができたらもう一回テストしてみましょう

$ 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!!! :tada::tada::tada:
  • これで自信をもって提出できます :rocket::rocket::rocket:

提出

mix kyopuro.submit abc185 a

Wrapping Up :christmas_tree::santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5::christmas_tree:

  • すごいです! 便利です!
  • 問題文をスクレイピングして自動でテストケース作ってくれてありがとナイス:flag_cn:です
  • 私は「AtCoderをElixirでやってみる」という記事を書いたことがあります
    • この記事ではDoctestsを書いて解いていきましょう! みたいなことをすゝめています
    • 手動で作っています
    • 私は、いつも手動です
    • いつもいつもいつも手動です
    • 本当に根っからいつもいつもいつもいっつも手動です
    • AtCoderをやったことある人ならわかるとおもいますが、コピペでDoctestsを書くにはつらいInputやOutputがあるわけです
    • それでもコピペでできるので、いつも同じことを繰り返していました
  • こんなところをちょっと立ち止まって自動化してみよう! という発想ができることがうらやましいです
    • 私はこういうことがそもそも思いつかない頭の回路になっているようです :japanese_ogre:
    • 育っててきた環境が違うから好き嫌いは否めない セロリが好きだったりするのね :microphone::microphone::microphone:
  • そして思いついた不便を解消することを実現されている!
    • ただただすごいです!
  • g-kenkun/kyopuroのソースコードは斜め読みくらいしかできていませんが、キレイに書かれていてやっていることはだいたいわかった(何、目線:sunglasses::interrobang:)ので、これからも使っていってもしなにかあったらIssuesをあげるとともにできることなら改善案もご提案したいとおもっています :rocket::rocket::rocket: (もしなにかあったら)
    • おもっています (あくまでも、おもっています)
  • Enjoy Elixir !!! :rocket::rocket::rocket:

この記事を書いた時間 45 分くらい。

ありがとう! Qiita Advent Calendar 2020
$\huge{毎日が12月だったらいいのに!}$

スクリーンショット 2020-12-23 22.32.36.png

スクリーンショット 2020-12-23 22.33.08.png

日にち タイトル カレンダー
2020/12/01 「クラウドネイティブの ASP.NET Core マイクロサービスを作成してデプロイする」 をやってみる 求ム!Cloud Nativeアプリケーション開発のTips!【PR】日本マイクロソフト
2020/12/01 [87, 101, 32, 97, 114, 101, 32, 116, 104, 101, 32, 65, 108, 99, 104, 101, 109, 105, 115, 116, 115, 44, 32, 109, 121, 32, 102, 114, 105, 101, 110, 100, 115, 33] Elixir その2
2020/12/02 LiveView uploadsを動かす 🎉🎉🎉(Elixir/Phoenix) Elixir その2
2020/12/03 【毎日自動更新】QiitaのElixir LGTMランキング! Elixir
2020/12/03 ElixirでAtCoderのABC123を解いてみる! fukuoka.ex Elixir/Phoenix
2020/12/03 Surfaceをつかってみる(Elixir/Phoenix) Elixir その2
2020/12/03 Nervesで湯婆婆を実装してみる #NervesJP
2020/12/03 Phoenixで実装した湯婆婆をAzureで動かす。Azure Virtual Machinesを使うとEC2やVPSでやったことがあることとなんらの変わり無しになりそうで、せっかくDockerと仲良くなりはじめたのでAzureコンテナーで動かしてみる。もちろんHTTPS緑にしたいのでアプリケーションゲートウェイも使ってみる。 湯婆婆
2020/12/04 とあるサイトでのみ%HTTPoison.Error{id: nil, reason: :closed}が発生 (Elixir) Elixir その2
2020/12/05 二次元リストの操作(Elixir) Elixir その2
2020/12/05 I was born to love Elixir プログラミング技術の変化で得られた知見・苦労話【PR】パソナテック
2020/12/06 次の関数の第二引数なんだよなー(Elixir) Elixir その2
2020/12/07 WindowsでIExで日本語を使う(iex --werl) (Elixir) Elixir その2
2020/12/07 Azure Container InstancesでNervesアプリを開発する Docker
2020/12/08 CircleCIでmix testする、Gigalixirへデプロイする(Elixir/Phoenix) Elixir その2
2020/12/09 Nervesで書き込める場所 (Elixir) #NervesJP
2020/12/09 HEX_HTTP_CONCURRENCY=1 HEX_HTTP_TIMEOUT=120 mix deps.get (Elixir) Elixir その2
2020/12/10 1 = a (プログラミングElixir 第2版) Elixir その2
2020/12/10 Raspberry Pi 4 + Grove Base HAT for Raspberry Pi + Grove Buzzer + Grove ButtonでつくるNervesアラーム Raspberry Pi
2020/12/11 NimbleCSVのご紹介(Elixir) Elixir その2
2020/12/11 Nervesならできるもん! |> 本当にできんのか! (Elixir) Raspberry Pi
2020/12/12 String.replace/3 (Elixir) Elixir その2
2020/12/12 「kentaro/mix_tasks_upload_hotswap」を試してみる! ご本人が参加していらっしゃるカレンダーにて #NervesJP
2020/12/13 GigalixirでPORTを4000以外の値にするのはだめよ (Elixir) Elixir その2
2020/12/13 Grove Base HAT for RasPiは真っ直ぐグイっとさす Seeed UG
2020/12/14 Grove - Buzzer をNervesで鳴らす Seeed UG
2020/12/15 グラフうねうね (動かし方 編) (Elixir/Phoenix) #NervesJP
2020/12/16 Macro.camelize/1 (Elixir) 何でもOKなカレンダー
2020/12/17 AtCoderをElixirでやってみる 競技プログラミング
2020/12/18 GrovePi+ Starter Kit for Raspberry Pi A+,B,B+&2,3,4 (CE certified) 〜Nervesならできるもん!〜 Seeed UG
2020/12/19 0埋め (Elixir) 何でもOKなカレンダー
2020/12/20 [Elixir]Qiitaの自分の記事をエクスポートする 何でもOKなカレンダー
2020/12/21 1260 (Elixir 1.11.2-otp-23) Elixir その2 Advent Calendar 2020
2020/12/21 ここがへんだよ GET /api/v2/items (Elixir) 何でもOKなカレンダー
2020/12/22 String.jaro_distance/2 (Elixir) Elixir その2 Advent Calendar 2020
2020/12/23 「動的計画法を使う問題をElixirで関数型っぽく解いてみる」のFibonacci3をガード節を使って書き直してみる Elixir その2 Advent Calendar 2020
2020/12/24 @tamanugiさんのex_at_coderを使ってみる (Elixir) Elixir その2
2020/12/25 @g_kenkunさんのg-kenkun/kyopuroを使ってみる (Elixir) Elixir その2
2020/12/25 グラフうねうね (作り方 編) (Elixir/Phoenix) 名前は聞いたことあるけど使ったことないやつをせっかくだから使ってみる

ありがとう! Qiita Advent Calendar 2020
$\huge{毎日が12月だったらいいのに!}$

こちらにQiita Advent Calendar 2020の私のまとめを書きました。
ぜひご覧ください :rocket::rocket::rocket:
:christmas_tree::gift::point_down::point_down_tone1::point_down_tone2::point_down_tone3::point_down_tone4::point_down_tone5::gift::christmas_tree:
グラフうねうね (作り方 編) (Elixir/Phoenix)
:christmas_tree::gift::point_up::point_up_tone1::point_up_tone2::point_up_tone3::point_up_tone4::point_up_tone5::gift::christmas_tree:

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