はじめに
- @u2dayo さんの【AtCoder解説】PythonでABC177のA,B,C問題を制する!を拝見しまして、私はElixirでやってみようとおもいました
問題
- AtCoder Beginner Contest 177
- A〜Cまで解いてみます
問題A - Don't be late
- 問題文はリンク先をご参照くださいませ
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
- 問題文はリンク先をご参照くださいませ
-
元の記事の解説をとても参考にしました
- ありがとうございます!
- ありがとうございます!
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
- Enum.chunk_every/4が大活躍です!
- 提出
問題C - Sum of product of pairs
- 問題文はリンク先をご参照くださいませ
-
元の記事の解説をとても参考にしました
- ありがとうございます!
- ありがとうございます!
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.reduce/3が大活躍です!
- 提出
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