はじめに
- @u2dayo さんの【AtCoder解説】PythonでABC175のA,B,C問題を制する!を拝見しまして、私はElixirでやってみようとおもいました
問題
- AtCoder Beginner Contest 175
- A〜Cまで解いてみます
準備
$ mix new at_coder
$ cd at_coder
問題A - Rainy Season
- 問題文はリンク先をご参照くださいませ
lib/at_coder_175_a.ex
defmodule AtCoder175A do
def main do
IO.read(:line)
|> String.trim()
|> solve()
|> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc175/tasks/abc175_a
## Examples
iex> AtCoder175A.solve("RRS")
2
iex> AtCoder175A.solve("SSS")
0
iex> AtCoder175A.solve("RSR")
1
"""
def solve(s) do
["RRR", "RR", "R"]
|> Enum.map(&{String.contains?(s, &1), &1})
|> Enum.filter(fn {b, _} -> b end)
|> Enum.at(0, {true, ""})
|> elem(1)
|> String.length()
end
end
-
## Examples
のところに書いてあるものは、Doctestsと呼ばれるものでしてテストができます- 詳しくはExUnit.DocTestをご参照ください
- 解答のキモとなる関数について、問題に書いてある入力例をインプットして出力例の通りアウトプットされるかを確かめています
-
test/at_coder_test.exs
に設定を足しておきましょう
test/at_coder_test.exs
defmodule AtCoderTest do
use ExUnit.Case
doctest AtCoder175A
$ mix test
..........
Finished in 0.2 seconds
9 doctests, 1 test, 0 failures
-
提出の際にはモジュール名は
Main
にしておいてください -
- 以下、B問題、C問題を解いていきます
問題B - Making Triangle
- 問題文はリンク先をご参照くださいませ
-
元の記事の解説をとても参考にしました!
- ありがとうございます!
lib/at_coder_175_b.ex
defmodule AtCoder175B do
def main do
n = IO.read(:line) |> String.trim() |> String.to_integer()
list = IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
solve(list, n) |> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc175/tasks/abc175_b
## Examples
iex> AtCoder175B.solve([4, 4, 9, 7, 5], 5)
5
iex> AtCoder175B.solve([4, 5, 4, 3, 3, 5], 6)
8
iex> AtCoder175B.solve([9, 4, 6, 1, 9, 6, 10, 6, 6, 8], 10)
39
iex> AtCoder175B.solve([1, 1], 2)
0
"""
def solve(list, n) do
for i <- 0..(n - 1),
j <- (i + 1)..(n - 1),
k <- (j + 1)..(n - 1),
l_1 = Enum.at(list, i),
l_2 = Enum.at(list, j),
l_3 = Enum.at(list, k),
l_1 != l_2,
l_1 != l_3,
l_2 != l_3,
trialgle?(l_1, l_2, l_3),
reduce: %{} do
acc -> Map.update(acc, :ok, 1, &(&1 + 1))
end
|> Map.values()
|> Enum.at(0, 0)
end
defp trialgle?(l_1, l_2, l_3) do
[a, b, c] = [l_1, l_2, l_3] |> Enum.sort()
c < a + b
end
end
-
提出の際にはモジュール名は
Main
にしておいてください -
問題C - Walking Takahashi
- 問題文はリンク先をご参照くださいませ
-
元の記事の解説をとても参考にしました!
- ありがとうございます!
lib/at_coder_175_c.ex
defmodule AtCoder175C do
def main do
[x, k, d] =
IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
solve(x, k, d) |> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc175/tasks/abc175_c
## Examples
iex> AtCoder175C.solve(6, 2, 4)
2
iex> AtCoder175C.solve(7, 4, 3)
1
iex> AtCoder175C.solve(10, 1, 2)
8
iex> AtCoder175C.solve(1000000000000000, 1000000000000000, 1000000000000000)
1000000000000000
"""
def solve(x, k, d) do
do_solve(x, k, d)
end
def do_solve(x, k, d) when div(abs(x), d) >= k, do: abs(x) - k * d
def do_solve(x, k, d) when rem(k - div(abs(x), d), 2) == 0, do: abs(x) - div(abs(x), d) * d
def do_solve(x, _k, d), do: abs(abs(x) - div(abs(x), d) * d - d)
end
-
提出の際にはモジュール名は
Main
にしておいてください -