※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目、2日目、3日目、4日目、5日目、6日目、7日目、8日目、9日目
10日目です。
タイトルは、「Cathode-Ray Tube」。ブラウン管ですね!
久々にワークフロー作成の難易度はそれほどではありませんでした(が、Part2の問題文の意味がわかりにくいという声が多いです)。
今回はコンピュータの処理を行うような問題です。このコンピュータはレジスタ「x」を持っています。レジスタの値は最初「1」です。
サンプルの入力データとしては、以下のようになっています。
noop
addx 3
addx -5
noopとaddxというのは処理の内容です。noopは何もしません。addxはその後に続く数字をレジスタxに足します。ただ、処理をするのに2サイクルかかるようになっています。ここまでが基本的な動きです。
つまり、以下のような動きとなります。
サイクル | レジスタの値 | 処理内容 | 処理結果 |
1 | 1 | noop | 1 |
2 | 1 | addx 3 | 1 |
3 | 1 | – | 1+3=4 |
4 | 4 | addx -5 | 4 |
5 | 4 | – | 4-5=-1 |
Part1は、指定のサイクルにてその時のレジスタの値とサイクル数を掛け算した値の合計を算出する問題です。指定のサイクル数は、20、60、100、140、180、220の6つです。
Part2は、CRT(ブラウン管のモニタですね)に描画する問題です。レジスタの値を使って描画します。CRTのサイズは、横が40、縦が6で、各サイクルを実行すると、CRTの左上から右方向に描画します。右端に達すると左に戻って一行下を描画し始めます。
この縦の行番号を作るには、サイクル数を40で割って小数点をカットすればOKです。横軸方向の番号を作るにはMOD計算で40で割った剰余(余り)が該当します。
描画する際に「#」か「.」を描画しますが、どちらを描画するかは描画している位置とレジスタの値で決まります。レジスタの数字は位置を示していて、今描画中の横方向の場所を示しています。今描画中の場所がレジスタの位置から前後の場所であれば「#」が描画されます。
例えば、上のサイクル1であれば、以下のように、描画している場所は0、レジスタの値は1なので、0~2の間に描画している場所が重なっているため、「#」が描画されます。
最終的にこのCRTに表示される8文字のアルファベットが答えとなります。
・ネ
・
・タ
・
・バ
・
・レ
解いてみる
今回は問題の読み解きで時間がかかった感じです。特にPart2は理解に時間がかかりました。
Part1は素直に処理を行います。基本的なデータは、複数行フォーミュラの時点で完成しています。これをベースにPart1、2ともに処理を行います。
Part2部分を足すと以下のようになります。フォーミュラツールでCRTに描画する記号を作成しています。
その次のクロスタブツールでX、Y座標にプロットします。プロットする際の設定は以下のようになります。
これで以下のように表示されます。
ただ、みにくいのでちょっとおまけでテーブルツールと日本の記号文字を使って作ってみました。
これだとかなり見やすいですね!
まとめ
- 10日目も、Advent of Codeではしばしばあるタイプの問題です(XY座標にプロットする)。Part2の問題文がわかりにくく読み解きに時間がかかっている人が多いようです(最終的に組んだワークフローは結構あっさりなんですが、問題を理解するのにほとんどの時間を取られたように感じます)。
- 最速の人で30分。ちょっと参加者自体が少ないです。問題が重いと感じて避けているのかわかりませんが・・・。4位以降は2時間以上かかっています。もしくは週末だから?
- 個人タイム:Part1 13分50秒、Part2 34分25秒(Private Leaderboardで2位)
コメント