search
LoginSignup
0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

Elixir その2 Advent Calendar 2020 Day 24

posted at

updated at

Organization

@tamanugiさんのex_at_coderを使ってみる (Elixir)

この記事は、「Elixir その2 Advent Calendar 202024日目です。
前日は「「動的計画法を使う問題をElixirで関数型っぽく解いてみる」のFibonacci3をガード節を使って書き直してみる」でした。


はじめに

What is AtCoder?

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

プロジェクト作成

$ mkdir awesome_at_coder
$ cd awesome_at_coder
$ asdf local elixir 1.10.2-otp-22
$ mix new .
  • 2020/12/20現在、AtCoderで使えるElixirのバージョンが1.10.2なのであわせています
    • あ、私はasdfでバージョンの切り替えを行っています
mix.exs
  defp deps do
    [
      {:ex_at_coder, ">0.0.0"}
    ]
  end
$ mix deps.get
  • 準備は整いました :tada::tada::tada:

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
$ 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を解く

  • ここからは自分の力を信じてがんばるしかありません
  • がんばってみましょう 💪
  • 問題文はリンク先をご参照ください

問題をブラウザで開くコマンド :rocket::rocket::rocket:

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
  • これは貢献のチャンスか:interrobang:

ひとりごと

自分で解きたい人はみないでください
ふむふむ、4つ整数を読み取って最小のものを答えにすればいいのだな
こんな感じだな
スクリーンショット 2020-12-20 20.53.13.png
コードスニペット貼るとうまく折りたたまれなかったので画像です

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

$ mix atcoder.test abc185 a
abc185 a
running 2 test...
-------------------------------------
sample1  AC  0ms
actual:
3
expected:
3
-------------------------------------
sample2  AC  0ms
actual:
1
expected:
1
  • やったね :tada::tada::tada:
  • これで自信をもって提出できます :rocket::rocket::rocket:

提出

  • モジュール名をAbc185.A.Main => Mainに変えて提出
  • ここ手動でコピペしちゃいました
    • いまのところは、それでよいのですよね:interrobang:
    • 提出用コマンドがありましたらごめんなさい:relaxed:
  • 提出結果
    • やったね :tada::tada::tada:

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:
    • @kentaro さんのブラウザを開くことをタスクにするプルリクが採用されています!
    • mix atcoder.openタスクを追加します #1
    • 私はなんの疑問も持たずにブラウザを手動でダブルクリックしていました
    • browser_launcher こんなHexあったんだー とおもってのぞきにいったら、これは@kentaro さん作でした!
    • 期せずして、私にはやっぱりこういう発想ができないことが証明されました :rocket::rocket::rocket:
  • そして思いついた不便を解消することを実現されている!
    • ただただすごいです!
  • tamanugi/ex_at_coderのソースコードは斜め読みくらいしかできていませんが、キレイに書かれていてやっていることはだいたいわかった(何、目線:sunglasses::interrobang:)ので、これからも使っていってもしなにかあったらIssuesをあげるとともにできることなら改善案もご提案したいとおもっています :rocket::rocket::rocket: (もしなにかあったら)
    • おもっています (あくまでも、おもっています)
  • Enjoy Elixir !!! :rocket::rocket::rocket:

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
What you can do with signing up
0
Help us understand the problem. What are the problem?