2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ElixirでABC176のA,B,C問題を制する!

Last updated at Posted at 2020-09-27

はじめに

問題

準備

  • Elixirをインストールしましょう
  • プロジェクトを作っておきます
$ mix new at_corder
$ cd at_corder

問題A - Takoyaki

  • 問題文はリンク先をご参照くださいませ :bow:
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と呼ばれるものでしてテストができます
  • 解答のキモとなる関数について、問題に書いてある入力例をインプットして出力例の通りアウトプットされるかを確かめています
  • 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にしておいてください
  • :tada::tada::tada:
  • 以下、B問題、C問題を解いていきます

問題B - Multiple of 9

  • 問題文はリンク先をご参照くださいませ :bow:
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", ""]

問題C - Step

  • 問題文はリンク先をご参照くださいませ :bow:
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にしてください
  • :tada::tada::tada:

Wrapping Up :qiita-fabicon:

  • 今回から解答のキモとなる関数について、問題に書いてある入力例をインプットして出力例の通りアウトプットされるかを確かめるDoctestsを書いてみました
  • Enjoy Elixir !!! :fire::rocket::rocket::rocket:
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?