AtCoder ABC181 に参加してきた

atcoder.jp

今回は 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