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

第拾伍話 「Lens Library」
タイトルは「レンズライブラリ」。
前回、パラボナを調整して光を集めることができました。そこには山腹に埋め込まれた施設があり、トナカイが迎えてくれるのですが、ここでやることは溶岩製造施設をオンラインにすることです。オンラインにするためには、マニュアルを読む必要があります。
まず、HASHアルゴリズムを実現する必要があります。これは任意の文字を0~255の範囲の単一の数字にするだけです。方法は以下の通り。
- 文字列をASCIIコードに変換する
- 現在の値にASCIIコードの値を足す
- 現在の値に17をかける
- 現在の値を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位となりました。問題文の読解で時間を食った&しょうもないミスといった感じです。
コメント