🎅

Advent of Code 2024 Day 9: Disk Fragmenter

2024/12/28に公開

このページは

2024 年の Advent of Code の Day9 の記事です。 Day8 はこちら。

https://zenn.dev/yasuharu519/articles/1739051153a249

Day 9: Disk Fragmenter

今回はディスク上のファイルと空き容量の配置が与えられます。指示に従って、ファイルを空き容量のスペースに移動させるといったような問題です。

23325 といったような配置情報が与えられたとき、それぞれの数字はファイルの容量と空きスペースの容量が交互に表されています。例えばこちらの表現の場合、数字をファイルを ID、. を空きスペースとすると、

00...111..22222

のようなファイル配列を表しています。

このような配列になっている状態から、指示に従ってファイルの移動を行っていくという問題です。

Part1

Part1 では、右端のファイルから順に、左端の空き容量に対してファイルを移動させるというものです。例えば先の例の

00...111..22222

の場合

00...111..22222
002..111..2222.
0022.111..222..
00222111..22...
002221112.2....
0022211122.....

といったような移動をさせるとします。

23325 というようなフォーマットで与えられるため、これらを ファイルなのか、空きスペースなのかを分類しましょう。"左端からとる"、"右端からとる" のように両端からアクセスすることを考えると、 deque などの両端キューを使うのが良さそうです。

キューに保存する際には、 "ファイルなのか空きスペースなのか"、”元々の数字の値"、"ファイルが配置されていた場所" などの情報が必要なため、それらも保存しておくようにします。

https://github.com/yasuharu519/advent-of-code-2024/blob/main/python/day9/part1.py#L9-L16

あとは、前から見たときに処理を行っていき

  • ファイルの場合はそのまま
  • 空きスペースの場合は、末尾にあるファイルを取り出して移動

といった処理を行えば良さそうです。こんな感じになりました。

https://github.com/yasuharu519/advent-of-code-2024/blob/main/python/day9/part1.py

Part2

Part2 では、Part1 とは少しルールが変わります。Part1 では、ファイルの一部だけでも空きスペースに移動させることが出来ましたが、Part2 ではファイル全体が移動できるスペースがある場合のみ移動できるものとします。

例えば

00...11..222.3333

となっていた場合、3333 を移動させるスペースがないため、移動できません。一方で、222 は移動できるため、

0022211......3333

のようになります。

考え方としては、ファイルと空きスペースを別々に管理していき、ファイルは右から処理、していき空きスペースは左から条件に合うものを探していきます。条件に合うものがあれば移動、なければ今のまま確定という処理をしていけば良さそうです。

Part1 よりはよりシンプルに考えられるかもしれません。

https://github.com/yasuharu519/advent-of-code-2024/blob/main/python/day9/part2.py

Day 10 に続きます。

https://zenn.dev/yasuharu519/articles/a89527a2d3dd60

Discussion