※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目
7日目です。
タイトルは、「No Space Left On Device」。デバイスにスペースが残っていません、とのこと。
7日目は諦めた人が多そうです。見た瞬間にこの汚いデータをどう加工しようか、とみなさんため息を漏らすような問題でした。
入力データとしては、以下のようになっています。いつかどこかで見たような風景です。
$ cd /
$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 k
そう、フォルダをlsコマンドで見たときにこのような光景を目にすると思います。これを各フォルダごとに合計を取る必要があり、さらに親フォルダから見たときのサブフォルダ込の合計容量を取得する必要があります。
Part1は、容量が100000以下のフォルダの容量の合計を取得する問題。
Part2は、70000000の容量のPCの空きフォルダを30000000空けたいので、今消費しているサイズからどのフォルダを消せば空けたいサイズをあけられるか、その容量を出力する問題です。
勝負は、各フォルダのサブフォルダ込の容量を出すことです。あとの最後の条件付はおまけみたいなものです。
・ネ
・
・タ
・
・バ
・
・レ
解いてみる
時間の都合上、ワークフローのみ掲載します(後で時間があるときに詳細記載します)。
マクロを使った初期バージョン
マクロ:
試行錯誤で最初の集計ツールまでが冗長になっています。もっと短縮が可能です。最初の集計ツールまでが各フォルダ直下の容量までを計算したもので、マクロの中でサブフォルダ込の容量を計算しています。正直マクロのところで非常に時間が取られました。
マクロをなくして行生成ツールで対応したバージョン
一度答えにたどり着くとワークフローを大きくブラッシュアップできます。マクロを使わずに構築するにはやはり行生成ツールと複数行フォーミュラツールがキーです。行生成ツールでサブフォルダ込の容量のベースまで計算しています(その後の集計ツールでサブフォルダ込の容量の合計を取っています)。
ちなみに、行生成ツールでいけるというひらめきはお風呂の中で思いつきました。最初解いているときはこういうひらめきがなかったんですよね・・・。
まとめ
- 7日目は実世界の問題に近かったので、わかりやすい問題ではありましたが、入力が汚すぎて見た瞬間やめた人もいるような問題でした。
- 最速の人でも59分。これまでで一番難易度が高い問題でした。
- 個人タイム:Part1 2時間4分59秒、Part2 2時間30分34秒(Private Leaderboardで7位)
※集中して時間が取れなかったので思った以上に時間がかかりました・・・
コメント