LoginSignup
14
1

More than 1 year has passed since last update.

forとEnum.with_indexを巧みに使って、文字列からマップを楽しく作る(Elixir)

Last updated at Posted at 2022-05-06

大江山いく野の道の遠ければまだふみも見ずあまの橋立

Advent Calendar 2022 112日目1の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私のAdvent Calendar 2022 一覧


はじめに

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

こういう文字列があったときに

input = """
2199943210
3987894921
9856789892
8767896789
9899965678
"""

次のようなマップを作りたいとおもいます。

%{
  {0,0} => 2,
  {0,1} => 1,
  {0,2} => 9,
  ...
  {4,8} => 7,
  {4,9} => 8
}

マップですので、順番はこの通りにはならなくてよいです2
要は、左上が{0, 0}、右下が{4, 9}の座標という具合です。

どうするとよいでしょうか。

答え

答えは畳んでおきますのでお時間のある方は考えてみてください。
タイトルの通り、for/1Enum.with_index/2を使うとよいです。

お手本
grid =
  for {line, row} <- Enum.with_index(input |> String.split("\n", trim: true)),
      {number, col} <- Enum.with_index(line |> String.to_charlist()),
      into: %{} do
    {{row, col}, number - ?0}
  end

どうでしょうか!
for/1Enum.with_index/2が巧みに利用されているように私には見えます!

種明かし

上記の問題をJosé Valim3さんが解いている動画があります。
インプットの読み取りと下準備に関するJosé Valim3さんのコードをみて、私は「格好いい!」「カッチョいい!」とおもいました。
そこで、ここだけ切り出して記事にしておきました。


Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

Enjoy Elixir:bangbang::bangbang::bangbang:
$\huge{Enjoy\ Elixir🚀}$

以上です。


I organize autoracex.
And I take part in NervesJP, fukuoka.ex, EDI, tokyo.ex, Pelemay.
I hope someday you'll join us.

We Are The Alchemists, my friends!

  1. @kaizen_nagoya さんの「「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 1日目 Most Breakthrough Generator」から着想を得て、模倣いたしました。

  2. マップですので、順番はこの通りにはなりません。

  3. ご存知の通り、そうです! Elixirの作者です:bangbang: 2

14
1
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
14
1