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 3 years have passed since last update.

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

Last updated at Posted at 2020-09-27

はじめに

問題

問題A - Don't be late

  • 問題文はリンク先をご参照くださいませ :bow:
defmodule AtCoder177A do
  def main do
    [d, t, s] =
      IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)

    solve(d, t, s) |> IO.puts()
  end

  defp solve(d, t, s) when t * s >= d, do: "Yes"

  defp solve(_, _, _), do: "No"
end

問題B - Substring

  • 問題文はリンク先をご参照くださいませ :bow:
  • 元の記事の解説をとても参考にしました
    • ありがとうございます! :lgtm::lgtm::lgtm:
defmodule Main do
  def main do
    s = IO.read(:line) |> String.trim()
    t = IO.read(:line) |> String.trim()

    solve(s, t) |> IO.puts()
  end

  def solve(s, t) do
    len = String.length(t)
    t_charlist = String.to_charlist(t)

    String.to_charlist(s)
    |> Enum.chunk_every(len, 1, :discard)
    |> Enum.map(&Enum.zip(&1, t_charlist))
    |> Enum.map(&Enum.map(&1, fn {a, b} -> a == b end))
    |> Enum.map(&Enum.count(&1, fn b -> b == false end))
    |> Enum.min()
  end
end

問題C - Sum of product of pairs

  • 問題文はリンク先をご参照くださいませ :bow:
  • 元の記事の解説をとても参考にしました
    • ありがとうございます! :lgtm::lgtm::lgtm:
defmodule Main do
  @prime 1000000007
 
  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
 
  def solve(list) do
    list
    |> Enum.reduce({Enum.sum(list), 0}, fn x, {sum, ans} ->
      sum = sum - x
      ans = ans + sum * x
      {sum, ans}
    end)
    |> elem(1)
    |> rem(@prime)
  end
end

Enum.at/3をいちいち使って書いたところTLE (Time Limit Exceeded)してしまった例

  • 最初にこれを提出して不合格をもらい、よく見直したところ、Enum.at/3でアクセスする必要はないと気づいて上のコードに書き換えました
defmodule Main 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(n, list) |> IO.puts()
  end
 
  def solve(n, list) do
    0..(n - 1)
    |> Enum.reduce({Enum.sum(list), 0}, fn i, {sum, ans} ->
      sum = sum - Enum.at(list, i)
      ans = ans + sum * Enum.at(list, i)
      {sum, ans}
    end)
    |> elem(1)
    |> rem(1000000007)
  end
end

Wrapping Up

  • 今回は元の記事の解説の解説にとてもお世話になりました :bow:
    • ありがとうございます!
    • Cまではありますし時間制限もなしでやっていますがAC (Accepted)になって嬉しくおもっています :relaxed:
  • 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?