はじめに
- Elixirでやってみました
問題
- AtCoder Beginner Contest 170
- A〜Cまで解いてみます
- 今回は自力で行けました!
準備
$ mix new at_coder
$ cd at_coder
問題A - Five Variables
- 問題文はリンク先をご参照くださいませ
lib/abc_170_a.ex
defmodule Abc170A do
def main do
IO.read(:line)
|> String.trim()
|> String.split(" ")
|> Enum.map(&String.to_integer/1)
|> solve()
|> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc170/tasks/abc170_b
## Examples
iex> Abc170A.solve([0, 2, 3, 4, 5])
1
iex> Abc170A.solve([1, 2, 0, 4, 5])
3
"""
def solve(list) do
Enum.find_index(list, &(&1 == 0)) + 1
end
end
-
## Examplesのところに書いてあるものは、Doctestsと呼ばれるものでしてテストができます- 詳しくはExUnit.DocTestをご参照ください
- 解答のキモとなる関数について、問題に書いてある入力例をインプットして出力例の通りアウトプットされるかを確かめています
-
test/at_coder_test.exsに設定を足しておきましょう
test/at_coder_test.exs
defmodule AtCoderTest do
use ExUnit.Case
doctest Abc170A
$ mix test
..........
Finished in 0.2 seconds
9 doctests, 1 test, 0 failures
-
提出の際にはモジュール名は
Mainにしておいてください -


- 以下、B問題、C問題を解いていきます
問題B - Crane and Turtle
lib/abc_170_b.ex
defmodule Abc170B do
def main do
[x, y] =
IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
solve(x, y)
|> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc170/tasks/abc170_b
## Examples
iex> Abc170B.solve(3, 8)
"Yes"
iex> Abc170B.solve(2, 100)
"No"
iex> Abc170B.solve(1, 2)
"Yes"
"""
def solve(x, y) when y - 2 * x >= 0 and x - div(y - 2 * x, 2) >= 0 and rem(y - 2 * x, 2) == 0,
do: "Yes"
def solve(_x, _y), do: "No"
end
-
提出の際にはモジュール名は
Mainにしておいてください -


問題C - Forbidden List
- 問題文はリンク先をご参照くださいませ
lib/abc_170_c.ex
defmodule Abc170C do
def main do
[x, n] =
IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
if n > 0 do
IO.read(:line)
|> String.trim()
|> String.split(" ")
|> Enum.map(&String.to_integer/1)
|> solve(x)
|> IO.puts()
else
IO.read(:line)
solve([], x)
|> IO.puts()
end
end
@doc ~S"""
https://atcoder.jp/contests/abc170/tasks/abc170_c
## Examples
iex> Abc170C.solve([4, 7, 10, 6, 5], 6)
8
iex> Abc170C.solve([4, 7, 10, 6, 5], 10)
9
iex> Abc170C.solve([], 100)
100
"""
def solve([], x), do: x
def solve(list, x) do
0..100
|> Enum.reduce_while(x, fn i, acc ->
minus_one = x - i
if !(minus_one in list) do
{:halt, minus_one}
else
plus_one = x + i
if !(plus_one in list) do
{:halt, plus_one}
else
{:cont, acc}
end
end
end)
end
end
-
提出の際にはモジュール名は
Mainにしておいてください -


Wrapping Up
- Enjoy Elixir!!!


