はじめに
- KFIEという近畿大学産業理工学部の情報系コミュニティがあります
- 最近は、毎週火曜日にLT会をやっているそうです
- 私が学生だったのはもうずいぶん昔のことなのですが、参加させてもらっています
- 毎週、5分間時間をもらって、Elixirいいよ! を伝えていきたいとおもいます
- 今日は以下を学びます
- AtCorderを解いてみます
- いろいろな問題を解いてみるといろいろと文法を覚えたり、公式ドキュメントの確認に抵抗がなくなっていくとおもいます
- A journey of a thousand miles begins with a single step.
- この記事はElixirを触るのがはじめてという方に向けて書いています
- elixir 1.10.4-otp-23
- erlang 23.0.1
もくじ
001 mix new, iex -S mix, mix format
|> 002 型
|> 003 Pattern matching
|> 004 Modules and functions
|> 005 Pipe operator and Enum module
|> 006 HTTP GET!
|> 007 Flow
|> 008 AtCoderを解いてみる
|> 999 Where to go next
準備
$ mix new hello_at_coder
$ cd hello_at_coder
A - Payment
- 問題文はリンク先をご確認ください
lib/main.ex
defmodule Main do
def main do
IO.gets("")
|> String.trim()
|> String.to_integer()
|> solve()
|> IO.puts()
end
@doc ~S"""
Solve
## Examples
iex> Main.solve(1900)
100
iex> Main.solve(3000)
0
"""
def solve(n) do
1..10
|> Enum.reduce_while(0, fn _, payment ->
if payment < n, do: {:cont, payment + 1000}, else: {:halt, payment}
end)
|> Kernel.-(n)
end
end
test/hello_at_coder_test.exs
defmodule HelloAtCoderTest do
use ExUnit.Case
doctest HelloAtCoder
doctest Main # add
- 愚直にn円以上となるように千円札を集めて、その合計金額からn円を引くという方法で解きました
-
Main.solve/1
のコメントはDoctestと呼ばれるテストになっています- 解答のキモの部分だけテストを作って、その前後で入力と出力を|>でつなぐとよいでしょう
- エントリーポイントと言えばいいですかね、AtCoderをElixirで解きたい場合には
Main.main/0
から実行されます
実行
$ mix test
...
Finished in 0.07 seconds
2 doctests, 1 test, 0 failures
Randomized with seed 687098
提出
Wrapping Up
- 今日のポイントは、Doctestです
-
AtCoderを解く時には
Main.main/0
を用意します- ちなみに私は何の自慢にもなりませんが、このA問題を解くのはそれほど時間はかかりませんでしたが、C問題あたりからはめちゃくちゃ時間がかかっています
- 次回は、何にしようかな(ネタ検討中)
- 来週を待ちきれない方は、リソースやコミュニティの情報を Where to go next にまとめていますのでダイブしてください!
- Enjoy!!!