AtCoder ABC181 に参加してきた
今回は A, B, C, D まで解けた。目標のD問題まで解けたのでとりあえずよし・・・?
パフォーマンス1000超えるかなって思ったけど、超えなかったのでそこは残念。
A - Heavy Rotation
偶奇見るだけ。
A問題はうっかりでWA出しそうで怖い。。
defmodule Main do def read_single() do IO.read(:line) |> String.trim() |> String.to_integer() end def main() do case rem(read_single(), 2) do 0 -> "White" 1 -> "Black" end |> IO.puts() end end
B Trapezoid Sum
elixirには a..b |> Enum.sum()
という便利関数があるので、それ使うだけ。
defmodule TrapezoidSum.Main do def read_single() do IO.read(:line) |> String.trim() |> String.to_integer() end def main() do _ = read_single() IO.binstream(:stdio, :line) |> Stream.map(&String.trim/1) |> Stream.map(&(String.split(&1, " ") |> Enum.map(fn i -> String.to_integer(i) end))) |> Stream.map(fn [a, b] -> Enum.sum(a..b) end) |> Enum.to_list() |> Enum.sum() |> IO.puts() end end
C Collinearity
適当な3点を選んで傾き見るだけ。解説の0除算を避ける方法はなるほどと思った。
a = (y2 - y1) * (x3 - x1) b = (y3 - y1) * (x2 - x1) if a == b do
こんな感じになるのかな。覚えておこう。
defmodule Collinearity.Main do def read_single() do IO.read(:line) |> String.trim() |> String.to_integer() end def read_multi_array() do IO.read(:all) |> String.split("\n") |> Enum.filter(fn s -> String.length(s) > 0 end) |> Enum.map(&(String.split(&1, " ") |> Enum.map(fn i -> String.to_integer(i) end))) end def combination(_, 0), do: [[]] def combination([], _), do: [] def combination([x | xs], n) do for(y <- combination(xs, n - 1), do: [x | y]) ++ combination(xs, n) end def main() do _n = read_single() xys = read_multi_array() combination(xys, 3) |> Enum.reduce_while("No", fn [[x1, y1], [x2, y2], [x3, y3]],_ -> a = if x1 != x2, do: (y2 - y1) / (x2 - x1), else: :inf b = if x1 != x3, do: (y3 - y1) / (x3 - x1), else: :inf if a == b do {:halt, "Yes"} else {:cont, "No"} end end) |> IO.puts() end end
D Hachi
8の倍数になる条件は下3桁が8の倍数かどうからしい。
与えられた数字列の各数字について min(出現回数, 3)
だけ複製した配列を作って、全探索した。
最大でも 27個しか要素がないので、 3つずつの全探索しても余裕ですね。
入力が2桁以下の場合の考慮を忘れてWA出してしまったのがもったいなかった。。。
defmodule Hachi.Main do def permutation(_, 0), do: [[]] def permutation(list, n) do for x <- list, rest <- permutation(list -- [x], n - 1), do: [x | rest] end def main() do s = IO.read(:line) |> String.trim() |> String.split("") |> Enum.filter(&(String.length(&1) > 0)) |> Enum.map(&String.to_integer/1) |> Enum.frequencies |> Map.to_list() |> Enum.map(fn {i, c} -> count = min(3, c) for _ <- 1..count, do: i end) |> List.flatten() s |> permutation(min(3, length(s))) |> Enum.reduce_while("No", fn a, _ -> cond do Integer.undigits(a) |> rem(8) == 0 -> {:halt, "Yes"} true -> {:cont, "No"} end end) |> IO.puts() end end