Advent of CodeをAlteryxでやってみる1日目

Advent of code

今度はAdvent of Code(AoCと略しましょう)をAlteryxでやってみた話をしていきたいと思います。

AoCの説明は以前に行ってますので、そちらを参照してほしいですが、12月に入るとクリスマスに向けてカウントダウンされるアドベントカレンダーのコード(Code)版といったところで、1日1問出てくるお題をプログラミングで解くというカレンダーです。これをAlteryxでやってみる、というのが海外のAlteryx Communityで盛り上がってきています(コミュニティにも書きましたが、2018年くらいからCommunityの方でほんの数名でやり始めたようです)。一昨年、去年くらいからそれなりに参加人数も増えてきて、今年一気にブレイクしています。

この一連のクイズはストーリーがあるのですが、今年はジャングルをさまよう必要があるようです(去年は海の中の洞窟などを探検しているストーリーでした)。

さて、例年1問目はそれほど難しくなく、たいてい複数行フォーミュラなどが使えれば問題なく解けるような問題です。タイトルは「Calorie Counting」、カロリーカウントですね!

1問目は以下のようなデータが与えられ、5人のエルフがそれぞれのカロリーの食べ物を運んでいるという設定になっています。つまり、空白行で区切られており、それぞれが1人分の運んでいる食料ということになります。

1000
2000
3000

4000

5000
6000

7000
8000
9000

10000

つまり、5人のエルフは、

1000+2000+3000 = 6000
4000
5000+6000 = 11000
7000+8000+9000 = 24000
10000

のカロリーを持っているということになります。まず、この中から最大のカロリーを持っているエルフのカロリー数を答える、というのが問題のPart1です。

ちなみに、上のデータは単なるサンプルで、実際に解くデータはもっと巨大で2244行あるので、手計算はなかなか面倒です(が、YoutubeにExcelでさくっと解いている動画があがっているようですが・・・)。

とはいえ、さすがに1問目なのでそれほど難しくもなく、実際に業務でデータ扱うとなるとこれくらいのことはまだ範囲内かな、と思います。

次にPart2ですが、上位3人のエルフのもつカロリー数の合計を取得する、という問題です。これはほぼPart1の延長線上でいけるのでPart1が解ければ問題なさそうです。

・ネ

・タ

・バ

・レ

Part1、2を解いてみる

アプローチはいくつかあると思いますが、問題文の通り考えるのであれば、空白行までをグループ化しそれぞれ合計してから最大のものを選べばPart1は完成です。Part1を解かないとPart2の問題はわからないようになっていますが、今回は同じ方向性なのでそのまま考えると、最大から3つ選んで合計、ということでPart2まで解けます。

グループを作ってから合計する方法

例えば、以下のようなワークフローになります。ちなみに、閲覧ツールのアノテーションが★となっているのがPart1の答え、★★となっているのがPart2の答えです。

ポイントは、複数行フォーミュラの計算式でしょうか。以下のとおりです。

IF IsNull([Input]) THEN [Row-1:Group]+1 ELSE [Row-1:Group] ENDIF

現在の行がNullならグループ番号に1追加。そうでなければ、一つ前の行のグループ番号を拾ってくる、という感じです。

グループを作るアプローチでも、別の手段があります。複数行フォーミュラを使わない方法です。

つまり、Nullの行があると1それ以外は0というフィールドを作り、そのフィールドを累計ツールで合計していくときれいにグループ化ができます。

個人的にはいいロジックだと思います。

直接入力データを計算する方法

今度は少し考え方を変えてみます。グループを作らず直接入力データを計算していく方法です。

グループごとに合計を取るために、空白行が来るまで値自体を合計すれば集計ツールを使う必要はありませんが、実はそのまま最大値を取ればPart1はクリアできてしまいます。Part1なら最短の3ツールです。ただ、この場合Part2でツールが多めになります。

Part2は少々厄介です。空白行の前の行だけ抜き出したいのですが、グループ化されていれば抜き出すのは非常に簡単ですが、グループ作る手数をせっかく減らしたのにまたグループを作っては意味がありません。ここでは、複数行フォーミュラツールを使い、空白行の前の累計値を新しいフィールドに書き出す、ということをやっています。これにより、並べ替えて大きい方から3つ取る、という方法に持ち込めます。ただし、方法2としては4ツール使っており、合計7ツールで他の方法より短縮することはできませんでした。

ちなみに、1個目の複数行フォーミュラのあと並べ替えて頭から3つとっても答えは他のロジックと同じになりましたが、問題の値によっては答えがNGとなる可能性があるのでワークフローとしてはNGです。ただ、競争しているのならちょっとズルですがアリなのかもしれません・・・。

まとめ

  • 1日目はさすがに簡単でした。
  • 最速の人だと5分以内に作成しています
  • 個人的にはグループを作るという部分にフォーカスしすぎた気もしていますが、最初に作ったワークフローもそんなに悪いできではありませんでした

解答ワークフローダウンロード

コメント

タイトルとURLをコピーしました