LoginSignup
5
0

More than 1 year has passed since last update.

鞭声粛粛夜河を渡る

Advent Calendar 2022 2日目1です。
私のAdvent Calendar 2022 一覧

はじめに

Elixirを楽しんでいますか:bangbang::bangbang::bangbang:

2021/12/26(日)に行われた「tokyo.ex #14」にて、@ohr486さんが「IEx2での生活改善!」をテーマに発表されました。
ありがとうございました!
詳しくは発表資料をご覧ください。

この記事では、require IEx; IEx.pryを使って、Enum.reduce/3の第3引数に指定した関数がどんなふうに呼び出されるのかをデモしてみます。

発表資料のタイトルは
$\huge{IEx\ maniacs}$
です。

なお当日の様子は、以下をご参照ください。

require IEx; IEx.pry デモ

題材は、AtCoderB - 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 :lgtm::lgtm::lgtm::lgtm:

Enjoy Elixir:bangbang::bangbang::bangbang:

あなたも「IEx maniacs」をご覧になって、快適なIExライフをぜひお楽しみください:rocket::rocket::rocket:
@ohr486さん、ありがとうございます!

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0