中野's workspace

  • Profile
  • Privacy
  • Contact

2022/04/18

Atcoder ABC043 A,B,CをElixirで解く

  • #atcoder
  • #Elixir

目次

概要

今回解いた問題一覧のリンクは下記。
https://atcoder.jp/contests/abc043

全問解けたわけではなく、ABCのみ。
D - アンバランス についてはレベルが上がってから挑戦することにした。

問題

A - キャンディーとN人の子供イージー

defmodule Main do
  def read_single_as_int() do
    IO.gets("") |> String.trim |> String.to_integer
  end

  def puts(n) do
    IO.puts(n)
  end

  def main() do
      n = read_single_as_int()

      add_til_limit(0, 1, n)
  end

  defp add_til_limit(ans, add, limit) when add != limit do
    ans + add |> add_til_limit(add + 1, limit)
  end

  defp add_til_limit(ans, add, _) do
    ans + add |> puts
  end
end

1 ~ Nまでの総数を算出するだけ
もっとスマートな方法ありそうだが。。。

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 ->
      cond do
        x == "B" -> List.delete_at(acc, length(acc)-1)
        true -> acc ++ [x]
      end
    end)
    |> puts
  end
end

Bだったら配列の最後の要素を削除。
それ以外は配列に追加している。
++での要素追加は遅いらしいが、入力される文字数が少ないので問題無し。

C - いっしょ

defmodule Main do
  def read_single_as_string() do
    IO.gets("") |> String.trim
  end

  def read_single_as_int() do
    IO.gets("") |> String.trim |> String.to_integer
  end

  def read_split_as_int() do
    read_single_as_string() |> String.split |> Enum.map(&String.to_integer/1)
  end

  def puts(n) do
    IO.puts(n)
  end

  def main() do
    _ = read_single_as_int()
    l = read_split_as_int()

    avg = Enum.sum(l)/length(l) |> Float.round() |> trunc()

    # Atcoderだと(avg - x) ** 2が使えない
    l |> Enum.reduce(0, fn x, acc -> acc + (avg - x) * (avg - x) end) |> puts
  end
end

平均を算出して、各それぞれの配列の要素と平均の差の二乗を合計している。
バージョンが古いせいか (avg - x) **2 が使えないのが気になった。

感想

気を抜くとすぐforを使いそうになるので矯正したい。

D問題も解いてみたが、TLEが解消できず諦めた。
そのうちハードルになりそうな気もしている。

どこかでより効率的な書き方を調べていかねば。

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