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

Advent of code

※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方1日目2日目3日目4日目5日目6日目7日目8日目9日目10日目11日目12日目13日目14日目

第拾伍話 「Lens Library」

タイトルは「レンズライブラリ」。

前回、パラボナを調整して光を集めることができました。そこには山腹に埋め込まれた施設があり、トナカイが迎えてくれるのですが、ここでやることは溶岩製造施設をオンラインにすることです。オンラインにするためには、マニュアルを読む必要があります。

まず、HASHアルゴリズムを実現する必要があります。これは任意の文字を0~255の範囲の単一の数字にするだけです。方法は以下の通り。

  1. 文字列をASCIIコードに変換する
  2. 現在の値にASCIIコードの値を足す
  3. 現在の値に17をかける
  4. 現在の値を256で割った剰余に設定する。

最初は「現在の値」は0から始まります。

例えば以下のような形でデータが提供されます(これがパズルのインプットのサンプルです)。

rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7

これは以下のようになります。

rn=1:30

cm-:253

qp=3:97

これらの結果を合計したものがパズルの解答になります。

Part2は、全く違うことを行います。BOXにレンズをセットして行きますが、入力データはカンマで区切られていたと思いますが、カンマごとに処理を一つずつ行っていきます。

次に、与えられたデータの解釈を見てみましょう。「文字列、記号、数字」となっていて、文字列部分はラベルです。記号は「=」か「-」です。数字は記号が「=」の時のみしかありませんが、これはレンズの焦点距離を示すようです。このうち、「ラベル」部分に対してPart1で得られたHASHアルゴリズムを適用することで、このデータを適用するBOX番号を知ることができます。例えば、「rn」はHASHにより「0」となります。つまり、「rn=1」はBOX0番に対して処理を実行する、ということです。

処理するBOXが決まったら、次は実際に処理を行いますが、以下のルールに従います。

記号が「=」の場合:

指定のBOXにレンズをセットします。何もなければ先頭、すでに同じラベルのレンズがセットされていれば、入れ替えます。それ以外のケースは、一番後ろにセットします。

つまり、「Box3:ot 9、ab 5、pc 6」となっていた場合に「ot=7」が来ると、すでにotのラベルがあるため入れ替えが発生し、「Box3:ot 7、ab 5、pc 6」となります。

記号が「-」の場合:

指定のBOXからレンズを取り外しますが、指定されたラベルのレンズがある場合のみ、そのレンズを取り外します。

例えば、「Box3:pc 4、ot 9、ab 5」となっている時に、「pc-」が来ると、pcのラベルのレンズを取り外し、「Box3:ot 9、ab 5」とします。基本的に左詰めになります。

なお、Boxは256個あります(HASHが0~255までなので)。

最終的に、すべての処理が終わった時に、Boxがどのようになっているか見てみましょう。レンズがセットされていないBoxは無視します。例えば、最後の状態が以下の通りだとします。

Box 0: [rn 1] [cm 2]
Box 3: [ot 7] [ab 5] [pc 6]

「Box番号に1を足す」×レンズの位置(左端が1)×焦点距離

を計算し、最後は合計します。これがPart2の答えになります。

・ネ

・タ

・バ

・レ

Part1,2を解いてみる

今回はオアシス問題ですね!

Part1は、最初の週くらいの難易度の問題です。AlteryxでASCIIコードを求めるには「CharFromInt」関数を使います。あとは基本的な処理です。

Part2は、問題文が非常に難解でした(上のように書くとすんなり理解できるのですが)。基本的には素直に場合分けするだけかと思います。

まず、Boxを準備する必要があります。行生成ツールで準備しましょう。

次に、HASHでBox番号を出した処理コマンド用データを作ります。

これらのデータを反復マクロで処理します。非常にシンプルです。

出た結果の処理自体もそれほど難しくないかと思います。

まとめ

  • 基本的にオアシス問題。
  • Part1はともかく、Part2の問題文が難解過ぎました。さらっとPart1のHASHを使うところを読み飛ばすと永遠にBOXが見つかりません。また、BOX番号が問題文に書かれていないため、サンプルの意味を理解するのが非常に困難でした。
  • 今日はあまりギアの組み合わせが良くなかったようで、まずBoxの選択方法に迷いました(これは多くの人がつまずくポイントですね)。そして、HASHをかけるフィールドを間違えてずっと悩んでました(そもそもBoxってどうやって選ぶの?がふわっとしてたのでバグを見抜くのに時間がかかりました)。そして、反復マクロの実行回数を変えるのを忘れていました。
  • Private Leaderボードで、、、Part1は1位取れてたのに、Part2で大きく順位を後退させ、トータル11位となりました。問題文の読解で時間を食った&しょうもないミスといった感じです。

コメント

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