はじめに
昨年楽しんだ Advent of code
Advent of code 2024 が始まる前に過去回をやってみようと思ったら落とし穴があったので塞ぎました
修正の Pull Request はこちら
KinoAOC
KinoAOC は Livebook から簡単に Advent of code の入力を取得できるモジュールです
Livebook でインストールすると、以下のようなスマートセルが使えるようになります
年、日と認証用の SESSION 、パズルの入力値を格納する変数名を指定します
上記画像の例だと、 pazzle_input
の中に以下の Web ページで取得できる値が格納されます
発生した問題
Advent of code 2015 の Day 1 を解いたところ、どう考えてもロジックは合っているはずなのに、不正解になってしまいます
そこで入力値を見直したところ、なぜか入力値の末尾が1文字欠けていました
実際には 7,000 文字のはずが、 6,999 文字しか取得できていません
問題の原因
KinoAOC のソースコードを確認すると、 入力値の取得処理が以下のようになっていました
...
case res.status do
200 -> {:ok, String.slice(res.body, 0..-2//1)}
_ -> raise "\nStatus: #{inspect(res.status)}\nError: #{inspect(String.trim(res.body))}"
end
...
String.slice
は文字列から指定範囲の部分を取得する関数です
この場合、最後から2文字目までを取得しているため、最後の1文字が欠けることになります
なぜ、このような実装になっているかというと、入力が複数行になっている場合、最後にある \n
(改行コード)を取り除くためにわざと1文字欠けさせているのです
ただし、この実装だと 2015 Day 1 や 2015 Day 3 のような、末尾に改行コードがないケースで必要な文字まで削ってしまいます
解決方法
当該処理を以下のように修正しました
...
case res.status do
200 -> {:ok, String.trim_trailing(res.body, "\n")}
_ -> raise "\nStatus: #{inspect(res.status)}\nError: #{inspect(String.trim(res.body))}"
end
...
String.trim_trailing
は末尾に指定文字があれば取り除きます
これで末尾が \n
でない場合は文字が欠けなくなりました
Pull Prequest
この修正について Pull Prequest を送ったところ、迅速に(2時間以内で)マージしてもらえました
まとめ
KinoAOC の Contributors に入ることができました
モジュールがしっかりメンテナンスされていて素晴らしいですね