LoginSignup
8
2
記事投稿キャンペーン 「2024年!初アウトプットをしよう」

闘魂Elixir ── 表の整形「次の行のデータを使って列を加えることをElixirで楽しむ」

Last updated at Posted at 2024-01-02

$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$

$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$

この記事は、2024年に私が書いたはじめての記事です。

はじめに

こういう表があったとします。動画の目次と開始秒数だと思ってください。titlestartの順番は狂うことなく正しくならんでいるものとします。

title start
:a 0
:b 79
:c 123

この表にending列を足します。endingは次の行のstartとします。具体的にはこんな感じです。

title start ending
:a 0 79
:b 79 123
:c 123 nil

最後の行のendingには動画の総時間数を入れればよいでしょう。この記事で伝えたいことの本質とはズレるので、ここではnilにすることとします。

Elixirでは、たとえばこんな変換をする感じです。InputとOutputを示して説明します。

Input

Inputはマップのリストで表現します。

[
  %{title: :a, start: 0},
  %{title: :b, start: 79},
  %{title: :c, start: 123}
]

Output

アウトプットはリストの各要素のマップに:endingキーと値が追加されます。

[
  %{title: :a, start: 0, ending: 79},
  %{title: :b, start: 79, ending: 123},
  %{title: :c, start: 123, ending: nil}
]

さて、Elixirではどうやって書くとよいでしょうか。

What is Elixir ?

Elixirという素敵なプログラミング言語があるのですね。
その素敵具合は「Elixir Saves Pinterest $2 Million a Year In Server Costs」によく現れています。開発者も経営者もこの事実に瞠目することでしょう。 $2 Million/年の節約ですってよ!、奥さん。


Elixirで、プログラミング グー:thumbsup:グー:thumbsup:グー:thumbsup:グー:thumbsup:グー:thumbsup:グー:thumbsup:グー:thumbsup:グー:thumbsup:グー:thumbsup:

四の五の言わずにElixirでプログラミングします。
いろいろやり方はあるとおもいますが、主にEnum.reduce/3を使って実装してみます。

まずは愚直に実装

まずは愚直に実装してみます。

list = [%{title: :a, start: 0}, %{title: :b, start: 79}, %{title: :c, start: 123}]

list
|> Enum.reduce({[], 0}, fn %{title: title, start: start}, {acc, index} ->
  next = Enum.at(list, index + 1)
  ending = if next, do: next.start

  {acc ++ [%{title: title, start: start, ending: ending}], index + 1}
end)
|> elem(0)

注目している行の次の行の値をとって処理しています。エクセルで人が操作するときの手順に近いかもしれません。

これでも所望の結果は得られます。
しかしながら、Inputの行数が大きくなるとEnum.at/3の呼び出しのところが問題となりそうです。

逆順にして処理する

list = [%{title: :a, start: 0}, %{title: :b, start: 79}, %{title: :c, start: 123}]

list
|> Enum.reverse()
|> Enum.reduce({[], nil}, fn %{title: title, start: start}, {acc, ending} ->
  {[%{title: title, start: start, ending: ending} | acc], start}
end)
|> elem(0)

さきほどの例よりこちらのほうがよいとおもいます。なんとなく関数型言語っぽい感じがします。
アウトプットのリストを作る際に|を使って、先頭に追加するのもGoodな気がします。
逆から処理しているからこそこれが使えるのですね。(まあ、前の例でも使えないことはないです。最後にリバースすれば)

さいごに

次の行のデータを使って列を加えることをElixirで楽しみました。

こんなふうにやるといいよ! と思いつかれた方はぜひぜひお便りをください。

本年もどうぞよろしくお願いいたします。


人類は不老不死の霊薬を意味する素敵なプログラミング言語Elixirを手に入れました。並行処理を他のプログラミング言語よりも比較的容易に書くことができます。それはきっとコンピュータ資源を有効活用できることにつながるでしょう。巡り巡って世界平和に貢献できることでしょう。

さあ、そこのあなたもElixirの世界へようこそ。
手始めにエリクサーチなんていかがでしょうか。私のオススメです。


闘魂とは、 「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。


$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$

8
2
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
8
2