跳到主内容

advent of code

Advent of code 2021

  • 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.

set up python editor

  • 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

# add file to commit
git add .
git commit -m "new updates"

# push to github
git push origin

Day 1

In [ ]:
# read input into python
with open("day01_input.txt", "r") as f:
    lines_input = f.readlines() 
    # 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 年

我一直用todo.txt, 快捷方便. 可是如果有复杂一点的项目要协调的话, 就没法用了. 其实可以自己架设trac或者dotproject之类的, 可我现在也不想再浪费时间搞这些东西了.

最好:

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

现在这种网站真是层出不穷呀, 试用了几个网站, 挑其中几个不错的:

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

最后想想还是选择了gravity, 毕竟不用掏钱, 可以添加评论对我们来说是个比较重要的特性.

需求

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

希腊神话

父子相残

这可是一个自古以来的话题了. Uranus -> Cronus -> Zeus -> Athena 宙斯运气好, 没有被干掉.

星球大战里面也是父子相残, Darth Vader 被自己儿子干掉, 他妹夫 Han Solo 也被外甥干掉.

赫淮斯托斯 (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.

加州和下加州

大家都知道美国的加州, 当年是从墨西哥抢走的, 它其实是当年上加州的一部分. 和美国加州接壤的地方, 是墨西哥的下加州 (Baja California). 国境线上的圣地亚哥(美国)和蒂华纳 (Tijuana) (墨西哥) 紧挨在一起.

话说星巴克收购的 Teavana 发音和 Tijuana 很像呀, 但是没有找到啥资料证明.

郡名

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

附送高通相关小笑话

高通 (Qualcomm, 很多华人称为球康) 是手机芯片的霸主, 也是圣地亚哥的第三大雇主. (第一大雇主自然是美军了). 紧邻高通总部的 Mira Mesa blvd 也是一条大路, 一路上很多餐馆. 我们有个朋友90年代就来SD, 那时候华人很少, Mira Mesa blvd 上也是一片荒芜, 没什么建筑, 更别提人气了. 自从高通崛起之后, 这一片就变得非常热闹了.

高通之前财大气粗, 赞助了SD的一个体育馆: "Qualcomm Stadium", 要知道米国人民是酷爱去球馆看球的, 很多人都长期持有季票, 导致在 SD 大部分地区提到 Qualcomm 就想到 Qualcomm Stadium, 想到棒球比赛, 而高通本身这个科技公司对于普通人来说并没有什么存在感.

我们之前有个同事, 他是老莫, 但是美国公民. 有一次从墨西哥回美国, 在边检的时候, 警察问他在哪儿工作, 他说 "Qualcomm", 警察突然眼睛一亮:"今天 Qualcomm Stadium 没有比赛哟. 你去那儿干什么呢? 到这边来我们好好聊聊." 警察大哥对于棒球比赛日程确实熟稔, 但是万万没想到还真有一个 Qualcomm 公司呢.