Open6
ElixirでAtCoder

Elixirを始めたのでAtCoderの問題を解きながら学んでいく。
A問題、シンプルなB問題はElixirでもかけるようになるとこを一旦の目標とする。

初提出はコンパイルエラー。。
手元で書いていたときはsample通ったのに。

Main.main()
で実行できるような形で書く必要があるらしい。
記念すべきElixirでの初ACだけど、メモリ使用量多い、実行時間遅い。
動作確認は、elixirc a.exs
でコンパイルしたあと、iex
起動して、Main.main()
を実行。
もっと簡単な動作確認の方法がありそう。

ChatGPTに関数型プログラミングっぽく書き直してってお願いしたコード。
defmodule Main do
def main do
IO.gets("")
|> String.trim()
|> String.split("", trim: true)
|> Enum.with_index()
|> Enum.any?(fn {char, index} -> char == "1" and rem(index, 2) == 1 end)
|> output_result()
end
defp output_result(true), do: IO.puts("No")
defp output_result(false), do: IO.puts("Yes")
end
- パイプ演算子で繋いでいくのは関数型っぽい
- リスト操作はEnumモジュール
-
defp
はモジュール内のみで呼び出せる関数らしい。ヘルパー関数的な感じで、ifでの分岐が不要 - 実行時間、メモリは全然変わってない。効率悪い書き方しているんだろうな。

標準入力から1つだけ値を受け取る場合は、こんな感じのフォーマットになりそうだな。
defmodule Main do
def main do
IO.read(:line)
|> String.trim
|> String.to_integer
# ここで問題を解く
|> IO.puts
end
end
# 動作確認用なので提出時は削除する
Main.main()
動作確認
elixr ファイル名.exs
# 標準入力からデータ渡す

標準入力からの取得を関数化
defmodule Main do
def main do
solve()
end
defp solve() do
end
defp get_n, do: IO.read(:line) |> String.trim() |> String.to_integer()
defp get_s, do: IO.read(:line) |> String.trim()
defp get_n_list, do: IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
end
Main.main()