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

Advent of code

※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方1日目2日目3日目4日目

5日目です。

タイトルは、「Supply Stacks」。供給品のスタック、でしょうか・・・。

5日目は、とうとうやってきた、という感じで、単純なロジックでは解けない問題となりました。というのは、データを処理した結果に対してさらに変更を加えていく、といった動きになると、複数行フォーミュラか反復マクロの出番となるのですが、複数行フォーミュラでは対応が難しい問題となります。

入力データとしては、以下のようになっています。

    [D]    
[N] [C]    
[Z] [M] [P]
 1   2   3 

move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2

この時点で怪しげなデータになっています。

空白行の上の行がデータの初期状態を示し、下側は上のデータに対しての操作が記載されています。

操作については「move 動かす個数 from 動かす元 to 動かす先」という感じで、例えば「move 1 from 2 to 1」だと、2番の箱から1つのアイテム(文字)を1番の箱に移す、という意味になります。やることは非常にシンプルです。

Part1は、動かす際に、動かす文字を反転させる必要があります。例えば、「move 3 from 1 to 3」だと、ここでは1行目ですでに動かしているので1の箱の中身は「NZD」となっていますが、これを3の箱に移す際に「NZD」のまま移すのではなく「DZN」で移す必要があるということです。つまり、3の箱の中身は「PDZN」となります。

Part2は、動かす際に文字が反転しません。

Part1を解かないとPart2は問題が出てこないのでわからないのですが、Part1が解ければPart2もあっさり解けるケースが多いと思います(もちろんロジック次第ですが)。

・ネ

・タ

・バ

・レ

解いてみる

今回のような問題は、ロジックを忠実に反復マクロにするだけです。

が、その前に与えられたデータが非常にめんどくさい形式なので(このまま解くのは至難の業です)、まずデータの初期状態を表す部分とデータの操作部分にわける必要があります(そこまでがひと仕事でした・・・)。以下の部分ですね。

    [D]    
[N] [C]    
[Z] [M] [P]
 1   2   3 

Alteryxで扱いやすいのは、以下のようなデータ形式でしょうか(フィールド名がきれいではありませんが・・・)。箱番号と中身を横持ちにするのが一番楽なのと、動的に処理が可能になります。

これを行うのがこちらの部分です。

これだけで結構時間かかると思います。いっその事、鉤括弧とかなければ簡単だったように思いますが、空白部分にわざとダミーの[ ]を入れることでクリアしています。このあたりはデータの作り方によります。すべて1文字(空白も空白1文字)で表現してくれれば楽だったのですが・・・。

操作部分は特に気にせずそのまま使いました。

ここから反復マクロを作ることになります。

下側の操作部分の1行ずつ順番に繰り返して実行していくような形で組んでいきます。

反復マクロですが、ちょっと解説しておきます。反復入力と反復出力をインターフェースデザイナーで設定しておく必要があります。これにより、反復出力に入ったデータが反復入力に戻ってきます。そのため、基本的には同じフィールドにしておいた方が無難です(ループ内で毎回新しいフィールドが作られるようにしていると、フィールドが倍増して結果がおかしなことになったりします)。

ところで、メインのループは真ん中の大きな枠内「Main logic」の部分で、ここでデータの操作を行っています。この部分は素直にやるべきことをそのままやっているだけです。

その右側は終了条件を設定しています。反復マクロを終了させるいくつかの条件は、指定回数実行するか、反復出力に入るデータがなくなったときのいずれかです。ここでは、操作データの回数をカウントしておき、それと繰り返し回数を比較し、繰り返し回数が操作データの回数に達したら通常の出力側にデータを流す、といった方式を取っています。

ちなみに、Part1とPart2の違いは、フォーミュラツールでReverseString関数を使って結合するのがPart1で、何もせず結合するのがPart2なので、Part1ができればマクロをコピーして少し書き換えてしまえば完了してしまいます。

Part1:
[Concat_Input]+ReverseString([to_char])
Part2:
[Concat_Input]+[to_char]

最終のワークフローは以下のとおりです。

まとめ

  • 5日目は同じデータに対して何度も処理を行っていく問題でした。そのため反復マクロがほぼ必須ということで難易度は非常に上がりました。ただ、問題自体はわかりやすかったです。
  • 最速の人でも40分ということでかなり難易度があがりました。
  • 思った以上に最初のデータ成形に時間を取られました。反復マクロの構築自体はそれほど難易度は高くないかと思います。
  • 個人タイム:Part1 41分9秒、Part2 42分34秒(Private Leaderboardで2位)

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

コメント

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