Wordle 提示器

心血来潮写的Wordle提示器,思路大概如下

  • 把谜题中已经暴露的信息转换为正则表达式
    • 绿色=固定字母,黄色=含有字母&位置错误,黑色=不含字母
  • 从词表(*)里筛选出符合规范的词,即所有的“可能答案”
  • 计算所有可能答案的mutual information,找到之中mutual information最大的(几个)词(**)
    • 这里使用了简单的计数法:绿色=2分,黄色=1分,黑色=0分

注:

词表:我用了github上的这个词表derekchuank/high-frequency-vocabulary。经嘟友@[email protected] 提醒,其实wordle有dump出的词表,词库大约2.3k,允许输入大约10.6k,来源自这个reddit讨论串 a_note_on_wordles_word_list/。可以自行替换。

答案表:reddit的讨论指出每期问题的答案是人工挑选的而非随机抽取,这意味着信息分布与默认的平均分布不符。Well,既然答案表有2.3k词,就算是人工挑选也足够多词了。

有趣的发现:

  • 从词表上来看,最好的“起始词”并不是adieu而是rates, aries, cares, lanes这几个,因为u这个原因出现次数其实不如辅音r和s高
  • 就算用词表作弊,也挺需要运气的,比如Wordle 243,最后需要从4个合法词里随机尝试,我的这个策略的步数期望值是4.

代码大概这样

import numpy as np
import re

# # create 5-letter word list
# with open("30k.txt") as file:
#     for line in file:
#     	w = line.rstrip()
#     	if len(w)==5:
#     		with open('5letterwords.txt', 'a') as fnew:
#     			fnew.write(w+'\n')


def info_score(target,current,matchscore=2,containscore=1):
	"""
    compute information score
    target: target word
    current: current try
    change the scores to optimize the searching process
    """
	s = 0
	for i in range(5):
		if current[i]==target[i]:
			s+=matchscore
		elif current[i] in target:
			s+=containscore
	return s



def main():
	# run hinter

	# get word list
	with open("5letterwords.txt") as f: 
		words=[line.strip() for line in f]

	# initialize masks
	letters_contain = []
	pattern = ["[^0]"]*5
	done = [False]*5

	while not all(done):

		# new inpt from user
		w = input("Please enter your first try word: ")
		m = input("Please enter your result (black=0,yellow=1,green=2): ")

		# loop through new input
		for i in range(5):
			if m[i]=='2':
				# correct, remove regax mask and mark as done
				pattern[i]=w[i]
				done[i]=True
			elif m[i]=='1':
				# semi-correct, add to contain list and mask this index
				letters_contain+=w[i]
				pattern[i]=pattern[i][:-1]+w[i]+']'
			elif m[i]=='0':
				# wrong guess, add to all regax mask
				for j in range(5):
					if not done[j]:
						pattern[j]=pattern[j][:-1]+w[i]+']'
		# exit if done
		if all(done): 
			print("You solved it. Bye.")
			exit()
		# apply regax and contain list
		words_new = [wd for wd in words if 
				re.match('^'+("").join(pattern)+'$',wd) 
				is not None and all([l in wd for l in letters_contain])]
		# exit if funny problem happened
		if not words_new:
			print("out of words, maybe something wrong?")
			exit()
		# compute similarity matrix
		sim_matrix =[[info_score(x,y) for y in words_new] for x in words_new]
		# zip and sort and print results
		mutural_info_sums = list(zip(words_new, [sum(x) for x in sim_matrix]))
		best_guess = [x[0] for x in sorted(mutural_info_sums, key=lambda x: x[1],
			reverse=True)[:5]]
		print("Best next guesses are "+(", ").join(best_guess)+".")


if __name__ == "__main__":
    main()

效果大概是这样

答案是robin

答案是slime:

答案是abbey:

答案是aloft: 很奇怪这个词不在30k list里

塞尔达传说-织梦岛

四舍五入我就是吕游

因为几个月前才打完众神的三角力量A link to the past(我知道英文翻译不重要但是我就是特别喜欢这个翻译),织梦岛这一作上手感觉很舒服且熟悉,地图和怪都很像。查了一下这一作本来是作为三角力量的掌机版在业余时间开发的,也难怪有这么多好玩的对话和搞笑的客串

我海拉鲁破坏王又回来了。不知道是不是因为刚打完三角力量,这作一开始两个地牢的boss都是基本上无损过的嘿嘿。目前感觉很好玩!

我发现我心中的林克形象就和游戏里一样地有点木木讷讷的,人形探险机器。这段之后和玛琳一起走的时候可以触发各种对话,我走了一圈忘了带她抓娃娃机,看了网上视频发现这段还挺逗的(玛琳是娃娃机达人)。就是我觉得我的林克好像也不太会想到去抓娃娃

想了想还是心里过意不去,读档回去继续带玛林转悠了。玛林对话都挺逗的,挺喜欢这个角色

通关了!一场美丽的梦,很喜欢这个有些meta的结局,最后风鱼的话就像对玩家说的,谢谢你和我们一起探险,希望这也成为了你的美好回忆。打通游戏之后有些失落的滋味,和林克一起共享了

还有一个很喜欢的地方是收集八种乐器,一起合奏风鱼之歌。这作游戏里,林克是彻头彻尾的外乡人,随波涛漂流到岛上,串联起世界的秘密的过程也其实是瓦解世界的冲突过程,风鱼之歌有一种古老的味道,像是给远去的旅人的呼唤……

……我应该把它设成手机闹铃!

奶油蘑菇汤

晚饭做了炖排骨和奶油蘑菇汤。奶油蘑菇汤主要用来消耗冰箱里剩下的奶油,按照菜谱把洋葱蘑菇炒香用鸡汤煮,之后打碎成泥,黄油炒面粉之后加奶油和蘑菇泥一起煮。虽然挺香,但是法式汤太……太实在了,过于浓厚,我还是喜欢喝中式排骨汤鸡汤和日式菜汤鱼汤这种。

听歌 (2022.1月)

This will be our year (Zombies) 1.1

新年第一天有幸看到了Zombies新发布的live演出This will be our year视频。很符合新年第一天!好像今年可以再看到线下的现场了

The warmth of your love
Is like the warmth of the sun
And this will be our year
Took a long time to come

don’t let go of my hand
Now darkness has gone
And this will be our year
Took a long time to come

and I won’t forget
The way you held me up when I was down
And I won’t forget the way you said,
“Darling I love you”
You gave me faith to go on
Now we’re there and we’ve only just begun
This will be our year
Took a long time to come

告别的摇滚 1.2

可能是早上听了听滚石40年经典这个歌单的缘故,今天脑子里一直在放另外一些乐队的致敬歌曲。准确地说是唐朝乐队唱的“独上西楼”。这是1995年邓丽君去世后,一些国内的摇滚乐手一起录制的致敬专辑,《告别的摇滚》,还包括郑钧录的“船歌”和“甜蜜蜜”,臧天朔录的“路边的野花不要采”和“再见我的爱人”,轮回乐队录的“在水一方”和“酒醉的探戈”,黑豹录“爱的箴言”和“爱人”。以及一起合唱的一曲“夜色”。这些乐队的许多自己的歌在我脑子里已经许久不听有些模糊了,这张致敬碟里的献唱却还铭记。大概是因为能听出那种真诚的情绪,可以从这面镜子里折射出邓丽君对那一代人的音乐和精神启蒙。

有一年暑假学了几天吉他,老师传给我这张专辑的mp3。可惜我的苹果音乐并不能网盘同步这张专辑,现在想听只能去Youtube了

继续阅读“听歌 (2022.1月)”

鞭炮

今天聊起放鞭炮来,才意识到八年没回家过年,北京已经禁炮很久了。现在长大的小朋友听马三立的相声应该已经不知道什么叫“麻雷子”,哪个叫“二踢脚”了。儿时春节前常常住在远郊亲戚舅舅家里,废弃的探矿厂宿舍区,还没有开发成口号为“白领居易”的高级小区,我们在长满杂草的苏式板楼遗骸上,一根根点“白杆儿”——手指粗细长度的白色爆竹,这种炮引线很长,通常五秒钟后才会发出一声脆响。或者拆散的红鞭炮,啪的一声,或者把火药拆出来自制一些更大的爆炸物。这些事情现在想起来也太危险了。

禁炮之前的两年,鞭炮规范化在专门地点销售。这是激动人心的,虽然贵了几倍,但是花样变得极丰富,老朋友们也变了样,木杆插大炮的“麻杆儿”被禁止,苇杆插小炮的“窜天猴”改名叫了“笛音带响月旅行”,诗意盎然。二踢脚改名双响炮或者双喜炮,包上了红色。再之后就禁止。其实禁止也不是坏事,扰民和危险一直是炮仗无法规避的大问题。

但是不管怎样,这一切也与我再没有关系,我童年的炮王生涯止于禁炮这一年。却并不是因为政策原因。新年过后,我挂了一条长长的鞭炮在门口的老玉兰树上,送给刚去世的姥爷。一千响烟炮与响声对我而言第一次含有了实际的意义,这一分钟之内闪过了许多事情,我永远失去了他。第二年我失去了这棵老玉兰树,它倒下的地方建起了保安亭。

再之后,我离开了家。炮响对应的再不是喜庆,而是可能的枪击。

Zora Neale Hurston

今天阳光不错,和对象一起在街区遛弯,发现一家人门口的Little Free Library(公益捐书小箱子)里有很多文学书,甚至有一本我一直很想读的Zora Neale Hurston 的小说Their eyes were watching god. 大学时候读过Zora的书of Mules and Men,是一本南部黑人社区民俗研究小册子。对社区充满好奇的Zora把整个研究过程写得生动有趣,带着读着一起浸入这个自成体系的社会,了解和感受民俗故事(谎话)和巫毒传统。

今天拿到的这本书前面有Zora的生平年表。很惭愧,我只知道她20年代在哈莱姆文艺复兴里起到的重要作用和文化意义,定义黑人文化,探寻黑人女性的力量。但我并不知道50年代之后她的境遇竟然有些荒凉,六十多岁打工养活自己还遇到因为“too well-educated”被图书馆解聘这类事情。1960年在福利院去世后被草草埋葬,无名坟冢上长满野草,作品文稿险些付之一炬。直到1973年,小说家Alice Walker找到了Zora的埋葬处,才为她修了墓碑。Alice的文章“In search of Zora Neale Hurston”里写,这时候Eastonville本地人甚至大多不记得她了,Alice还是先找到了Mules and Men里记录的一个讲述着,开始顺藤摸瓜搜寻的。文章结尾写到:

There are times — and finding Zora’s grave was one of them — when normal responses of grief, horror, and so on, do not make sense because they bear no relation to the depth of emotion that one feels.

It was impossible for me to cry when I saw the field full of weeds where Zora is. Partly this is because I have come to know Zora through her books and she was not a teary person herself; but partly, too, it is because there is a point at which even grief feels absurd. And at this point, laughter gushes up to retrieve sanity.

It is only later, when the pain is not so direct a threat to one’s own existence that what was learned in that moment of comical lunacy is understood. Such moments rob us of both youth and vanity. But perhaps they are also times when greater disciplines are born.

https://www.allisonbolah.com/site_resources/reading_list/Walker_In_Search_of_Zora.pdf

“打印皮卡丘”

昨天在毛象上说我爸闲的没事时候在微信上小程序上学了学python,这是去年年底的事情,聊天记录里我随便应付了两句,其实都没点进去看他在写啥,今天去看了看就是一开始的print语句,这课叫“打印皮卡丘”,print字符串。今天想觉得应该评价两句的,但是也不知道说什么好。心里怪难受的,我跟家里真的就没有什么沟通,父母制造的话头基本上也都糊弄过去不太回复,在家时候三个人聊天聊地说得欢,但是一离开家就失踪一样,七八年也没打过多少电话。不知道怎么开口聊自己,只能扯一扯股票啊研究啊之类的。去年父亲疑似癌症,我偷偷哭了两天,也没能憋出一句像样的话来。这件事让我很难受。咨询师说我离开家之后没找到作为成年人和父母沟通的模式,我希望今年能多找找,至少下次我爸给我打印皮卡丘时候能好好回复一下

Carnitas

根据象友的菜谱(感谢 @simplesimon !),今天我们也做了一次carnitas,按照步骤做就很成功!肉炖完非常烂熟,煎一下超级香,对象还做了西红柿salsa,一起配豆子米饭。

肉的调味按照菜谱里写的做的,说实话我自己做的话不敢加那么多盐,但是这样做出来肉咸淡正合适。象友的菜谱里是慢炖七个小时或者普通锅两个小时,我今天时间紧,看网上的菜谱说也可以置换成高压锅1.5小时,于是慢炖2小时高压1小时再慢炖1小时,效果挺不错的。

牛舌三吃

牛舌分三部分,从舌根到舌尖,从最肥到最韧。今天把舌根厚切,舌尖薄切分别煎了,中间部分用酱牛肉的手法炖了。好吃。对象说最喜欢炖的这部分,我最喜欢舌根煎的这部分肥美的风味,香