#1 - 2023-12-13 22:31
NekoNull
虽然进度已经过半了才想起来写,不过还是推荐各位班友都来一起玩!(bgm24)
(如果真的去玩了,欢迎在本贴后回复自己的体验/疑惑/想法!)

官网:https://adventofcode.com/2023

## 这是什么?
- (官网):Advent of Code 是一个编程谜题的圣诞日历,适合各种技能水平和技能水平的人解决,可以用任何你喜欢的编程语言来完成。人们用它们作为面试准备、公司培训、大学课程作业、练习问题、速度比赛,或者互相挑战。
- (人话):可以看作圣诞版leetcode;在12/1~12/25的期间内,每天(UTC-5 0点,UTC+8 13点)会放出一个题目;每个题目分为两个部分,第一部分相对简单,第二部分会更深入也会更难;每完成一个部分就会获得一个小星星⭐(one gold star)

## 参加有条件吗?
- (官网):参与者不需要计算机科学背景,只需要一点编程知识和一些问题解决能力就可以走得很远。也不需要高端电脑;每个问题都有一个解决方案,在十年前的硬件上最多可以在15秒内完成。
- (我自己的经验):我是今年首次参加,体感如果你学过任何一门计算机语言,有基础的编程知识,应该就可以开始玩了;几乎所有题目的第一部分都可以暴力解出来,第二部分就可能需要一些技巧。

## 和其他的 OJ(Online Judge)有什么不同?
- 提交结果而不是代码:每个部分的结果都是一个数字,只需要提交这个数字就可以了
- 没有时间/内存限制:如果想不到高效的解法,暴力硬算也未尝不可
- 没有编程语言限制:甚至可以用 Excel / Minecraft 或者任何图灵完备的工具来完成

## 这是比赛吗?
- 如果你想体验激烈的比赛,官网有个排行榜,每天全球前100位解出题目的玩家可以获得积分
- 但如果你只是想玩,完全当作单机游戏也没问题,不需要和任何人比较;题目一旦放出就会一直存在(12/25最后一天结束之后也是如此),今天做不出来也可以之后再试试

## 我卡关了
- 这很正常
- 可以选择死磕:样例结果一致吗?有没想到的边界条件?手动构造几个更强的输入?
- 也可以参加讨论:官方 SubReddit 通常会很有帮助,油管上也会有人放出讲解视频,Github 上也会有人同步更新自己的解答


---
12/25:完结撒花 🎄



自己的解法扔 Github 了(超级糟糕的代码,建议不要参考)

另外还排了一个非常主观的本年度题目难度排行榜:

难度 / 题目(所在天数)
- SSR (没做出来):21
- SR (做了很久 / 暴力解 / 看了思路):5, 8, 10, 12, 16, 17, 18, 19, 20, 23, 24, 25
- R(得仔细想想):1, 3, 13, 14
- N(有手就行):2, 6, 7, 9, 11, 15, 22

最后祝各位班友 2023 圣诞快乐 & 2024 新年快乐!
#2 - 2023-12-13 22:36
顺便也在这里记录下自己的体验:
(上周末(12/9~12/10)一路肝到了 day 10,后续每天跟着进度写;没记录的大概是我认为当天比较简单)

- day 1: p2 得 rfind,直接 index 比较似乎有问题 (bgm38)
- day 3: off by 1 error (bgm38)
- day 5: p2太暴力了,应该按照分段来会更好一些(或者就算暴力的话应该要高度并行化,虽然我是硬跑了4线程*1.5小时跑出来的)
- day 8: p2太暴力了,最后果然是环+lcm(这里查了下别人的解析),暴力跑必然是跑不出来的
- day 10: 解析图有点烦人,而且还得懂点计算机图形学?ray casting
- day 12: p1可以暴力过,但是p2...不dp就不行了,幻想用五倍关系来搞是没用的,还是直接全量dp吧
- day 13: p2得考虑多个对称轴的情况,之前的抽象不太合理导致卡了好久
#2-1 - 2023-12-14 21:44
NekoNull
- day 14: 比较直接,p1直接模拟,p2这么大的数直接猜有循环,不过最后发现还是off by 1了,好在-1之后就对了
#2-2 - 2023-12-15 21:34
NekoNull
- day 15: 今天的很直接,虽然p2文字描述多了点,读懂了还是很快的,比较简单
#2-3 - 2023-12-16 01:55
孤独熊
NekoNull 说: - day 14: 比较直接,p1直接模拟,p2这么大的数直接猜,不过最后发现还是off by 1了,好在-1之后就对了
+1,第一感觉有环,立马想到这几年icpc南京的定番袋鼠题(https://codeforces.com/gym/102992/problem/A),没细想,感觉有牛逼网友的话应该是可以构造出环很大的图
#2-4 - 2023-12-16 19:46
NekoNull
- day 16: 相对直接,但是实现上得小心点;p1直接模拟了,用个队列存当前的光线坐标和方向,需要注意判重;p2直接硬算了(not my pridest moment (bgm38)),好在量不大+4并行,多等等就出来了(还顺带试了copliot把py转cpp)
#2-5 - 2023-12-17 15:25
NekoNull
- day 17: 终究还是逃不过算法了 (bgm38),p1用dijkstra,但是生成下一步的时候要加上三步限制;p2在p1上魔改,实际上是支持1步/4步的step size,生成的时候步数限制也得改下
说来惭愧,毕业之后算法几乎已经忘光了,自己整了一个小时没整出来,最后求助copliot chat才做出来,作为程序员有些失败
#2-6 - 2023-12-18 21:22
NekoNull
- day 18: 难度又创新高 (bgm38), p1本来想ray casting解,但是因为边本身有宽度不太好搞,最后直接flooding了;p2数据量太大,光是存grid都不太可能了,和gpt4聊了一会之后学到了一个叫shoelace formula的神奇操作,但是这也只能解决边界内的面积,边界上的面积还要再算下,好在经过一些基础的几何推导可以发现边界上需要计算的面积实际上就是 边长/2 + 1(可以通过内角->外角推断出来)
#2-7 - 2023-12-19 21:30
NekoNull
- day 19: 总算回到了能做的难度;p1很直接,模拟就是了;p2硬算的话有2^48,那必然没法暴力了;想着说建个图看看,但是又担心层级太多;后来把每个workflow拆成了几个节点,每个节点有自己的条件列表(例如wf1的第三个节点,条件是 x<50 + y<80 + z>=1000),再bfs一把找到所有可以到达A的路径(in->wf1->wf2->A),发现其实也就500多条;将路径里所有的条件AND,对每个维度算一次区间大小,再相乘就是当前路径可达A的数量,最后所有路径求和就可以了
#2-8 - 2023-12-20 21:39
NekoNull
- day 20: 题目描述字数又创新高,感觉读了得有十分钟才弄明白 (bgm38);p1 直接模拟,写完发现自己居然在 top1k;p2 看了问题,一开始没啥想法,感觉硬算都不可能;一开始先跑了1亿,跑着跑着想到就作者这个出题风格,暴力估计还是解不出来;后来仔细看了下数据,发现最后实际上就是四个AND,盲猜带周期+最小公倍数,最后果然如此
#2-9 - 2023-12-21 23:33
NekoNull
- day 21: 投降了,真做不出来了(bgm74);p1 依然是正常的模拟;p2 完全没有头绪;题目的这个数字看起来意外的具体,显然是有一些特殊做法,但是完全想不到,甚至都试着拟合多项式了 (bgm38);虽然想到了应该得分奇偶块,然而完全没法用上;一开始感觉是个圆,后来看了可视化动图才发现是个菱形,然而依然感觉搞不出来;最后对着一个油管题解抄了 (bgm38)
虽然数据的确很特殊(中心开始,边缘/中心轴线没有障碍),但是计算的时候要分很多块,太容易 off by 1了,就算出错了估计都查不出来...
据说还真的可以二次拟合?但是需要很特定的x(65, 65+131, 65+131*2)
#2-10 - 2023-12-22 20:20
NekoNull
- day 22: 意外的直接,p1 p2 都是直接模拟可过,难道是作者良心发现昨天太难了? (bgm38) 一开始还以为p2要搞什么组合最小DP之类的花活,但是并没有
#2-11 - 2023-12-23 20:07
NekoNull
- day 23: 没啥特别好的想法,p1 p2 都是直接dfs,到终点了就尝试更新最大值;p2用cpp重写之后去吃了个饭,0.5b step之后最大值就不变了,提交上去也ac了;有些好奇正规解法是什么
P.S. 看了别人的题解,可以观察到题目中大部分位置其实都只有一个可选的前进方向,在图上可以把这类点忽略(or 合并,不太确定 coalesce 怎么翻译合适),这样可以大幅减小最后需要暴力的图上边的数量
#2-12 - 2023-12-24 20:12
NekoNull
- day 24: 相对直接? p1 用一些初中几何就好(一开始读题不仔细以为真的要相撞,搞了半天才发现是轨迹相交); p2 样例里有平行直线,写了个几何解,但是发现数据里没有,就卡着了,差点投降了;后来突然想起来可以用sympy列方程硬解(三条直线上设3个未知数t1 t2 t3,计算出三条线上的三个点坐标,然后要求这三个点在同一直线上),居然就硬解出来了 (bgm38)
P.S. 看了看别人的题解,基本上 p2 都是用数学库解方程了(理论上可以手写高斯消元?)
#2-13 - 2023-12-25 21:22
NekoNull
- day 25: 最后一天!p1 想了会没想出来比较好的解法,于是干脆把图导入到gephi里直接可视化跑了下,直接可以看出来两个大点群,框选计数就得到答案了;p2 直接点一下就可以了 (bgm38)
#2-14 - 2023-12-26 21:32
TeapotKudos
NekoNull 说: - day 25: 最后一天!p1 想了会没想出来比较好的解法,于是;p2 直接点一下就可以了
3 是给的图的最小割(最大流)
#2-15 - 2023-12-26 22:20
NekoNull
TeapotKudos 说:
原来如此,然而图论已经彻底忘光了 (bgm38)
#3 - 2023-12-13 22:50
年年见到人玩这个,一看问题描述马上一点兴趣都没有了(bgm38)
#3-1 - 2023-12-14 21:45
NekoNull
可以当云玩家看别人玩 (bgm38)
#4 - 2023-12-14 22:00
(DD雷达搜寻中...?)
全是鸡肠
#5 - 2023-12-15 01:17
隔壁叔叔圣诞节在玩编程.jpg
#6 - 2023-12-16 01:17
打算每天换一门不熟悉的、感觉有实用价值的语言来写,到第十天左右感觉耗在这上面的时间有些多了,还是等时间充裕再捡起来吧 (bgm113)
#6-1 - 2023-12-19 22:29
NekoNull
每天换语言还是有点困难,在题目的难度之外还要适应不熟悉的语言 (bgm38) 有的题目就算我用我最顺手也最熟悉的语言写都很难了,更不敢想象用不熟悉的语言写会如何。感觉可能先用熟悉的语言写出来,再用不熟悉的语言重写一次,这样做心态会好一些 (bgm38)
#7 - 2023-12-16 01:39
(我只是一只孤零零的熊罢了。)
day5:你可以进行整段的映射,一个整段从题目那里变换一下,大概得到的结构是一堆连续段的集合,维护每次变换后得到的段的集合,这样暴力就行了。复杂度没细想,它这个数据估计卡不满,但是大概估一下:考虑题目里的映射把数轴分成了几十段,对于任意输入的段通过一次变换后,得到的东西是,映射里某一段的后缀 + 映射里分出来很多个整段 + 映射里某一段的后缀;那么似乎,上面那个暴力实现如果加上 “每次变换后合并一下重复的段”,那么整个段数增长的趋势大概是两倍两倍这样的感觉,一共只会过 7 轮映射,因此如果合并后这个段的总数可能差不多 2^8 乘一个比较大的常数这种感觉。
#7-1 - 2023-12-16 01:47
孤独熊
day10:主要需要了解一点计算几何和简单多边形,考虑对每一行从左到右射一条光线,经过 | 或者 └─┐ 或者 ┌─┘ 会翻转一下内外的状态(例如一个点往左有奇数个这些形状就是内部,有偶数个就是外部),└─┘┌─┐这2个同向的情况不会翻转状态
#7-2 - 2023-12-16 01:49
孤独熊
day13:感觉最逆天的一集,看不懂要干什么,猜了半天题意
#7-3 - 2023-12-19 16:40
孤独熊
day19:感觉挺有意思,我会的正解太难写了,不是不想写正解,而是暴力更有性价比。口胡一下正解应该是,首先你需要把输入看成一个四维空间的点,先符号执行一下,把合法的四维空间上的“矩形”抠出来,但应该是有重复计算的东西,所以还要去重,做肯定可以做,参考 HDU5126,cdq分治套cdq分治套树状数组,做一下四维数点。不知道简单点的做法有什么。
看了一下输入一共只有500个规则,也就是最多将数轴分成500段,每个段选一个点暴力,就从4000^4降到500^4种可能,大概4e10这个量级,跑个几分钟应该就行了,最后跑了15分钟搞出了结果。还有一点上面的口胡,似乎符号执行模拟的时候复杂度已经不低于这个暴力,没写不清楚跑起来是什么样的。
#7-4 - 2023-12-19 21:31
NekoNull
孤独熊 说: day19:感觉挺有意思,,做一下四维数点。不知道简单点的做法有什么。
看了一下输入一共只有500个规则,也就是最多将数轴分成500段,每个段选一个点暴力,就从4000^4降到500^4种可能,大概4...
day19居然有暴力解?想不到还能这样 (bgm38)
#7-5 - 2023-12-19 23:45
孤独熊
NekoNull 说: 孤独熊 说: day19:感觉挺有意思,,做一下四维数点。不知道简单点的做法有什么。
看了一下输入一共只有500个规则,也就是最多将数轴分成500段,每个段选一个点暴力,就从4000^4降到500^4...
大家写的解法和暴力也没啥区别,复杂度看起来差不多
#7-6 - 2023-12-20 16:27
孤独熊
day20:如果要看数据做的话,感觉就有点没意思了。
#7-7 - 2023-12-20 21:36
NekoNull
孤独熊 说: day20:如果要看数据做的话,感觉就有点没意思了。
的确,day20 p2如果不去看实际数据的话,根据规则硬算估计没希望 (bgm38)
(翻了翻reddit上的讨论,有人说通解可能是个PSPACE级别的问题)
#7-8 - 2023-12-20 23:45
孤独熊
NekoNull 说: 的确,day20 p2如果不去看实际数据的话,根据规则硬算估计没希望
(翻了翻reddit上的讨论,有人说通解可能是个PSPACE级别的问题)
复杂度理论就不太懂了,反正昨天和今天的看着就不像是能做的(P)
确实也只能依赖数据搞一搞(
#7-9 - 2023-12-21 17:47
孤独熊
day21:摆烂了,调了一个下午,偷了个题解交了。我做成了一个,分 8 个方向扩展分别讨论,每个方向上把每个位置的循环节找出来,但是 debug 过于困难,摆了(
回想起以前比赛的时候,经典上来口胡一个非常复杂的做法,然后占着机时半天调不出来(bgm38)
#7-10 - 2023-12-21 23:35
NekoNull
孤独熊 说: day21:摆烂了,调了一个下午,偷了个题解交了。我做成了一个,分 8 个方向扩展分别讨论,每个方向上把每个位置的循环节找出来,但是 debug 过于困难,摆了(
回想起以前比赛的时候,经典上来口胡一...
day21 p2我也投降了,完全没有思路,后来看了题解都不太能复现(主要是算起来很容易 off by 1,也不知道到底哪里算少/算多了) (bgm38)
#7-11 - 2023-12-22 00:47
算法骑士
孤独熊 说: day10:主要需要了解一点,考虑对每一行从左到右射一条光线,经过 | 或者 └─┐ 或者 ┌─┘ 会翻转一下内外的状态(例如一个点往左有奇数个这些形状就是内部,有偶数个就是外部),└─┘┌─┐这2个...
day10 part2可以只把靠上的拐点(F和7)或者靠下的拐点(L和J)看做在竖直的边上,这样更省事点。S点先替换成效果相同的管道。
#7-12 - 2023-12-22 11:11
孤独熊
算法骑士 说: day10 part2
有两天的题,其实感觉把边界点按顺序抠出来,叉积绕一圈就行了吧,或者皮克定理数一下点。应该没啥问题,我反正都写的很麻烦
#7-13 - 2023-12-22 21:58
孤独熊
day22:part1 比 part2 困难多了,一开始跑了个传递闭包,跑了个支配树,造了样例发现假了,整了半天才发现还得是模拟(bgm38)
#7-14 - 2023-12-24 01:03
孤独熊
孤独熊 说: day22:part1 比 part2 困难多了,一开始跑了个传递闭包,跑了个支配树,造了样例发现假了,整了半天才发现还得是模拟
day23:按照十字路口或者丁字路口,缩了一下点,就只剩 94 个了,暴力搜一下大概一两分钟能跑完。
中间去试了一下 z3 玩玩,问了问 GPT,它给的代码无法排除掉子循环(也就是它会输出类似,1-2-3,4-5-4,6-7-6,这样的东西)。
好像没有之前玩过的解数独类似的东西的建模那么trivial,有点不太懂。
#7-15 - 2023-12-26 00:23
孤独熊
完结撒花,圣诞快乐。

我的实现:GitHub

我也留一个主观的难度分段(可能参照我退役几年前的 XCPC 和省赛命题经验):
- Medium Hard: 21
- Medium: 18, 19, 22
- Medium Easy: 5, 7, 10, 12, 14, 23, 25
- Easy (简单思维、简单实现或简单算法的模板): 3, 8, 11, 16, 17
- Very Easy (对着题意模拟): 1, 2, 4, 6, 9, 15
- 排除: 13(题面写的看不懂),20(需要参考题面未指明的数据性质),24(过圣诞节摸了,不想做)
#8 - 2023-12-18 21:44
(迷子でもいい、迷子でも進め。)
首页的日期排序有什么规律吗
#8-1 - 2023-12-18 23:12
NekoNull
不知道 (bgm38),22年是从下往上,21年是从上往下;感觉上可能和题目的背景故事里主角(如果有的话)的登山过程相关?
#8-2 - 2023-12-25 23:20
NekoNull
从结束后的最后动画来看,的确和故事设定相关,主角的确是先上再下 (bgm38)