LoginSignup
9
0

闘魂Elixir ── Advent of code 2023 Day 2 Part 1 を Livebook で楽しむ

Last updated at Posted at 2023-12-24

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

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

はじめに

@torifukukaiou さんの パク リスペクト記事です

Elixir Livebook で Advent of Code 2023 の問題を解いてみます

実装したノートブックはこちら

問題はこちら

セットアップ

Kino AOC をインストールします

Mix.install([
  {:kino_aoc, "~> 0.1.5"}
])

Kino AOC の使い方はこちらを参照

入力の取得

Day 2 の入力を取得します

スクリーンショット 2023-12-24 22.44.16.png

私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

details

まずは入力を使いやすい形にパースします

games =
  puzzle_input
  |> String.split("\n")
  |> Enum.into(%{}, fn line ->
    [title, items] = String.split(line, ":")

    game_num =
      title
      |> String.replace("Game ", "")
      |> String.to_integer()

    game =
      items
      |> String.split(";")
      |> Enum.map(fn subsets ->
        subsets
        |> String.split(",")
        |> Enum.into(%{}, fn subset ->
          [_, number, color] = String.split(subset, " ")
          {color, String.to_integer(number)}
        end)
      end)

    {game_num, game}
  end)

ゲーム ID をキーとして、それぞれのゲームの内容を配列で持っています

各ゲーム内のサブセットについて、実行可能かどうかのチェック用関数を用意します

games
|> Enum.map(fn {_game_num, game} ->
  ["red", "green", "blue"]
  |> Enum.map(fn color ->
    game
    |> Enum.map(&Map.get(&1, color, 0))
    |> Enum.max()
  end)
  |> Enum.product()
end)
|> Enum.sum()

まとめ

パターンマッチがいい感じに使えたので満足です

Day2 Part2 はこちら

9
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
9
0