6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

昨年楽しんだ Advent of code

Advent of code 2024 が始まる前に過去回をやってみようと思ったら落とし穴があったので塞ぎました

修正の Pull Request はこちら

KinoAOC

KinoAOC は Livebook から簡単に Advent of code の入力を取得できるモジュールです

Livebook でインストールすると、以下のようなスマートセルが使えるようになります

スクリーンショット 2024-11-19 12.25.27.png

年、日と認証用の SESSION 、パズルの入力値を格納する変数名を指定します

SESSION の値は Cookies から取得可能です

スクリーンショット 2024-11-19 12.23.13.png

上記画像の例だと、 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 に入ることができました

モジュールがしっかりメンテナンスされていて素晴らしいですね

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?