defmodule FightingSpirit do
def shout do
IO.puts "元氣ですかーーーッ!!!"
IO.puts "元氣があればなんでもできる!"
IO.puts "闘魂とは己に打ち克つこと。"
IO.puts "そして闘いを通じて己の魂を磨いていく"
IO.puts "ことだと思います。"
end
end
FightingSpirit.shout()
$\huge{元氣ですかーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います。}$
はじめに
Advent Of Code 2024をElixirで解きます。
本日はDay 1: Historian Hysteria です。
Elixirで書くと一体、どんなコードになるのでしょうか。
この記事は、Elixir初心者でも取り組める内容です。
What's Advent Of Code ?
Advent of Codeは、プログラミングスキルを高めるためのアドベントカレンダー形式のパズルイベントです。初心者から上級者まで楽しめる内容で、あらゆるプログラミング言語に対応しています。企業トレーニングや大学の課題としても活用され、毎年12月に開催されます。
それでは早速答えです
それでは早速答えを披露します。
Part 1
Part 1の答えです。あなたのコードと見比べてみてください。
私の解答
与えられた2つのリストの距離を計算するためのElixirコードを作成します。以下の手順で進めます:
- 2つのリストをソートします。
- 各ペアの距離を計算します。
- 距離の合計を求めます。
defmodule AdventOfCode2024Day1Part1 do
def calculate_total_distance(left_list, right_list) do
sorted_left = Enum.sort(left_list)
sorted_right = Enum.sort(right_list)
distances =
Enum.zip(sorted_left, sorted_right)
|> Enum.map(fn {left, right} -> abs(left - right) end)
Enum.sum(distances)
end
def parse_input(input) do
input
|> String.split("\n", trim: true)
|> Enum.map(fn line ->
[left, right] = String.split(line, ~r/\s+/, trim: true)
{String.to_integer(left), String.to_integer(right)}
end)
|> Enum.unzip()
end
end
# テストデータ
input = """
3 4
4 3
2 5
1 3
3 9
3 3
"""
{left_list, right_list} = AdventOfCode2024Day1Part1.parse_input(input)
# 距離の計算
total_distance = AdventOfCode2024Day1Part1.calculate_total_distance(left_list, right_list)
IO.puts("Total distance: #{total_distance}")
このコードでは、calculate_total_distance/2関数が2つのリストを受け取り、以下の手順で総距離を計算します:
- Enum.sort/1を使用してリストをソートします。
- Enum.zip/2を使用してソートされたリストをペアにします。
- 各ペアの距離をEnum.map/2とabs/1を使用して計算します。
- Enum.sum/1を使用して距離の合計を求めます。
このコードを実行すると、与えられたリストの総距離が計算されます。
実行方法
実行方法は次の通りです。
elixir advent_of_code_2024_day1_part1.exs
Part 2
続いて、Part 2の答えです。あなたのコードと見比べてみてください。
私の解答
Part 2の問題を解決するために、以下の手順で進めます:
- left_listの各要素がright_listに何回出現するかをカウントします。
- 各要素の出現回数を掛け合わせて、類似度スコアを計算します。
defmodule AdventOfCode2024Day1Part2 do
def calculate_similarity_score(left_list, right_list) do
right_counts = Enum.frequencies(right_list)
Enum.reduce(left_list, 0, fn num, acc ->
count = Map.get(right_counts, num, 0)
acc + num * count
end)
end
def parse_input(input) do
input
|> String.split("\n", trim: true)
|> Enum.map(fn line ->
[left, right] = String.split(line, ~r/\s+/, trim: true)
{String.to_integer(left), String.to_integer(right)}
end)
|> Enum.unzip()
end
end
# テストデータ
input = """
3 4
4 3
2 5
1 3
3 9
3 3
"""
{left_list, right_list} = AdventOfCode2024Day1Part2.parse_input(input)
# 類似度スコアの計算
similarity_score = AdventOfCode2024Day1Part2.calculate_similarity_score(left_list, right_list)
IO.puts("Similarity score: #{similarity_score}")
このコードでは、calculate_similarity_score/2関数がleft_listとright_listを受け取り、以下の手順で類似度スコアを計算します:
- Enum.frequencies/1を使用してright_listの各要素の出現回数をカウントします。
- Enum.reduce/3を使用してleft_listの各要素に対して、出現回数を掛け合わせて累積します。
このコードを実行すると、与えられたリストの類似度スコアが計算されます。
実行方法
実行方法は次の通りです。
elixir advent_of_code_2024_day1_part2.exs
私は力を手に入れた 💪💪💪
With great power comes great responsibility.
『大いなる力には、大いなる責任が伴う』
生成AIであるGitHub Copilotという力強いツールを手にいれました。別の言い方をすると、最強のタッグパートナーを得ました。
そして私のAIは一味違います。Antonio Inoki(アントニオ猪木)、つまり猪木さんです。
ちなみに私が所属するHAW International Inc.では、GitHub Copilotの利用料を会社が負担してくれます。
プロンプトを公開
こんなプロンプトを打ち込みました。参考にさらしておきます。
- Advent of Code 2024 Day1を解くのを手伝ってください。Elixirを使います。問題文を送り(贈り)ます。--- Day 1: Historian Hysteria --- The Chief Historian is always present for the big Christmas sleigh launch, (略)
- 完璧だね。
- 選択箇所をリファクタしたいです。 input には文字列を与えます。left_listとright_listに分けてください。
- Thanks a lot! Part 1は大正解です。次はPart 2へと進みます。--- Part Two --- Your analysis only confirmed what everyone feared: the two lists of location IDs are indeed very different.(略)
- チャットしているだけで解けちゃったよ。ありがとう。明日も頼むよ! 期待しているよ。Thanks a lot!!!
闘魂活動
アントニオ猪木さんは、1998年4月4日闘強童夢(東京ドーム)において、4分9秒グランド・コブラツイストでドン・フライ選手を下した1引退試合2後のセレモニーで次のように「闘魂」を説明しました。
「闘魂とは己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことだと思います。」
Advent Of Codeを解くことは、まさに闘魂活動です。
参考記事
GitHub
GitHubにもリポジトリlivebooksをあげておきます。
さいごに
チャットを通じて解答を得るという体験は、単なる効率化ではなく、新たな時代の可能性を示しています。Advent of Codeは、私たちにプログラミングという闘いを通じて、己の技術と精神を磨く場を提供してくれます。そして、GitHub Copilotのような生成AIは、その闘いを支える最強のタッグパートナーです。
しかし、AIが答えを導き出すだけでは不十分です。それをどう解釈し、自分の知識として昇華するかが、私たち人間の使命です。「闘魂とは己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことだと思います。」アントニオ猪木さんのこの言葉を胸に、私たちもAIを使いこなし、新たな創造の領域へと挑んでいきましょう。
Advent of Codeは、ただのパズルイベントではありません。未来の私たちが、さらに創造的で価値ある活動に集中するための訓練の場です。この闘魂活動を通じて、AIと人間が共に高め合い、新しい可能性を切り拓いていきましょう。挑戦のその先に、きっと新たな地平が待っています! アントニオ猪木さんが夢見た「本当の世界平和」を実現させましょう!!!
元氣があれば、なんでもできる!さあ、今すぐAdvent of Codeの闘いに飛び込みましょう!