はじめに
- Elixirでやってみました
問題
- AtCoder Beginner Contest 161
- A〜Cまで解いてみます
準備
$ mix new at_coder
$ cd at_coder
問題A - ABC Swap
- 問題文はリンク先をご参照くださいませ
lib/abc_161_a.ex
defmodule Abc161A do
def main do
[x, y, z] =
IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
solve(x, y, z) |> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc161/tasks/abc161_a
## Examples
iex> Abc161A.solve(1, 2, 3)
"3 1 2"
iex> Abc161A.solve(100, 100, 100)
"100 100 100"
iex> Abc161A.solve(41, 59, 31)
"31 41 59"
"""
def solve(x, y, z) do
[z, x, y] |> Enum.join(" ")
end
end
-
## Examples
のところに書いてあるものは、Doctestsと呼ばれるものでしてテストができます- 詳しくはExUnit.DocTestをご参照ください
- 解答のキモとなる関数について、問題に書いてある入力例をインプットして出力例の通りアウトプットされるかを確かめています
-
test/at_coder_test.exs
に設定を足しておきましょう
test/at_coder_test.exs
defmodule AtCoderTest do
use ExUnit.Case
doctest Abc161A
$ mix test
..........
Finished in 0.2 seconds
9 doctests, 1 test, 0 failures
-
提出の際にはモジュール名は
Main
にしておいてください -
- この調子で以下、B問題、C問題を解いていきます
問題B - Popular Vote
lib/abc_161_b.ex
defmodule Abc161B do
def main do
[_n, m] =
IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
IO.read(:line)
|> String.trim()
|> String.split(" ")
|> Enum.map(&String.to_integer/1)
|> solve(m)
|> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc161/tasks/abc161_b
## Examples
iex> Abc161B.solve([5, 4, 2, 1], 1)
"Yes"
iex> Abc161B.solve([380, 19, 1], 2)
"No"
iex> Abc161B.solve([4, 56, 78, 901, 2, 345, 67, 890, 123, 45, 6, 789], 3)
"Yes"
"""
def solve(list, m) do
sum = Enum.sum(list)
Enum.sort(list, :desc)
|> Enum.take(m)
|> Enum.all?(fn a ->
a * 4 * m >= sum
end)
|> if(do: "Yes", else: "No")
end
end
-
提出の際にはモジュール名は
Main
にしておいてください -
|> if(do: "Yes", else: "No")
の箇所はマイブームです -
問題C - Replacing Integer
- 問題文はリンク先をご参照くださいませ
lib/abc_161_c.ex
defmodule Abc161C do
def main do
[n, k] =
IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
solve(n, k)
|> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc161/tasks/abc161_c
## Examples
iex> Abc161C.solve(7, 4)
1
iex> Abc161C.solve(2, 6)
2
iex> Abc161C.solve(1000000000000000000, 1)
0
"""
def solve(n, k) when rem(n, k) == 0, do: 0
def solve(n, k) do
[abs(n), abs(n - div(n, k) * k), abs(n - div(n, k) * k - k)]
|> Enum.min()
end
end
-
提出の際にはモジュール名は
Main
にしておいてください
Wrapping Up
- 今回は自力でいけました!
- B問題は判定に
=
を入れていなくてWA (Wrong Answer)
を2回もだしてしまいました - C問題は以前似たような問題をやったときの経験が活きました
- B問題は判定に
- Enjoy Elixir!!!