中野's workspace

  • Profile
  • Privacy
  • Contact

2022/04/20

Atcoder ABC044 A,BをElixirで解く

  • #atcoder
  • #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挑戦している方が少なく、参考にし辛いのが悲しいところ。

このエントリーをはてなブックマークに追加
  • Copyright © 2019. Makoto Nakano
  • ALL Tags