Advent of Codeをデータ分析ツールAlteryxでやってみるシリーズ、2024年9日目です。
※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目、7日目、8日目。
Day 09「Disk Fragmenter」
タイトルは「ディスクデフラグメンター」。そうです、Windowsのデフラグです。
インプットは、ディスクの状態を表すヘッダーです。
2333133121414131402
頭から、1文字ずつ、ファイルの数、空き領域の数が交互に現れています。そして、先頭からの位置はファイルと空き領域をセットにして考えなければいけませんが、ファイルのIDになります。すなわち、上の数字は、
00...111...2...333.44.5555.6666.777.888899
というのを表しています。
もっと簡単な例でいくと、
12345
とあると、まず、ID1のファイルが1つあり、次の2は2ファイル保存できる空き領域があり、ID2のファイルが3つあり、4つのファイルを記憶できる空き領域があり、ID3のファイルが5つある、という意味です。つまり、以下のようになります。数字はIDが表示されています。
0..111....22222
考え方としては
ID :0 1 2
File :1 3 5
Empty:2 4
と考えるとわかりやすいです。
そしていよいよデフラグしますが、一番右側のファイルを一番左側の空き領域に持っていく、ということを繰り返します。つまり以下のようになります。
0..111....22222
02.111....2222.
022111....222..
0221112...22...
02211122..2....
022111222......
最終的には一番最後の行になります。このときパズルの答えは、先頭からの位置(0スタート)×数値を合計したものになります。
Part2では、デフラグのやり方が変わり、ファイルを分断せず、まるっと左に移動していきます。ちなみに、すべてのファイルをIDの大きい順に一度だけ移動する、ということになります。
00...111...2...333.44.5555.6666.777.888899
0099.111...2...333.44.5555.6666.777.8888..
0099.1117772...333.44.5555.6666.....8888..
0099.111777244.333....5555.6666.....8888..
00992111777.44.333....5555.6666.....8888..
一番最後が最終形です。
・ネ
・
・タ
・
・バ
・
・レ
Part1,2を解いてみる
なんか楽勝っぽく見えてなかなか解かせてくれない、、、そもそも展開するだけでそれなりの労力です・・・。ちょっと今年は全体的に重めです・・・。
Part1は、ファイルを1行ずつに分解し、空き領域を逆順にして行位置で結合する、といった技で解決しました。これだとあまり複雑なことを考えることはありません。ただ、空き領域の方が多くてやりすぎるとおしりの方がちょっとおかしくなるのでそこの処理をどうするか、がポイントでした。
Part2はマクロです。行ごとにすべて分解すると大変なので、ファイルの数と空き領域を計算しながらおしりから空き領域に一つずつ突っ込んでいきます。全部でIDが10000まであるので、10000回繰り返すだけです。
ポイントは、ファイルが移動したあとに空き領域が連続するので、そこをうまく結合してあげないと思ったようにファイルを詰めることができません。ここが最後に気づいたポイントで、結局最初に作ったマクロは作り直しとなりました(最初は空き領域だけ繰り返しで持っておけば良い、と思っていたのですが、結局ファイル部分も持っていないと連続した空き領域の結合処理ができない、ということでした。
まとめ
- Part1は、最初1行に展開してがんばっていたのですが、5Gのファイルが出来上がった上、うまくいかない、ということになってしまって諦めました。
- ほんと今年は重い。
- Private Leaderboardでは、Part1が15位、Part2は11位でした。今夜は残業でスタートがかなり遅くなったのでしょうがない・・・。Part1とPart2の間でお風呂に入ったり、、、もうゆったりモードです。早い人でも1時間30分は超えてますね・・・。
- このタイプの問題はあまりAlteryxが得意としない問題な気がします・・・。
- 重い。
コメント