AlteryxでAdvent of Codeを解く場合、普段のワークフローの作成であまり使わないツールを頻繁に使ったり、使い方も特殊であったりします。今回はそのようなツールおよび使い方を紹介したいと思います。
今回は、行生成ツールです。
※Advent of Code(AoC)の説明はこちらを御覧ください
行生成ツール
行生成ツールは高難易度のAoCでは必須となるツールです。基本的には「行生成」という名前の通り、行を新たに作り出します。
行生成ツールの基本的な動作
デフォルトの設定では、RowCountというフィールド名で1から10までのレコードを作り出します。このとき、入力レコードがあれば、各レコードごとにRowCountが1から10まで作成されます。仮に1レコードあれば、10レコードになりますし、2レコードあれば、20レコードが生成されます。
まずイメージを説明します。例えば、入力が以下の通りとします。
デフォルト設定は以下のとおりです。
出力は以下のとおりです。
設定内容としては、
- 初期化式:処理対象フィールドの初期値を設定します
- 条件式:ここに書かれた条件が満たされている間、ループ式の計算を繰り返します。ループ式の計算を繰り返すということは、すなわち、新規レコードを作る、ということになります。
- ループ式:ループする際に処理される式で、ここに記載された式の結果が、処理対象フィールドに格納されます。
条件式の書き方によっては、無限ループに陥る可能性があります。その場合、ワークフローの処理が永久に終わりません。また、ループ式で格納される結果に変化がない場合はエラーで止まります。
また、ここでは処理対象フィールドを条件に入れていますが、他のフィールドを条件に入れることも可能です(その場合は、処理対象フィールドはカウンタとして動作します。なぜなら、他のフィールドの値はずっと固定のため、変化がないからです)。
入力データなしでも機能しますが、その場合は条件通りレコードを作り出します。
基本的に何かしらのパターンを作ったりするようなツールです。通常のデータ加工などでは使い所がちょっと少ないツールかと思います。
応用例
例えば、指定の日付のレコードを作り出すことが可能です。その場合、以下のような設定となります。
- 初期化式:開始日
- 条件式:処理対象フィールド <= 終了日
- ループ式:DateTimeAdd(処理対象フィールド , 1 , “Day”)
とすることで、開始日から1日ずつ足していって、終了日のレコードができた時点でループがストップします。
また、例えば、アルファベットのA~Zを作り出すことも可能です。
- 初期化式:”A”
- 条件式:CharToInt(処理対象フィールド) <= CharToInt(“Z”)
- ループ式:CharFromInt(CharToInt(処理対象フィールド) + 1)
実際の設定は以下のような感じです。
ちなみに、例としてアルファベットを作ってますが、他の文字ももちろん作ることができます。
このあたり頻繁に行うのであれば結構関数書くのが面倒なので、マクロ化してしまっても良いかもしれませんね。実際、日付を作り出すマクロはCReW Macroのシリーズに存在しています。(CReW Generate Dates)。
x、y座標上で隣接ポイントを作る
AoCでは地図上にプロットして動きを見るような問題でよく使われます。というのは隣接ポイントを作ったり、与えられたデータを地図上に展開する場合に、A地点からB地点まで、といったデータが与えられた場合にそれをマップ化する際によく使われます。
例えば、あるx、y座標のポイントに対して隣接ポイントを作りたいとします。まず以下のようなデータを考えてみます。
この隣接ポイントを作成するには、行生成ツールを2つ使います。隣接ポイントのx、y座標をそれぞれx_neighbor、y_neighborとしましょう。1つ目の行生成ツールの設定は以下のとおりです。
初期化式:[x]-1
条件式:x_neighbor <= [x]+1
ループ式:x_neighbor+1
これにより、あるポイントに対して、左右のデータ、自分自身の座標x-1、x、x+1というx軸方向のデータが得られます。つまり、以下のようなデータが得られます。
さらにy座標に対して計算を行います。
初期化式:[y]-1
条件式:y_neighbor <= [y]+1
ループ式:y_neighbor+1
これで、あるポイントの左右、自分自身の上下のポイントが作成されます。以下のようなデータです。
自分自身のポイントは不要なので、フィルターツールで取り除いたり、斜めのポイントをフィルターで取り除いたりして必要なデータを取り出します。
これを可視化してみましょう。フォーミュラツールで可視化するための値を作成し、クロスタブツールでデータの並び方を変えていくようなワークフローになります。
まず、このようにフォーミュラツールを使って、可視化した際に見やすくなるようなデータを作っておきます。
さらに、クロスタブツールでデータの持ち方を変えていきます。
ポイントは、「以下の値でデータをグループ化」にy座標、「列ヘッダーの変更」にx座標を指定します。これにより、以下のように可視化できます。
ワークフローとしては以下のようになります。
2022年の様々なAoCで使いました。18日目、22日目、23日目、24日目。
他フィールドの値を使って条件を満たすまで実行する
もう一つの使い方として、条件を満たすまで実行する、という機能を使う方法があります。例えば、与えられた文字列で、二文字連続で同じ文字が来る場所を探す、といった場合は、通常であれば複数行フォーミュラを使いますが、行生成ツールでも可能です。
例えば、「abccd」であれば、3文字目と4文字目で同じ文字が連続して来ています。この場合最初の文字である4文字目という回答がほしいとします。この場合、以下のような設定となります。
初期化式:0
条件式:SubString([text],RowCount,1) != SubString([text],RowCount-1,1)
ループ式:RowCount + 1
これにより得られるデータは、
となります。SubString関数が0始まりのため、一番最後のレコードを取って+1したものが回答となります。つまり、以下のようなワークフローとなります。
複数行フォーミュラだと以下のようになります。ツールの数が多くなりますが、ロジックとしてはわかりやすいかと思います(ただ、複数行フォーミュラの中の式は若干複雑かもしれません)。
2022年6日目で使いました。
まとめ
行生成ツールの基本的な部分からマニアックな使い方まで紹介しました。
- 条件に基づいて行(レコード)を作り出すツール
- 数値以外の型でも実行可能
- Forループ的な使い方も可能
コメント