鞭声粛粛夜河を渡る
Advent Calendar 2022 2日目1です。
私のAdvent Calendar 2022 一覧。
はじめに
Elixirを楽しんでいますか
2021/12/26(日)に行われた「tokyo.ex #14」にて、@ohr486さんが「IEx2での生活改善!」をテーマに発表されました。
ありがとうございました!
詳しくは発表資料をご覧ください。
この記事では、require IEx; IEx.pry
を使って、Enum.reduce/3の第3引数に指定した関数がどんなふうに呼び出されるのかをデモしてみます。
発表資料のタイトルは
$\huge{IEx\ maniacs}$
です。
なお当日の様子は、以下をご参照ください。
本日開催された tokyo.ex 14 のツイートのまとめとなります。
— Tech Inside Drecom (@DRECOM_TECH) December 26, 2021
映像に関しては別途Youtubeに上がりますので、そちらが上がりましたら一緒に楽しんでいただければと思います。https://t.co/LLpOf6mNrf #tokyoex
require IEx; IEx.pry
デモ
題材は、AtCoderのB - FizzBuzz Sum問題にします。
AtCoderは、オンラインで参加できるプログラミングコンテスト(競技プログラミング)のサイトです。リアルタイムのコンテストで競い合ったり、約3000問のコンテストの過去問にいつでも挑戦することが出来ます。
問題文はリンク先をご参照ください
例: 入力が5の場合、FizzBuzzの列は、1,2,Fizz,4,Buzz
となり、数字だけを足し算して、7が答え
今回、デモに使用するプログラムは以下です。
defmodule FizzBuzzSum do
def main do
IO.read(:line)
|> String.trim()
|> String.to_integer()
|> fizz_buzz_sum()
|> IO.puts()
end
def fizz_buzz(n) do
do_fizz_buzz(n, rem(n, 3), rem(n, 5))
end
defp do_fizz_buzz(_n, 0, 0), do: "FizzBuzz"
defp do_fizz_buzz(_n, 0, _), do: "Fizz"
defp do_fizz_buzz(_n, _, 0), do: "Buzz"
defp do_fizz_buzz(n, _, _), do: n
def fizz_buzz_sum(n) do
1..n
|> Enum.reduce(0, fn i, acc ->
fizz_buzz(i)
|> to_i()
|> Kernel.+(acc)
end)
end
defp to_i("Fizz"), do: 0
defp to_i("Buzz"), do: 0
defp to_i("FizzBuzz"), do: 0
defp to_i(i), do: i
end
上記プログラムの解説は、
をご参照ください。
FizzBuzzSum.fizz_buzz_sum/1
関数を少し変形します。
def fizz_buzz_sum(n) do
1..n
|> Enum.reduce(0, fn i, acc ->
result =
fizz_buzz(i)
|> to_i()
|> Kernel.+(acc)
require IEx; IEx.pry
result
end)
end
言葉で説明するより動画を見てもらったほうがより伝わるとおもいます。
YouTube動画をご覧になってくださいませ。
Wrapping up
Enjoy Elixir
あなたも「IEx maniacs」をご覧になって、快適なIExライフをぜひお楽しみください
@ohr486さん、ありがとうございます!