はじめに
- @u2dayo さんの【AtCoder解説】PythonでABC176のA,B,C問題を制する!を拝見しまして、私はElixirでやってみようとおもいました
問題
- AtCoder Beginner Contest 176
- A〜Cまで解いてみます
準備
$ mix new at_corder
$ cd at_corder
問題A - Takoyaki
- 問題文はリンク先をご参照くださいませ
lib/at_coder_176_a.ex
defmodule AtCoder176A do
def main do
[n, x, t] =
IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
solve(n, x, t) |> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc176/tasks/abc176_a
## Examples
iex> AtCoder176A.solve(20, 12, 6)
13
iex> AtCoder176A.solve(1000, 1, 1000)
1000000
"""
def solve(n, x, t) do
_solve(n, x, t)
end
defp _solve(n, x, t) when rem(n, x) == 0, do: div(n, x) * t
defp _solve(n, x, t), do: (div(n, x) + 1) * t
end
-
## Examplesのところに書いてあるものは、Doctestsと呼ばれるものでしてテストができます- 詳しくはExUnit.DocTestをご参照ください
- 解答のキモとなる関数について、問題に書いてある入力例をインプットして出力例の通りアウトプットされるかを確かめています
-
test/at_coder_test.exsに設定を足しておきましょう
test/at_coder_test.exs
defmodule AtCoderTest do
use ExUnit.Case
doctest AtCoder176A
$ mix test
..........
Finished in 0.2 seconds
9 doctests, 1 test, 0 failures
-
提出の際にはモジュール名は
Mainにしておいてください -


- 以下、B問題、C問題を解いていきます
問題B - Multiple of 9
- 問題文はリンク先をご参照くださいませ
lib/at_coder_176_b.ex
defmodule AtCoder176B do
def main do
IO.read(:line)
|> String.trim()
|> solve()
|> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc176/tasks/abc176_b
## Examples
iex> AtCoder176B.solve("123456789")
"Yes"
iex> AtCoder176B.solve("0")
"Yes"
iex> AtCoder176B.solve("31415926535897932384626433832795028841971693993751058209749445923078164062862089986280")
"No"
"""
def solve(n) do
n
|> String.split("")
|> tl()
|> List.delete_at(-1)
|> Enum.map(&String.to_integer/1)
|> Enum.sum()
|> rem(9)
|> do_solve()
end
defp do_solve(0), do: "Yes"
defp do_solve(_), do: "No"
end
- この問題では入力で与えられた整数の各桁を足す必要があります
- たとえば
String.split("123456789", "")を実行してみると以下のようになります
$ iex -S mix
iex> String.split("123456789", "")
["", "1", "2", "3", "4", "5", "6", "7", "8", "9", ""]
- 先頭と末尾の
""を除外するために、tl/1とList.delete_at/2を使っています- List.delete_at/2を2回使ったり、Enum.reject/2で除外するでもよいです
-
提出の際には、モジュール名は
Mainにしてください -


問題C - Step
- 問題文はリンク先をご参照くださいませ
lib/at_coder_176_c.ex
defmodule AtCoder176C do
def main do
IO.read(:line)
list = IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
solve(list) |> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc176/tasks/abc176_c
## Examples
iex> AtCoder176C.solve([2, 1, 5, 4, 3])
4
iex> AtCoder176C.solve([3, 3, 3, 3, 3])
0
"""
def solve(list) do
list
|> Enum.reduce({List.first(list), 0}, fn a, {max, sum_of_steps} ->
if a < max do
{max, sum_of_steps + (max - a)}
else
{a, sum_of_steps}
end
end)
|> elem(1)
end
end
- Enum.reduce/3が大活躍です!
-
提出の際には、モジュール名は
Mainにしてください -

