12 天的 Advent of Code 终于结束了,这是我第一次做完所有的谜题,也是第一次知道原来每天的谜题里都有一个小彩蛋。
获得 24 颗星之后,回到日历页,精灵们还会带着圣诞老人从屏幕上面飘过。日历的图案是这 12 天里走过的地方,有一些是会动的,一些特征会让人想起曾经解决过的谜题, 2025 年的日历还挺精美的。
以往的 AoC 都是持续 24 天的,但制作谜题并不容易,很花费时间,所以今年开始缩减到 12 天了。我觉得 12 天挺好的,轻松一些,如果是 24 天,经常碰到没有思路的情况,我可能会很容易放弃。
24 天也有好处,坚持做 24 天题,每天可以在 reddit 上和大家一起讨论、发点梗图,最后在圣诞节大家互道祝福,每个人都像是一个为圣诞节准备的精灵,有种很热闹的感觉,增添了节日的氛围。
不过如果谜题解不开,大概也会有点郁闷。当跟不上谜题的发布,甚至 24 天过去了,谜题还有不少没做完,可能圣诞节会没那么开心 :P
我觉得逛 reddit 也是参与 AoC 的一部分,reddit 增添了 AoC 的趣味。有时题目很难,心情不好,去 reddit 看看大家的吐槽、梗图,心情就好点了;也可以从评论里找找思路,继续挑战谜题。
看到很多人都解决了,自己却没有思路,不知道怎么写,我是会有一种挫败感的。但想想原因,可能是自己对某些算法和数据结构不熟悉,可能某些知识压根就不知道,不管哪种情况都说明存在不足,弄明白了都是一种收获,其实是一件让人开心的事情。
这一次参加因为空闲时间比较多,我也尝试记录自己的思路,这逼迫我将不理解的地方尽可能弄明白,否则就写不出来了。另一方面也是为了在今年完成 100 篇博客文章,所以记录下来凑凑数。
我也看到其他人通过博客文章的形式分享他们的思路,例如:
这次参与尝试了用 python,了解了一些基本语法,但还没完整看过一遍教程;一些操作我写起来感觉很麻烦,大概也有更好地写法。
也有不少人用 python 解题,去看别人的题解也能学到很多。对比之下,也暴露了一些自己编码上的问题:
除了 python,这次也尝试了 Jujutsu(jj),一个兼容 git 的版本控制系统,声称「比 git 更简单、更容易,但同时又更强大」。我通读了一遍 Steve's Jujutsu Tutorial,然后就开始用了。
jj 的大致流程是这样的(比较常用的命令):
jj git initjj config set --user user.name "Your Name"jj config set --user user.email "[email protected]"jj newjj describe
每次修改,jj 都会自动记录变化,每次变化都会自动做一次 git commit 。不需要 git add 之类的操作存到暂存区。
jj 有 ChangeID 和 CommitID,CommitID 对应的是 git 中的提交,经常会变化,大多时候也不需要关心。 ChangeID 是可以理解为 jj 自己的提交 ID,会跟踪 CommitID。
jj describe 可以描述当前的改动,任何时候都可以使用 jj describe ,不一定是提交的时候才用。
jj stjj logjj log 使用。例如查询所有的日志,命令是 jj log -r 'all()' ,查询条件非常丰富。jj bookmark create trunk
在当前提交创建一个 trunk 分支。
jj 也有分支的概念,但分支名在 jj 中不重要,分支名只有在提交时才需要关注。
jj 中从某个提交创建分支,可以用 jj new ChangeID
jj bookmark set trunkjj git remote add origin [email protected]:steveklabnik/jj-hello-world.gitjj git push
jj 的流程和 git 不太一样,在 git 里,一般是修改后,选择要提交的改动(git add),然后提交(git commit)。在 jj 里,修改后描述这次修改的内容(jj describe),就结束了,然后就可以开始做新的改动 (jj new),如果要选择提交,似乎还得 主动拆分。
jj 的一个问题是,它总是在修改 git 的记录,默认情况下,只要做了修改,就会形成新的 commit ID,感觉容易弄乱 git 的提交记录。自己一个人维护倒是问题不大,如果多人协作,可能会经常发生本地改了 git 提交记录,覆盖了远端仓库的情况。不过我没有用 jj 多人协作过,大概是有解决办法的?还是有很多需要去弄明白的地方。
jj 也有一些我觉得不错的功能,例如可以用 ID 的前几个字符指定 ID,而不用写全,在命令行上用就会容易一些。
jj 合并分支比 git 容易很多,例如分支情况是这样的:
> jj log @ ymvptyyq [email protected] 2024-03-17 14:25:31.000 -05:00 push-ymvptyyqmyul 728dbb1e │ (empty) fixing all the breakage from updating dependencies ◉ xulymzyp [email protected] 2024-03-17 14:25:14.000 -05:00 1f7c69a5 │ (empty) updating dependencies │ ◉ zxyukunn [email protected] 2024-03-17 14:24:56.000 -05:00 push-zxyukunnwolo 30081a6b │ │ (empty) first 80% done │ ◉ tzsloruo [email protected] 2024-03-17 14:24:21.000 -05:00 7c02f6ce ├─╯ (empty) another feature │ ◉ rxpztwms [email protected] 2024-03-17 14:23:00.000 -05:00 push-rxpztwmsszvk 902a6cd2 │ │ (empty) various fixes │ ◉ tmnmvxyy [email protected] 2024-03-17 14:22:15.000 -05:00 105cf6b5 ├─╯ (empty) prepare to deploy to the cloud │ ◉ yxxppztp [email protected] 2024-03-17 14:18:00.000 -05:00 push-yxxppztpoyqq 3d123151 │ │ (empty) have galactus query eks with time range │ ◉ opwqpunl [email protected] 2024-03-17 14:15:58.000 -05:00 1a66beb1 ├─╯ (empty) display the birthday date on the settings page │ ◉ msmntwvo [email protected] 2024-03-02 11:47:08.000 -06:00 push-vmunwxsksqvk 752534be │ │ add a new function │ ◉ vmunwxsk [email protected] 2024-03-02 11:47:08.000 -06:00 f6f7dce9 ├─╯ add a comment to main ◉ ksrmwuon [email protected] 2024-03-01 23:10:35.000 -06:00 trunk e202b67c │ Update Cargo.toml
如果要合并多条分支,在 git 里可能需要多次操作,但在 jj 里, 执行 jj new ym z r yx m -m "merge: steve's branch" 就可以将所有分支合并在一起了。
在 Emacs 里有 magit,是我目前觉得最好用的 gitUI 了,没有之一,它很好地减少了 git 的使用难度。有了 magit,我觉得 git 还是挺好用的,所以 jj 并没有给我带来太多的吸引。不过我还是会继续深入了解一下 jj,熟悉它的使用流程,达到熟练使用的程度。
Anyway,庆祝做完了 12 天的谜题,也写完了记录!
。:.゚ヽ(*´∀`)ノ゚.:。
明年有空继续~