3
0

More than 1 year has passed since last update.

闘魂Elixir ── Advent of Code 2022 (Day 6: Tuning Trouble)をElixirで楽しむ

Last updated at Posted at 2023-01-03

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

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

Run in Livebook

はじめに

闘魂Elixirが出会いました。
闘魂 meets Elixir.です。
Elixir meets 闘魂.でもよいです。

2022-12-26より、アドベントカレンダー2023は開幕しました。

私のアドベントカレンダー一覧は、コチラです。

だれよりも2023/12/25を楽しみにしています。

この記事は、Advent of Code 2022Day 6: Tuning Troubleを解いてみます。

Advent of Code 2022は、競技プログラミングのような問題が25題出題されています。
毎年問題が出題されておりまして、日を追うごとに難しくなる傾向があるようにおもいます。

iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}

Day 6: Tuning Trouble

問題文はこちらをご参照ください。

問題を説明します。

mjqjpqmgbljsphdztnvjfqwrcgsmlb

先頭から4つずつ見ていって、すべてに重複がない部分文字列はどこにあるのかを調べなさいという問題です。
解答は部分文字列の末尾の文字が元の文字列の先頭から数えて何文字目にあるのかを数えなさいというものです。

  • mjqj: No (jが2つあるから)
  • jqjp: No (jが2つあるから)
  • qjpq: No (qが2つあるから)
  • jpqm: Yes

この場合の答えは2回目のmの出現位置ですので、7が答えです。

本番のデータは、4095文字あります。

解答例

私はElixirで解いてみます。
Run in Livebook
Livebookをお使いの方は、上記のボタンを迷わず押すと、私の解答例をお試しいただけます!
解答例は閉じておきます。

解答例

私にとっては、Day 5のほうが難しかったです。
再帰を使いました。
本当は、Charlistsの要素数が4以下になったときにどうするんだというガードがいる気がしますが、そこはインプットデータが保証してくれているようで考慮から外しています。

input = 'mjqjpqmgbljsphdztnvjfqwrcgsmlb'
defmodule Awesome do
 def solve([{head, _} | tail]) do
   list = Enum.take(tail, 3)

   list
   |> Enum.map(fn {a, _} -> a end)
   |> Kernel.++([head])
   |> Enum.uniq()
   |> Enum.count()
   |> Kernel.>=(4)
   |> if(do: list |> Enum.at(-1) |> elem(1), else: solve(tail))
 end
end

input |> Enum.with_index(1) |> Awesome.solve()

7 が得られます。

あなたの答えをお待ちしています。
編集リクエストかコメントでくださいませ。

読者投稿コーナー

読者の方からいただいたお便りをご紹介します。

読者投稿コーナー

@mnishiguchi さん

いつもご投稿ありがとうございます!
Enum.reduce_while/3を用いて正解を導かれています。

"mjqjpqmgbljsphdztnvjfqwrcgsmlb"
|> to_charlist()
|> Enum.with_index()
|> Enum.reduce_while([], fn {x, i}, word ->
  new_word = Enum.take([x] ++ word, 4)

  case length(Enum.uniq(new_word)) do
    4 -> {:halt, i + 1}
    _ -> {:cont, new_word}
  end
end)
|> case do
  x when is_number(x) -> x
  _ -> :error
end

さいごに

この記事では、Advent of Code 2022の「Advent of Code 2022Day 6: Tuning Trouble」をElixirで解いてみました。

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

$\huge{1、2、3 ぁっダァー!}$



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

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