AlteryxでAdvent of Codeを解く場合、普段のワークフローの作成であまり使わないツールを頻繁に使ったり、そしてそのツールの使い方も特殊な使い方を行ったりします。今回はそのようなツールおよび使い方概要を紹介したいと思います。
- 正規表現ツール(一文字ずつに分解して解析する)
- 行生成ツール
- 複数行フォーミュラ(同時に複数のフィールドを扱う)
- x、y座標にマッピング
- 反復マクロ
それではそれぞれ見ていきたいと思います。
頻出ツール
正規表現ツール
まず、ベーシックなところから。
正規表現ツールは、入力データのパースになくてはならないツールですが、それ以外にもAoCでは文字列を1文字ずつ分解して解析する、という必要性に迫られることがあります。
2022年3日目の問題がまさにそのような問題です。設定は以下のとおりで、正規表現は一文字だけ「.」(ドット)のみ!
そして、出力方法は、トークン化で「行に分割」。
これにより、例えば、「12345」という文字列があれば、
1
2
3
4
5
と、行に分割することができます。
これの変形版で、数値の桁を失わずに行に分けるパターンなどもあります。例えば、以下のような文字列を、数字の桁を失わずに解析したいとします(つまり、10は1と0に分けるのではなく、10のままで分割)。
[[10,10,10,4,[8,[8],6,[]]]]
この場合の正規表現は、
\d+|\[|\]|,
となります。これにより、以下のように分解されます。
[
[
10
,
10
,
10
,
4
,
[
8
,
[
8
]
,
6
,
[
]
]
]
]
上の例は、2022年の13日目で使いました。
トークン化は正規表現のパターンに一致したものを抽出します。行に分割すれば、数の制約なく抜き出すことができます。
とにかく、AoCでは正規表現ツールは色々と必須かと思います。
行生成ツール
こちらもAoCでは必須となるツールです。このような動きをするツールと、行をまたいで計算できる複数行フォーミュラのような関数があるかどうかで、AoCを解くことができるかどうかが決まる、と個人的には考えています(Tableau Prepなどはこのような機能がないのでAoCを解くのは難しいです)。
細かい使い方を別記事にしました(書いていたら思った以上にボリューミーになったので)。
AoCではx、y座標の隣接ポイントを作る際に使用しています。この使い方は、2022年の様々なAoCで使いました。18日目、22日目、23日目、24日目。
また、もう一つの使い方として、条件を満たすまで実行する、という機能を応用するような使い方をしました。例えば、二文字連続で同じ文字が来る場所を探す、といった場合は、通常であれば複数行フォーミュラを使いますが、これを行生成ツールで実現しています。2022年6日目で使いました。
複数行フォーミュラ
複数行フォーミュラは行をまたいだ計算で使われる、AoCでは大活躍する必須のツールではありますが、複数のフィールドを一度に更新したいことはないでしょうか?
ちょっとしたトリックで可能になります。
結論から言うと、単一のテキストフィールドの中に複数のパラメータを詰め込んで、都度関数で取り出したり更新したりするだけで実現できます。
この際、GetWord関数を使うと非常にスッキリと書くことができます。REGEX_Replace関数でも似たようなことができるのですが、文字数が短いGetWord関数が良いかと思います。
GetWord関数は、もともと英単語を抜き出すためのツールです。英語は単語が空白で区切られており、文章の中で何個目の単語か、というのを指定するとその単語を抜き出す、というのがこのGetWord関数です。書式は以下のとおりで、抜き出す元の文章を「文字列」、何個目の単語を抜き出すか、というのを「数値」で指定します。
GetWord('文字列',数値)
例えば、
I have a pen.
という文章がある場合、以下のようにします。
GetWord('I have a pen.',1)
これにより抜き出されるのは赤い部分の「have」です(最初は0文字目ということになります)。
これを使えば、例えばx軸、y軸のデータを一つのフィールドとして扱うことができます。x=1、y=2の場合は、「1 2」とx軸、y軸と空白区切りで格納することで、例えばx、y座標系で右上に一つ移動させたい、といった場合は以下のように書くことができます。
ToString(ToNumber(GetWord("1 2",0))+1)+" "+ToString(ToNumber(GetWord("1 2",1))+1)
これにより、「2 3」となります(抜き出される部分は赤字にしています)。
このテクニックを使うと、一旦テンポラリで判断するようなフィールドを作って対応するような冗長なロジックとせず、ダイレクトに複数のパラメータを行をまたいで更新することが可能です。ただ、関数がとにかく長くなってしまうので、そこは要注意ポイントです。
2022年9日目で使っています。
x、y座標にマッピング
AoCでは地図的な問題が出ます。GIS的なものを取り扱うわけではなく、x、y座標上の動きを見るような問題が多いのですが(もちろん、問題によってはAlteryxのGIS機能で解けるものあります)、デバッグするには、x、y座標にプロットして可視化するとやりやすいです。
これを行うには、クロスタブツールを使います。
例えば、以下のようなデータがあるとします。
y | x | Value |
---|---|---|
1 | 4 | ■ |
1 | 5 | ■ |
2 | 3 | ■ |
2 | 6 | ■ |
3 | 2 | ■ |
3 | 7 | ■ |
4 | 1 | ■ |
4 | 8 | ■ |
5 | 1 | ■ |
5 | 2 | ■ |
5 | 3 | ■ |
5 | 4 | ■ |
5 | 5 | ■ |
5 | 6 | ■ |
5 | 7 | ■ |
5 | 8 | ■ |
6 | 1 | ■ |
6 | 8 | ■ |
7 | 1 | ■ |
7 | 8 | ■ |
8 | 1 | ■ |
8 | 8 | ■ |
これをx、y座標にプロットするには以下のようにクロスタブツールを設定します。
つまり以下のようなイメージで設定します。
以下の値でデータをグループ化:y座標(今回は、yフィールド)→縦に並ぶのでy座標を指定
列ヘッダーの変更:x座標(今回は、xフィールド)→横に並ぶのでx座標を指定
新しい列の値:表示したい値(今回は、Value)
これにより、以下のようにマッピングされます。
2022年10日目の問題ではこれで答えを出しました(プロットしてアルファベットを調べるという問題でした)。他にも14日目(砂が落ちる問題)、17日目(テトリス)、18日目(3Dの立方体)、22日目(地図を移動)、23日目(拡散するエルフ)、24日目(ブリザード)などで有用でした。
反復マクロ
いわゆるプログラミングで必要なループをAlteryxで行おうとするとき、普段はフィールド付加ツールを使ってループをせずに解決することが多いですが、AoCほど複雑なアルゴリズムが必要になる場合は、反復マクロが必要になります。普段なかなか反復マクロを扱うような題材に出会うことが少ないのですが、AoCは非常に良い題材を提供してくれます。
反復マクロを使うケースというのは、何か処理をした結果を使ってさらに同じような処理を行う時に使います。ただし、参照するフィールドが1つくらいであれば、複数行フォーミュラや行生成ツールなどで対応可能です。
反復マクロのコツとしては、まず一回分の処理をするワークフローを作ります。そこからがスタートです。
反復マクロの作り方を別記事にしましたのでそちらもあわせてご覧ください。
ただ、反復マクロを使う上で気をつけるポイントをご紹介します。
繰り返すデータはなるべく少なく
反復マクロでは、データをぐるぐる繰り返して使います。この繰り返すデータ(繰り返し出力に出力するデータ)が多いと非常に速度が遅くなります。
繰り返さなくて構わないデータはなるべく繰り返し出力に流さないようなロジックを組み立てましょう。
なるべく反復マクロは使わない
反復マクロははっきりいうと遅いです。なるべく行生成ツール、複数行フォーミュラを使うようにしましょう。反復マクロは最終手段と考えてください。
2022年は、5日目、8日目、11日目、12日目、13日目、14日目、16日目、17日目、18日目、19日目、20日目、21日目、22日目、23日目、24日目で利用しています。
コメント