Open6

ElixirでAtCoder

fufu

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

fufu

Main.main()で実行できるような形で書く必要があるらしい。
記念すべきElixirでの初ACだけど、メモリ使用量多い、実行時間遅い。
https://atcoder.jp/contests/abc323/submissions/46457006

動作確認は、elixirc a.exsでコンパイルしたあと、iex起動して、Main.main()を実行。
もっと簡単な動作確認の方法がありそう。

fufu

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

https://atcoder.jp/contests/abc323/submissions/46459352

  • パイプ演算子で繋いでいくのは関数型っぽい
  • リスト操作はEnumモジュール
  • defpはモジュール内のみで呼び出せる関数らしい。ヘルパー関数的な感じで、ifでの分岐が不要
  • 実行時間、メモリは全然変わってない。効率悪い書き方しているんだろうな。
fufu

標準入力から1つだけ値を受け取る場合は、こんな感じのフォーマットになりそうだな。

defmodule Main do
  def main do
      IO.read(:line)
      |> String.trim
      |> String.to_integer
      # ここで問題を解く
      |> IO.puts
  end
end

# 動作確認用なので提出時は削除する
Main.main()

動作確認

elixr ファイル名.exs
# 標準入力からデータ渡す
fufu

標準入力からの取得を関数化

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()