$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと、}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだとおもいます}$
はじめに
闘魂とElixirが出会いました。
闘魂 meets Elixir.です。
Elixir meets 闘魂.でもよいです。
2022-12-26より、アドベントカレンダー2023は開幕しました。
私のアドベントカレンダー一覧は、コチラです。
だれよりも2023/12/25を楽しみにしています。
この記事は、Advent of Code 2022のDay 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で解いてみます。
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 2022のDay 6: Tuning Trouble」をElixirで解いてみました。
闘魂とは、 「己に打ち克つこと、そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。
$\huge{1、2、3 ぁっダァー!}$
$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$