2026红包题解
为什么要发这个红包
因为好玩。
大年初一,我花了三个小时领到了一个朋友的红包(她的题解在这里)。 我玩得很开心,于是俺寻思俺也可以整一个。
我不计划整太难。她的题目对我来难度有点过高;难点不是面对一道难题解不出来,而是根本找不到题目在哪里。 我计划做一个简单得多的,让人每一步都能明确知道“我接下来要解决什么问题”;就算不知道怎么解决,也可以问AI或者自己查资料,不至于真把人拒之门外。
此外,题目的“考试范围”也要衡量。 如果是纯计算机的内容,那即使是整到对我来说非常难的水平,对那帮专业搞计算机的来说也不会难; 如果是纯物理的内容,那估计没人来参加了(同事中极少有这种玩耍的心态的人)。 所以最终是把两者都加一点进来,难度要控制到AI能解答的范围内。
这样,只要是愿意来玩的人,都不会觉得无聊;问着AI,应该也都能把红包拿到。
题目
挂在 hongbao2026.chn.moe 上面,目前还能访问。
浏览器打开后是一段伪代码:
# include <iostream>
# include <crystal>
# include <httplib.h>
int main()
{
int id = crystals.allCrystal()
| filter([](auto &c) { return c.name == "SiC" && c.primitiveCell.atomNumber == 8; })
| map([](auto &c) { return c.spaceGroup; })
| get(0);
httplib::Client cli("https://zzzhongbao2026.chn.moe");
auto answer = cli.Get("/index.php?id=" + std::to_string(id));
std::cout << answer->body;
}哦,要补充一句:我把题目写完了才忽然想到,大部分人看到看起来麻烦的东西就会马上放弃。比如这里的伪代码,实际上很简单(再不济还有AI),但大部分人大概在这一步就放弃或者外包了(如果不是可领可不领的红包,而是必须做的工作的话,就会丢给他觉得擅长的人去做)。 所以其实有个第零关:愿意看伪代码,而且还是掺了非计算机内容的伪代码,不怕因为看起来复杂而带来的情绪。
第一关对应这段伪代码:
int id = crystals.allCrystal()
| filter([](auto &c) { return c.name == "SiC" && c.primitiveCell.atomNumber == 8; })
| map([](auto &c) { return c.spaceGroup; })
| get(0);说白了就是:找到这样一个整数,用来描述原胞(primitiveCell)中有八个原子的SiC(碳化硅)的空间群。
第二关对应:
httplib::Client cli("https://zzzhongbao2026.chn.moe");
auto answer = cli.Get("/index.php?id=" + std::to_string(id));也就是如何打开这个网页。
第一关
这个问题你问AI,AI可以直接给出“186”这个结果。要是一步步来的话:
SiC晶体,就是字面意思:碳原子和硅原子一比一组合到一起形成的晶体。 它指的不是某一种晶体,而是一类晶体:因为碳和硅原子可以组合出不同结构的晶体来,并且其中许多在常温下都是稳定的。 这有些像中学化学学习的“同素异形体”,比如“白磷”和“红磷”,它们的分子都是由磷原子搭建而成,但因为结构不同而是两种不同的物质。
如果你不知道晶体是什么、原子是什么,那这个科普起来有点长,我这里写不下,你可能得从中学课本看起。
原胞中有八个原子(四个碳四个硅)的碳化硅只有一种,被叫做“4H-SiC”。如果你好奇为什么会有这个结论:
如果把一个碳和一个硅的组合看作一个整体,那么所有的碳化硅都可以看作是“六方密堆”的。 如这个网页中的图所示, 第一层“原子”(一个碳和一个硅组合成的整体)按六边形紧密堆好(位置A),第二层自然地堆在第一层的缝隙上面(位置B),那么第三层应该堆在哪里呢? 第三层有两种不同的选择:一种是第一层的正上方(位置A),另外一种则是与第一层和第二层都错开、位于它们共同的缝隙里(图上的“八面体空隙”,我们把它叫位置C)。 同理,第四、五、六层也有不同的选择1。
原胞中有八个原子,意味着以四层为单元进行重复;那么排列组合一下就知道,只有这几种情况:ABAB、ABAC、ABCB。 其中ABAB有更小的原胞,ABAC与ABCB本质上是一样的。 因此满足条件的只有一种SiC。
“空间群”是一个数学概念,用来描述晶体的对称性。如果你对这个概念好奇,可以考虑这个数学(物理)题:一张三角形的桌子,在三个顶点处有三个桌脚,放在水平的地面上;如果已知它的三条边长,那么它三个脚的受力分别是多少? 这个问题的答案推导起来并不容易,但凭直觉、不通过任何计算,我们就可以知道:如果这个桌子是等边三角形,那么三个脚的受力应该是相等的;如果它是等腰三角形,那么有两个脚的受力应该是相等的,第三个脚有极大的概率与前两个脚不同。为什么?因为这三个角(两个角)是对称的,那么受力肯定一样;不对称的角,受力大概率不一样。
与三角形桌子相同的是,晶体的一些物理性质,如果硬算的话非常麻烦,但利用对称性可以绕过复杂的计算直接给出答案。 与三角形桌子不同的是,晶体的对称性要复杂得多,各种物理性质与晶体对称性的关联也并不直观,直觉不足以给出答案;需要一些数学工具,把“对称”用数学具体明确地表达出来,才能说明问题。 对于每一种晶体空间群,都可以枚举出它支持的所有的对称操作(例如,绕着c轴旋转120度,结构不变),这些对称操作组成的集合就是它对应的空间群。 可以这样说:这个晶体的空间群,就是这个晶体的“对称性”的数学表达。
因为一些这里地方太小写不下的原因,虽然晶体有千千万万种,但空间群只有有限种(只有230个,即晶体的对称性只有230种),并且它们的性质已经被数学家研究得干干净净了。 于是人们把这230个空间群排了个序来标记它们,4H-SiC对应的是第186号空间群。
第二关
访问 https://zzzhongbao2026.chn.moe/index.php?id=186 这个网站,你会发现它打不开;
并且在不同的电脑上报错可能完全不同,尤其是在开发者自己的开发机上,报错五花八门。
对于大致理解DNS/TLS协议的人来说,只要一个命令就可以看出端倪。
$ nslookup zzzhongbao2026.chn.moe 1.1.1.1
Server: 1.1.1.1
Address: 1.1.1.1#53
Non-authoritative answer:
zzzhongbao2026.chn.moe canonical name = remove-me.vps6.chn.moe.
Name: remove-me.vps6.chn.moe
Address: 127.0.0.1把remove-me去掉,就可以查到正确的IP地址:
$ nslookup vps6.chn.moe 1.1.1.1
Server: 1.1.1.1
Address: 1.1.1.1#53
Non-authoritative answer:
Name: vps6.chn.moe
Address: 144.34.225.59但直接访问 https://144.34.225.59/index.php?id=186 是不可以的,会返回别的内容;必须为TLS/HTTP设置正确的域名:
$ curl --resolve zzzhongbao2026.chn.moe:443:144.34.225.59 https://zzzhongbao2026.chn.moe/index.php\?id\=186
红包口令是:35587774在这里挖坑的背景是这样的:
现实中对“域名”或者DNS的科普并不少,因为相关事故的新闻闹过不少次。
绝大多数科普停留在“域名是IP地址的别名”这个程度上,但域名的作用不止于此。
许多协议都会将用到的域名实际写到传输的信息中(尽管它们对应的IP地址已经知道),
服务端则同时运行着多个服务(多个网站),并利用这个信息来区分用户到底要访问哪个网站。这个操作在实践中是普遍存在的,应该说在2026年,绝大多数服务器都会这样做。
打个比方就是:就算“浩南”“男哥”“男酱”“亲爱的”“义父”“臭臭”“大臭”2这几个词都是指我也不能瞎叫,因为它们意思是不一样的。
回到这个例子,有两个地方会将域名写入进去:一个是TCP握手后、开始TLS握手时,会发送域名(称为SNI);
另外一个是TLS握手完成后、HTTP请求头中会包含域名。
这两个地方都需要是zzzhongbao2026.chn.moe而不是144.34.225.59或者vps6.chn.moe才行。
看到这里,如果你完全不知道什么叫域名、什么叫IP,那这个科普起来有点长,不是我这里能写下的。 你可能得找别的系统的科普,并且愿意为此花费几个小时的时间。 站在我的角度来看,我觉得中学电脑课本应该教这些,而不是“如何在flash中让金箍棒转起来”这种上层的、很快过时的技术。 当然不这样做也可能有维稳的意思3。
我的小老板算是我在物院认识的最懂服务器的人(虽然还是没我懂),但他都不知道这个事情;
实际上我运营六年的一个谷歌镜像站(入口 entry.mirism.one),就是通过不设置DNS解析来规避非目标用户的。
这里有个趣事:我说“尤其是在开发者自己的开发机上,报错五花八门”,因为真的有好几个人和我说,你的网站502了,你的TLS证书配错了,等等; 但错误其实都出在他们本地自己的网站上,他们自己没有意识到这一点。
-
你可能会好奇:不同堆叠位置是否有能量差别,如果有的话,晶体是否会倾向于某一种特定的堆叠方式,而不是任意堆叠?答案是肯定的。对于类似于SiC这样的结构的晶体,如果两种原子的电负性差别不大,那么它们倾向于形成ABCABC……的堆叠方式,这对应于中学的“面心立方最密堆积”,例如硅单晶、金刚石;如果两种原子的电负性差别稍微大一些,那么就会倾向于形成ABABAB……的堆叠方式,这对应于中学的“六方最密堆积”,一些金属氧化物就是这样的。碳和硅的电负性差异恰好在这个分界线附近,结果就是怎么堆能量都差不多。 ↩︎
-
老家那边的风俗是,给自家孩子起一个不好听的小名(乳名),因为“贱名好养活”。我的小名是“臭”,所以一些老家的朋友会叫我“臭臭”;但我表第也叫“臭”,所以为了区分,长辈会叫我“大臭”,尤其是当我弟在场的时候。 ↩︎
-
如果你理解了这些,那翻墙就变得很容易了。 ↩︎