はじめに
- Elixirでやってみました
問題
- AtCoder Beginner Contest 163
- A〜Cまで解いてみます
準備
$ mix new at_coder
$ cd at_coder
問題A - Circle Pond
- 問題文はリンク先をご参照くださいませ
lib/abc_163_a.ex
defmodule Abc163A do
def main do
IO.read(:line) |> String.trim() |> String.to_integer() |> solve() |> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc163/tasks/abc163_c
## Examples
iex> Abc163A.solve(1)
6.283185307179586
iex> Abc163A.solve(73)
458.67252742410977361942
"""
def solve(r) do
2 * :math.pi() * r
end
end
-
## Examples
のところに書いてあるものは、Doctestsと呼ばれるものでしてテストができます- 詳しくはExUnit.DocTestをご参照ください
- 解答のキモとなる関数について、問題に書いてある入力例をインプットして出力例の通りアウトプットされるかを確かめています
-
test/at_coder_test.exs
に設定を足しておきましょう
test/at_coder_test.exs
defmodule AtCoderTest do
use ExUnit.Case
doctest Abc163A
$ mix test
..........
Finished in 0.2 seconds
9 doctests, 1 test, 0 failures
-
提出の際にはモジュール名は
Main
にしておいてください -
- この調子で以下、B問題、C問題を解いていきます
問題B - Homework
lib/abc_163_b.ex
defmodule Abc163B 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(n)
|> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc163/tasks/abc163_b
## Examples
iex> Abc163B.solve([5, 6], 41)
30
iex> Abc163B.solve([5, 8], 10)
-1
iex> Abc163B.solve([5, 6], 11)
0
"""
def solve(list, n) do
do_solve(Enum.sum(list), n)
end
defp do_solve(work_sum, n) when n >= work_sum, do: n - work_sum
defp do_solve(_, _), do: -1
end
-
提出の際にはモジュール名は
Main
にしておいてください -
問題C - management
- 問題文はリンク先をご参照くださいませ
lib/abc_163_c.ex
defmodule Abc163C do
def main do
n = IO.read(:line) |> String.trim() |> String.to_integer()
IO.read(:line)
|> String.trim()
|> String.split(" ")
|> Enum.map(&String.to_integer/1)
|> solve()
|> (fn map -> 1..n |> Enum.map(&Map.get(map, &1, 0)) end).()
|> Enum.join("\n")
|> IO.puts()
end
@doc ~S"""
https://atcoder.jp/contests/abc163/tasks/abc163_c
## Examples
iex> Abc163C.solve([1, 1, 2, 2])
%{1 => 2, 2 => 2}
"""
def solve(list), do: list |> Enum.frequencies()
end
-
Enum.frequencies/1を使えば解けることに気づけばしめたものです
-
@QWYNG さんのプルリクに感謝です
- OSSとしてのElixir
-
@QWYNG さんのプルリクに感謝です
- もうひとつポイントはIO.puts/2の呼び出しを一回にすることです
- 以下のように何度もIO.puts/2を呼び出す書き方をするとタイムアウトエラーになります
|> solve()
|> (fn map -> 1..n |> Enum.map(&Map.get(map, &1, 0)) end).()
|> Enum.each(&IO.puts/1)
-
提出の際にはモジュール名は
Main
にしておいてください
Wrapping Up
- 今回は自力でいけました!
- Enjoy Elixir!!!