• Advent of code is a coding challenge in December of each year.
• One puzzle per day from Dec 1 to Dec 25.
• No programming language limitation.
• First half questions seems simple and don't need much knowledge of advanced algorithms.
• I feel the questions are a good exercise for kids to learn python.
• hence I prepare this notebook that will prepare some knowledge for students in middle school to finish.

• pycharm
• mu editor

## register github account¶

• use github account to login advent of code
• create a new repo to record the code for advent of code

## learn git¶

# some simple git flow

# check repo status
git status

# push to github
git push origin


## Day 1¶

In [ ]:
# read input into python
with open("day01_input.txt", "r") as f:
# lines_input is a list of strings,
# each string is one line in the input.txt
lines = [int(a) for a in lines_input]
# lines is list of list of integer.
# here we used list comprehension. will discuss it later.

In [ ]:
# example of for loop
# suppose we have 3 lists: part1, part2, part3, all have same size of 10
# we want to add first element of all 3 lists,
# second elements of all 3 lists, etc

output = [] # we need somewhere to put the outputs
for i in range(10):
o = part1[i] + part2[i] + part3[i]
output.append(o)

# method2: use list comprehension instead of for loop
output = [a+b+c for (a, b, c) in zip(part1, part2, part3)]

# another example of list comprehension
l2 = [a*2 for a in l1]



## Day 3¶

In [2]:
# binary string to integer
b_str = "0b1001" # add "0b" prefix
i_num = int(b_str, 2)

print("{} == {}".format(b_str, i_num))

0b1001 == 9

In [3]:
# use recursive function to solve problem.
# The benefit is that you only think one step.
# and the final step where it stops and return.

# a good tutorial at: https://realpython.com/python-thinking-recursively/

# example function
def fibonacci_recursive(n):
print("Calculating F", "(", n, ")", sep="", end=", ")

# Base case. This is where the function will stop
if n == 0:
return 0
elif n == 1:
return 1

# Recursive case
else:
# note the parameters are decreasing
return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)


## Day 15¶

• need A* search algorithm.
• Python Algorithms by Magnus Lie Hetland, p204
In [5]:
from heapq import heappush, heappop

# example of heapq.
# you can use it get point with least loss at this moment.

#   (loss, (y, x))
a = (12, (9, 10))
b = (8, (3, 4))
c = (1, (1, 1))

loss = []
heappush(loss, a)
heappush(loss, b)
print("initialized heap: {}".format(loss))

least_loss = heappop(loss)
print("current least loss: {}".format(least_loss))
print("heap after pop: {}".format(loss))

heappush(loss, c)
print("heap after push c: {}".format(loss))

initialized heap: [(8, (3, 4)), (12, (9, 10))]
current least loss: (8, (3, 4))
heap after pop: [(12, (9, 10))]
heap after push c: [(1, (1, 1)), (12, (9, 10))]


## Day 25¶

• not difficult
• you may want to use copy.deepcopy to keep a copy of map at each move. For example, if we loop from left to right,
• >..>
• .>.>
• should we move the last one? if you look the updated map, it shows vacancy. but we should look at the original map, which shows no move for the last one.
• it is fun to print frame by frame like animation.

## reference¶

• I wrote some code for AoC2021, you can find it here

# 在线的todo清单

## 2017后一直在使用的

• 转眼若干年又过去了, 我的todo 工具竟然还是这两个

### checkvist.com

• 在线网站, 有专门针对手机的页面.
• 各种键盘快捷键. 好用得飞起来.
• 有RESTful API, 我写了 tasker 的任务, Android上快速添加内容.
• update 2021: 可以使用 google home -> ifttt -> webhook -> checkvist
• update 2021: 可以使用 aws/lambda 来添加重复任务.
• update 2020: 使用 ifttt 来发送"名人名言" 到 checkvist
• 可以插入附件.
• 但是自动备份不包括附件, 甚至文本里面都没有地址. 这是我唯一不满意的地方.
• update 2022: 鉴于它的备份功能不是很强, 而且附件空间有限, 我做了一个 firefox 插件把选中的文本或图片送到 checkvist 里面来. 方便!
• 如果是图片, 那会先送到 aws/lambda 保存到 aws/s3 然后再把图片地址送到 checkvist.
• 比它自己的浏览器插件更好用. 😄 😋
• 可以自动打包备份到dropbox 里面 (只有xml 文件, 可以转化成 markdown)
• 很 geek, 用得很顺手. 我本来是想代替 mindmeister 的, 后来发现非常强大.
• 这个网站好像特别低调, 竟然一直都没有看到软文.
• 可以分享list 再 embed 到网页里面.

### airtable

• 比 excel 更强大好玩的网络表格.
• 我用来管理自己重复而不重要的事务.
• 比如说鱼缸30天换一次水, 也许我35天才换水, 那从这次换水之后30天才提醒我, 而不是25天.
• airtable 本身没有这个功能, 但是有 API 呀. 我写了一个脚本来修改due date, 再把每次的笔记归纳.
• update 2021: 我现在使用 aws/lambda 来刷新 deadline.
• airtable 没有提醒, 但是有个日历.

• airtable 也有看板系统.
• 可惜没有提醒功能 update 2022: 可以设置一栏时间, 导入日历后就有时间了.
• airtable 还可以做一些好玩的事情, 可以用脚本来收集资料, 例如读的书, 把封面抓下来, 我只要在 goodreads 里面记录一下就好了.
• update 2021: 现在自动化也是免费了.

## 2017 年尝试过

### github 的 project / issue 系统

• 我买了 github 的付费账户, 可以开启 private repo.
• 里面的 project 就是看板系统.
• issue 可以随便贴附件
• 可以用脚本导出内容和附件
• 可以代替 trello
• 但是太 geek. 不能让我老婆也用这个呀?
• 管理一些小事, 有点杀鸡用牛刀的感觉.

## 2017 年前用过的

### todo.txt + dropbox + simpletask for androi

• 利用 dropbox 保存数据
• 各种客户端. 随便什么文本编辑器都可以.
• 就是不能添加附件 (或者不方便把某件事相关的附件打包.)
• 有时候 dropbox 同步会出问题.

### trello

• 看板系统.
• 可以随便贴附件.
• 不是那么 geek. 家人也可以用
• 有手机程序.
• 搜索功能不错. 容易 review.
• 需要付费账户才能打包导出. 用了3年 $45, 但是现在涨价到$120 一年了. 就不跟了.
• 付费账户现在有很多强大插件呀. 以后有机会再试试.
• 其实可以用 github 的 issue / project 啊, 哈哈

## 2011 年

• 在线网站.
• 能共享, 大家都能编辑
• 界面简单, 速度快.

RTM 也很快, 有各种客户端. 免费版即可分享.
Thoughtboxes 我很喜欢, 速度快, 漂亮. 可是免费版只能建立三个页面(每个里面倒是可以很多单独的列表), 不能共享. 高级版要50刀!!! 擦, 太黑了.
gravity 其实是个项目管理软件, 免费版可以建立一个私人项目. 主要看中里面的issue管理, 可以分配任务, 添加评论. 速度有点慢.
tadalist 来自37signals. 简洁,可分享. 网上对他们家的产品评价很高, 但我个人觉得速度一般, 价格相当贵, 可能他们是面对商业用户的吧.
hiveminder 不错, 简洁明了, 接口众多. 可以导入todo.txt文件. 还是免费的! 就是没有找到如何共享.
myTinyTodo 开源软件, 可是架设简单(php + sqlite/mysql), 速度飞快,密码保护, 可是没有多用户控制.

## 需求

• 快速添加
• 能够搜索 (手机/网页/命令行)
• 能每周 Review (满足 David Allen 的 GTD 理论)
• 添加附件, 这样容易管理

# 希腊神话

### 赫淮斯托斯 (Hephaestus)

• 赫淮斯托斯是火神和匠神, 算是工程师的祖师爷了. 但是, 希腊神话对他是满满的恶意呀.
• 他是十二主神中唯一丑陋的.
• 他老婆是阿佛洛狄忒 (Aphrodite), 爱情女神, 根据 wiki:
由于阿佛洛狄忒的天生丽质，使眾天神都爱慕她追求她。宙斯也追求過她但却遭到拒絕，


• 老婆跟人跑了, 幸好把命保住了, 可比武大郎幸运呀.

## 番外

Richard Riordan 的 Percy Jackson 系列很棒. 主角 Percy 是 波塞冬 的私生子,遇到爷爷 Kronus 要复活复仇, 故事发生在当代美国, 将希腊神话和美国地理穿插在一起. 情节跌宕起伏, 让人欲罢不能.

# 加州地名

1500 California Place Names:
Their Origin and Meaning,
A Revised version of 1000 California Place Names
by William Bright.


## 郡名

• Orange 郡, 就在洛杉矶南边, 有迪士尼乐园等. 当年因为科比, 大家都知道了橙郡/橙县.
• Mono 郡. mono 在西班牙语中是猴子的意思, 翻译成中文就是猴郡.
• San Diego.

## 镇名

• San Dieguito, 小圣地亚哥.
• Yosemite, 中文优胜美地, 确实风景优美, 夏天经常可以看到壮观的瀑布, 也是攀岩圣地. 但是在印第安土话里面, Yosemite 的意思是: "他们是杀手". 原来住在里面的是什么样的部落?
• Chino 是洛杉矶一个华人聚居的地方, 凑巧 Chino 在西班牙里面也有中国人的意思. 可惜这个地名是来自当年西班牙人称呼一个印第安人领袖(我感觉并不是什么好话).
• Calexico 是美墨边境的一个小镇, 名字是 califonia 和 mexico 拼凑在一起, 即Cal+exico. 而在国境线另外一边, 小镇叫做 Mexicali = Mexi + Cali, 也是彼此相应. 那里还有中国城, 住着很多中国人的后代, 祖辈在淘金时代来到这儿. 我们有个邻居, 他是50年代来的美国, 也是在 Calexico 住了很久. 说不定之前那儿比圣地亚哥还要繁华呢.
• Escondido, 位于圣地亚哥, 西班牙语中隐藏的意思. Escondido 有个很好吃的墨西哥 Taco 店 TJ Tacos, 现场做饼烤肉. 就是远了一点. TJ 应该是指和圣地亚哥接壤的 Tijuana 了.
• Del Mar. delde el 的缩写, 类似于我们文言文中的 诸=之乎, 意思也很像! Mar 的意思是海. Del Mar 是圣地亚哥一个海边小镇, 老的1号公路会从中穿过, 路边有不少餐馆. 有个海滩(除了夏天)可以让狗自由奔跑, 无需牵引绳.

• La Jolla, jolla 是西班牙语中空洞的意思, 因为海边的悬崖下确实有个大洞, 还可以买票走楼梯下去看/或者划个小船穿过. 那儿是海豹的保护区, 每天都躺在那儿睡觉, 远远就能闻到它们的味道, 非常"提神".