aoc全称advent of code,是每年12月1日开始圣诞节结束的趣味编程比赛,每天两道题,第一道做出来才有机会做第二道,但前面日期的题没做出来也可以做后面日期的题。以数据结构和算法为主,11月cpy推荐我玩(被虐)一下,2018年做到d9,上了16颗星,2019年做到d16,也上了16颗星,d18涉及的吃豆人类似的路径查找实在不会做,就止步了。希望明年可以上更多的星。
aoc是最近刷题中趣味性最强,最好玩的题目,所以想整理一下上星心得。
简单到不用说
考二维数组的计算,我用了np.array
这道题对当时的我还蛮难的,是给一串string数据,告诉你guard在哪个时刻睡觉,哪个时刻醒,要你根据数据判断哪个guard睡的最多,并且在哪个分钟睡的最多。 part2是先判断哪个分钟睡的最多,用的都是dateframe groupby后的sort_values
写出了个bug是有行代码是验证切割分钟时间的左边界和右边界是否存在 结果边界=0,就是时间是0:00的时候… 它当做不存在。。。
这个题目我用了很朴素的做法,cpy科普了离散化处理,但我太懒重新搞一遍,就过了…
这道题叫消消乐…第一个递归,bug遇到的是递归的return的结果是什么…
还是二维数组,但还设计曼哈顿距离,这道题是判断边界的延伸(说起来比较抽象了)
判断是否延伸我先用了再生成几行Z,看两者的数据有没有差异,有差异的就是infinite,但这样不能解决左上的,一开始没想出来,后来是找出z里最左边和最上边行列unique的值,把这些值的都去掉。
一开始还想算出可以最小生成的矩阵,减少运算,但这样坐标要做相对处理… 非常复杂,搞不出来,最后用了绝对的,但计算width和height还是有用
新的数据类型,图。之前没学过图… 看了一天的资料才知道怎么下手。
两个bug:
这道题不是自己做出来的… 知道要用递归,但就是写不出正确的。 最后看了别人动态规划的思路…
这道题还是挺朴素的模拟,第二题应该和算法复杂度有关,但我不会做,愣跑了三个半小时跑出了答案。
简单
part2题目差点看不懂。。。cpy说是图灵机,涉及如何避免可变对象的变化(list传递还要保持原先的list),最后用了暴力string生成新的list… 来reset 今年的aoc每隔两天都是An Intcode program的题目,又麻烦又只是模拟,只是更复杂的模拟,太不喜欢做了,把所有相关的题目都跳过了。。。
这道题考两个线段的相交点,用了离散化的处理做出来了呢。。。结果part2的题目,如果part1不是用离散化的处理会更好做,所有part2就没做。。。
不管它想考我什么,反正我用了正则表达式
图算法,用了递归,还涉及了全局函数要写句global… part2还有最小公共祖先。
这道题挺简单的,但最后有个根据1/0的值生成出像素,看出密码。我是手动用excel画出来的。。。
题目是要算一个直线的斜率,用二元一次函数直接除出斜率会导致浮点数误差。搞得我去研究了下Decimal,结果最后是用了反三角函数atan才做对。
part2和去年的day9的part2很像,但如果朴素,计算次数是10^10次方…
图,考入度为0且有偏度的图遍历。 part2又考算法,又考时间复杂度,没做出来。
很简单的模拟
这两个月还是有进步一丢丢…