2022/04/20
Atcoder ABC044 A,BをElixirで解く
概要
今回解いた問題一覧のリンクは下記。
https://atcoder.jp/contests/abc044
全問解けたわけではなく、ABのみ。
C - 高橋君とカード については中々ボリュームが多くなりそうな予感がしたので、別途記事を作成する。
問題
A - 高橋君とホテルイージー
defmodule Main do
def read_single_as_int() do
IO.gets("") |> String.trim |> String.to_integer
end
def read_multi_as_int(n) do
for _ <- 1..n, do: read_single_as_int()
end
def puts(n) do
IO.puts(n)
end
def main() do
4 |> read_multi_as_int |> ans
end
defp ans([n, k, x, y]) when n >= k do
k * x + (n - k) * y |> puts()
end
defp ans([n, k, x, _]) when n < k do
n * x |> puts()
end
end
引数を工夫したことにより、main部分の記述を極限まで減らしてみた。
実処理としてはn >= kの場合とn < kの場合で算出方法を変えただけなのでとても単純。
パターンマッチによってif文を消せるのがとても良いと感じた。
B - 美しい文字列
defmodule Main do
def read_single_as_string() do
IO.gets("") |> String.trim
end
def puts(n) do
IO.puts(n)
end
def main() do
read_single_as_string()
|> String.trim(" ")
|> String.split("")
|> Enum.reduce(%{}, fn x, acc -> Map.update(acc, x, 1, &(&1 + 1)) end)
|> Enum.all?(fn {_, x} -> rem(x, 2) == 0 end)
|> ans
end
defp ans(bool) when bool == true, do: puts("Yes")
defp ans(bool) when bool == false, do: puts("No")
end
文字列を1文字ずつ分割してそれぞれカウントアップしたものを生成。
その後Enum.allで全ての要素が偶数回出現しているかチェックしている。
パイプライン演算子で処理をどんどん繋げて答えを算出できるとElixir習熟度が上がってきた感があってよい。
感想
いまだに調べながらなので速度は出ないけど、Elixirに大分慣れてきた。
C問題はDPを使えば解けそうだが、Elixirでどうやるのかはちょっと難しそう。
Elixirでatcoder挑戦している方が少なく、参考にし辛いのが悲しいところ。