はじめに
paizaとqiitaのコラボキャンペーンがあることをたまたま目にし、せっかくなので全く触ったことのない言語で問題を解いてみることにしました。選んだのはElixirです。理由は響きがなんかカッコよかったので。
問題
コード
n = IO.gets("") |> String.trim() |> String.to_integer()
numbers = Stream.repeatedly(fn -> IO.gets("") end) |> Stream.take(n) |> Enum.map(fn line -> String.trim(line) |> String.to_integer() end)
max_number = Enum.max(numbers)
IO.puts(max_number)
ポイント
入力の受け取り
n = IO.gets("") |> String.trim() |> String.to_integer()
IO.gets("")
で標準入力を受け取ることができます。これだけだと改行文字も含まれてしまうので、String.trim()
で改行文字を取り除き、String.to_integer()
で整数変換します。こうやって、左から右に順番に処理を進めていくのを、|>
という記号で表しているわけですが、これを「パイプライン演算子」と呼ぶらしいです。
numbers = Stream.repeatedly(fn -> IO.gets("") end) |> Stream.take(n) |> Enum.map(fn line -> String.trim(line) |> String.to_integer() end)
Stream.repeatedly(fn -> IO.gets("") end)
で1行ずつ読み込んでいきます。ストリームで受け取るのでこれだけだと無限に取ってきてしまいます。
そこで、Stream.take(n)
でn個だけ要素を取り出すように指定してあげます。これによりnumbersという名のn個の配列ができます。
Enum.map(fn line -> String.trim(line) |> String.to_integer() end)
では、n個の要素に対して改行記号の除去と、整数変換をします。
最大値を計算する
max_number = Enum.max(numbers)
Enum.max(numbers)
で、numbers
配列の中で最も数が大きいものを出力してくれるみたいです。
出力
IO.puts(max_number)
IO.puts(max_number)
で標準出力です。
おわりに
普段Pythonを使っている身としては、雰囲気がPythonに似ているので簡単な言語だと感じました。パイプライン演算子はPythonにないですが、機械学習でパイプライン処理は学んだことがあったので、理論的なところはすぐに理解できました。なのでElixirとは仲良くやっていけそうです。
一方で、記事を書くことも初めてだった訳ですが、そちらの方がずっと難しいと思いました。読みにくい部分が多々あるかと思いますが、プログラミングの技術共々上達させていきたい所存です。