2022/04/18
Atcoder ABC043 A,B,Cを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が解消できず諦めた。
そのうちハードルになりそうな気もしている。
どこかでより効率的な書き方を調べていかねば。