踩坑记录 | Windows11 硬件服务异常、移动文件卡死、无法打开硬件管理器、系统信息不显示 cpu 和存储和 RAM 频率等问题

<h2 id="问题描述">问题描述</h2> <p>该问题有几个主要现象:</p> <ol> <li>无法打开硬件管理器</li> <li>在桌面或资源管理器移动或剪贴文件夹会卡死</li> <li>资源管理器卡死时只会该窗口卡死,而不是系统卡死</li> <li>部分软件无法启动</li> <li>打开设置&gt;系统&gt;系统信息会卡顿,且不显示 cpu、存储、机带 RAM 的速度</li> <li>Win+R 打开 eventvwr.msc 后查看 Windows 日志&gt;系统里面有一堆10010错误(而且似乎发生在开机时)</li> <li>以上问题重启电脑无法解决</li> </ol> <h2 id="解决方法">解决方法</h2> <p>Win+X 打开终端管理员。</p> <div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cmd" data-lang="cmd"><span style="display:flex;"><span>net stop <span style="color:#98c379">&#34;Plug and Play&#34;</span> </span></span><span style="display:flex;"><span>net start <span style="color:#98c379">&#34;Plug and Play&#34;</span> </span></span><span style="display:flex;"><span>net stop winmgmt </span></span><span style="display:flex;"><span>net start winmgmt </span></span></code></pre></div><p>我似乎是运行完前三行就当场几乎恢复正常(硬件管理器和打不开的软件直接打开了,再查看系统信息里面看得到cpu了,移动文件正常了),重启电脑后,系统信息里的存储和内存也恢复正常,日志里也没有错误了。</p> <h2 id="问题原因">问题原因</h2> <p>我发现我三次遇到这个问题之前,都有一个共通点:<strong>正在高负载任务,甚至可能存在爆内存或爆显存的情况</strong>。</p> <p>我前两次是在跑大模型,第三次是在玩大型3D游戏,风扇库库转的时候直接卡死了。</p> <p>推测可能是这种极限负载情况下,硬件服务出现异常,从而出现以上问题。</p> <p>至于之前卸载windows更新能解决问题,可能是因为卸载完之后的那次重启会起到重启服务的作用。</p> <h2 id="原内容">原内容</h2> <p>注意,原内容很可能是错误观点。至少,他没有真正解决问题。</p> <blockquote> <p>今天我刚从 zlib 美美下了几本书,结果想移动文件到我的电子书文件夹的时候,资源管理器卡死了。</p> <p>具体情况为:可以创建文件夹,但<strong>直接移动文件和剪贴文件都会导致卡死</strong>。卡死时只会<strong>该窗口卡死</strong>,但系统本身并没有过多卡顿,甚至还可以打开新的资源管理器窗口,新窗口一切正常。重启资源管理器和重启电脑均无效,一拖动还是会窗口卡死,并且出现<strong>部分软件无法启动</strong>的情况。</p> <p>因为出现问题时我要处理的文件和软件都在 D 盘,刚好 D 盘是单独一条 SSD,联想到我这几天在 D 盘大量部署新东西,我还以为是硬盘被我写坏了,结果测试发现打开另一条 SSD 的盘里移动文件也会出现一样问题。我开始慌了,不会两条 SSD 都炸了吧,现在存储这价格可不兴坏啊。</p> <p>我想启动 CrystalDiskInfo 查看硬盘情况,结果因为这个问题,启动不了 CrystalDiskInfo。好在重启之后再试一遍,卡了一分钟后启动成功了,结果发现硬盘很健康,一个警告都没有。</p> <p>这时候我突然想到,哎我前几天是不是更新了一下 Windows 来着??遂查看。</p> <p>KB5079473,三天前更新的。</p> <p>(粗口)</p> <p>没错,<strong>卸载掉 KB5079473</strong> 这个更新,问题就没有出现了。</p> <p>更新带来的原因多种多样,甚至可能这个问题不是由于更新的内容本身带来的,这里面的原因我也搞不明白。</p> <p>按理说更新了好几天了,不应该今天才发现这个问题,总之很奇怪,但修好了我也懒得折腾了。</p> <p>不管怎么样,先把他更新给暂停了再说。</p> </blockquote> <h2 id="附录">附录</h2> <h3 id="参考文献">参考文献</h3> <p>无,我没在网络上搜到相关信息。我似乎是第一个遇到这个问题写文章的?</p> <h3 id="版权信息">版权信息</h3> <p>本文原载于 <a class="link" href="https://blog.reincarnatey.net" target="_blank" rel="noopener" >reincarnatey.net</a>,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。</p>

2026/3/15
阅读更多

随笔杂谈 | 媒体因何无损

<h2 id="前言">前言</h2> <p>还是这样的文章写起来最顺手,比写科普专栏有意思多了。</p> <p>本文谈谈媒体的有损与无损的本质,并尝试从信息论的角度定义无损,以及记录一些了我的思考。</p> <h2 id="从媒体格式说起">从媒体格式说起</h2> <p>其实文件的本质就是一坨数据,而媒体文件的数据主要分成两个部分:一部分是媒体的元数据,一部分是媒体本身的数据,除此之外就是一些结构编码和文件本身的元数据了。</p> <p>众所周知,无论是什么数据,在计算机系统中都是01编码的,媒体元数据和媒体本身数据自然是如此,所以媒体怎样变成文件,基本完全取决于“信息的编码方式”,这就是所谓的<strong>媒体格式</strong>。</p> <p>通常,媒体格式会通过文件扩展名的形式显式告诉用户文件的类型,让用户明白不同格式的文件是有区别的,要区别对待,比如应该使用不同的软件打开。</p> <p>题外话:实际上,文件拓展名不能完全代表媒体的格式,涉及媒体时其中通常还有编码器、色彩位数、采样率之类的多种细分。详细格式会存储在文件元数据区,严谨的软件是通过这一部分数据来判断文件格式的,这就是为什么改扩展名并不影响很多东西。例如你可以把 png 改成 jpg 后正常打开,因为看图软件会正常认出这是 png 格式然后正常读取;例如你可以把一个 txt 改成 exe 后强制用记事本打开,里面的文字仍然显示正常,因为记事本会认出这是 txt 文件,然后正常读取;例如很多系统或配置文件甚至没有扩展名,因为这类文件不面向用户,也就没有告诉用户文件格式的必要。</p> <p>总之,媒体文件是有很多种规则去编码他的数据的,因此有不同格式。<strong>不同格式之间其实都是存储的同一个媒体,只是不同编码方式</strong>,所以只要把媒体读取解码出来再以另一种方式编码存储,就完成了所谓“转格式”。比如 ffmpeg 可以随意转换,从 mkv 到 mov,从 mp4 到 flv,从 jpg 到 bmp,只要是同一类媒体基本就可以互相转换,内部存储的信息没有改变。甚至你把一段文字从记事本复制到 word,何尝不是完成了一次格式转换?</p> <p>那为什么格式有无损和有损之别呢?比如熟知的 mp4 和 jpg 是压缩格式,png 和 mov 是无损格式。其实区别在于,有损格式是<strong>特意为了高效存储“损失了信息的数据”而设计的格式</strong>,而无损格式是<strong>为高效存储“较少或无损的数据”而设计的格式</strong>。</p> <p>因为我们不常需要完全无损,选择性地丢弃一些信息可以在对影响不大的情况下让文件小很多。这里需要一个知识前提:颜色在计算机系统中通常以三个0-255的数字来表示,也就是 rgb 格式,原因与显示器的显示原理有关。</p> <p>例如 png 格式如何存储图像,比较粗略的解释就是这样的:他首先存储了图像的调色盘,也就是找到了图像中的所有颜色,这样后面就可以用颜色在调色盘中的序号来代替 rgb,这样每个像素块从用三个数字表示变成一个数字表示。而此时我们说的压缩图像,通常就是合并相似颜色来缩小这个调色盘,这样编号范围就小了,就可以用更少的二进制位表示颜色。</p> <p>比如一个 100*100 的图像,原始图像有 1000 种不同的颜色,但假如把相近的颜色合并之后只剩下 256 种颜色,那么原先需要用 10 个 bit 才能表示这个颜色编号,现在只要 8 个 bit,这样每个像素块省了 2 bit,在存图像的部分一共省了 2w bit=2.5 kb,同时存颜色盘的部分少了 744 种颜色,即少了 744*24 个 bit,我就不算了。</p> <p>以上就是常见的图像压缩过程。这就是变成有损的过程中,我们损失了什么:一些你肉眼分辨不出区别,甚至显示器都显示不出区别的颜色。实际上,文件压缩包也是相似的原理。</p> <p>这里就可以直接理解:为什么存在无损格式?因为我只要设计一个格式,找个比较优的方法老老实实去存所有数据就好了。为什么 png 也可以无损?因为我可以硬要让 png 存下所有颜色,不做压缩,相似颜色我全部留着不动。其他媒体文件也是同理。</p> <h2 id="真无损吗">真无损吗?</h2> <p>看到这里也许你会疑惑:为什么假定原始图像就是无损的?这个原始图像,真的够“原始”吗?他们本身就“无损”吗?</p> <p>确实。前面的“无损”,我们只定义为与<strong>原始图像完全一致</strong>,但我们的需求并不只有传输和转移数据。单论“保存”这件事,如果我们要保存的信息本身就不完整,那什么格式都无济于事。</p> <p>假如是电子数据,<strong>产生时本来就是以数据的形式</strong>,例如电子制图、编曲,亦或是 3D 渲染的内容、AIGC 内容。那么毫无疑问,我们追求这些数据的无损是合理的。事实上,你看到的这个 html 网页,你记事本写的 txt,何尝不是“无损”的?我在这里打的每一个字都完整、毫无更改、未被丢弃的保留下来,如果十年后再来看,错字仍然是错字。</p> <p>假如是现实数据要保存成数据,那么将其采样编码时,<strong>信息损失往往是不可避免的</strong>。举个最简单的例子:照片的颜色、音频的频率,他们的实际数值可能小数点后有成千上万位,采样时可能只能保留小数点后三位,再往后可能既没有能力处理这么高精度也没有能力存下这么大数据。这时候便不存在真正的无损,只能用一个相对高的门槛来设定一个近似的无损。</p> <p>这也是摄影偏爱 RAW 格式的原因之一:RAW 格式保存了最原始的传感器数据和详细的拍摄参数,尚未经过那些不够智能的自动处理和压缩,他保留了更多的信息,有更少的损失率,因而有更大的后期调整空间。</p> <h2 id="广义的无损">广义的无损</h2> <p>不过,我们还是可以严格定义广义上的无损。从信息论的角度来讲:</p> <ol> <li> <p>当一个信息可以<strong>被有限的参数完全确定</strong>时,就是就是<strong>理论上可无损</strong>的。这里的“有限”有双重含义,一是参数个数有限,二是参数本身是有限数字。</p> </li> <li> <p>当这样的信息<strong>可以被完整采集</strong>时,就是<strong>实际上可无损</strong>的。</p> </li> </ol> <p>大量的信息因第一点而丢失,例如我们留不下来的小数精度。也有大量的信息因第二点而丢失,例如手机拍不到原子核的结构。但是并非所有乱七八糟的信息都是我们想要的信息。只要我们要保存的所有信息都是可无损的,那这次保存就是可无损的。</p> <p>例如截图时,我们需要保存的信息就是当前显示的一切,而电子屏幕本身就是按 rgb 值来显示像素块颜色的,因此只要存下所有像素的 rgb 就是无损的,无论是什么编码格式;相对比,拍照时我们想要保存的信息应该是“摄像头这个视角能看到的一切”,摄像头当然做不到,因此无论什么编码格式都是有损的。</p> <p>当然,如果你要说你拍照是为了存下“摄像头没坏”这个信息,那也可以说照片是无损的;同理如果你截屏是为了记录摔碎的屏幕,显然屏幕没有这个采集能力,这是一次全损的尝试。</p> <p>有损无损的定义很灵活,这正体现了保存意义的多样。无论出何原因而存下那份数据,在有损的领域追求无损,也许都是为了保存更多的意义。</p> <p>有关这些事情的思考本身也有意义,保存于此。</p> <h2 id="附录">附录</h2> <h3 id="参考文献">参考文献</h3> <p>无</p> <h3 id="免责声明">免责声明</h3> <p>本文并非专业科普,仅作分享,作者不负责由此产生的任何后果。欢迎交流,如有错误也欢迎指正。</p> <h3 id="版权信息">版权信息</h3> <p>本文原载于 <a class="link" href="https://blog.reincarnatey.net" target="_blank" rel="noopener" >reincarnatey.net</a>,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。</p>

2026/1/10
阅读更多

踩坑记录 | ArtTS 异步回调中 Toast 和 Dialog 不显示的解决方法与可能原因

<h2 id="现象描述">现象描述</h2> <p>在某些异步回调中,Toast 和 Dialog 不能显示,如:</p> <div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#e06c75">commentManager</span>.<span style="color:#e06c75">showCommentDialog</span>(<span style="color:#c678dd">this</span>.<span style="color:#e06c75">getUIContext</span>().<span style="color:#e06c75">getHostContext</span>() <span style="color:#c678dd">as</span> <span style="color:#e06c75">common</span>.<span style="color:#e06c75">UIAbilityContext</span>).<span style="color:#e06c75">then</span>(()<span style="color:#56b6c2">=&gt;</span>{ </span></span><span style="display:flex;"><span> <span style="color:#7f848e">// something </span></span></span><span style="display:flex;"><span><span style="color:#7f848e"></span>}).<span style="color:#c678dd">catch</span>((<span style="color:#e06c75">err</span>: <span style="color:#e5c07b">BusinessError</span>&lt;<span style="color:#e06c75">Object</span>&gt;) <span style="color:#56b6c2">=&gt;</span> { </span></span><span style="display:flex;"><span> <span style="color:#e06c75">myShowToast</span>(); </span></span><span style="display:flex;"><span> <span style="color:#e06c75">myShowDialog</span>(); </span></span><span style="display:flex;"><span>}); </span></span></code></pre></div><p>myShowToast 和 myShowDialog 是一些非常正常的显示逻辑,但是却发现无法正常显示。</p> <h2 id="解决方法">解决方法</h2> <ol> <li>对于 Toast,可以设置 showMode 为 TOP_MOST</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#c678dd">this</span>.<span style="color:#e06c75">getUIContext</span>().<span style="color:#e06c75">getPromptAction</span>().<span style="color:#e06c75">showToast</span>({ </span></span><span style="display:flex;"><span> <span style="color:#e06c75">message</span><span style="color:#56b6c2">:</span> <span style="color:#98c379">&#34;message&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#e06c75">duration</span>: <span style="color:#e5c07b">1500</span>, </span></span><span style="display:flex;"><span> <span style="color:#e06c75">showMode</span>: <span style="color:#e5c07b">promptAction.ToastShowMode.TOP_MOST</span> </span></span><span style="display:flex;"><span>}); </span></span></code></pre></div><ol start="2"> <li>对于 Toast 和 Dialog,可以延时调用</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#e06c75">commentManager</span>.<span style="color:#e06c75">showCommentDialog</span>(<span style="color:#c678dd">this</span>.<span style="color:#e06c75">getUIContext</span>().<span style="color:#e06c75">getHostContext</span>() <span style="color:#c678dd">as</span> <span style="color:#e06c75">common</span>.<span style="color:#e06c75">UIAbilityContext</span>).<span style="color:#e06c75">then</span>(()<span style="color:#56b6c2">=&gt;</span>{ </span></span><span style="display:flex;"><span> <span style="color:#7f848e">// something </span></span></span><span style="display:flex;"><span><span style="color:#7f848e"></span>}).<span style="color:#c678dd">catch</span>((<span style="color:#e06c75">err</span>: <span style="color:#e5c07b">BusinessError</span>&lt;<span style="color:#e06c75">Object</span>&gt;) <span style="color:#56b6c2">=&gt;</span> { </span></span><span style="display:flex;"><span> <span style="color:#e06c75">setTimeout</span>(() <span style="color:#56b6c2">=&gt;</span> { </span></span><span style="display:flex;"><span> <span style="color:#e06c75">myShowToast</span>(); </span></span><span style="display:flex;"><span> <span style="color:#e06c75">myShowDialog</span>(); </span></span><span style="display:flex;"><span> }, <span style="color:#d19a66">500</span>); </span></span><span style="display:flex;"><span>}); </span></span></code></pre></div><p>个人测试发现,当延时调用后就可以正常显示 Toast 和 Dialog 了。</p> <p>当 delay 为 100 时,本地模拟器测试可以正常显示;当 delay 为 10 时,本地模拟器测试有概率显示;当 delay 为 1 时,本地模拟器测试无法正常显示。</p> <p>为尽量在无感前提下保证成功率,建议考虑将 delay 设置为 300 以上。</p> <h2 id="异常原因">异常原因</h2> <p>由以上解决方法,可以猜测这与线程或是上下文无关,而是对于特定的操作(实测 startAbility 的回调也会出现这种情况,个人猜测是打开页面或者调用界面一类的),在执行时能会阻止 Toast 和 Dialog 的显示(可能是将应用判成处于后台从而不能显示),因此延时调用,等待操作完全结束后就可以正常显示了。</p> <h2 id="附录">附录</h2> <h3 id="参考文献">参考文献</h3> <h3 id="版权信息">版权信息</h3> <p>本文原载于 <a class="link" href="https://blog.reincarnatey.net" target="_blank" rel="noopener" >reincarnatey.net</a> 与华为开发者联盟,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。</p>

2025/12/2
阅读更多

踩坑记录 | nvm 安装 node 显示 error installing 24.11.1: Node.js v24.11.1 is not yet released or is not available for download yet.

<h2 id="问题描述">问题描述</h2> <p>今天使用 nvm 安装 Node.js 时报错:error installing 24.11.1: Node.js v24.11.1 is not yet released or is not available for download yet.</p> <p>然而 <code>nvm ls available</code> 里并不空,镜像配置似乎没问题。</p> <h2 id="解决方法">解决方法</h2> <p>删掉 settings.txt 中的镜像配置就可以正常安装了。</p> <h2 id="原因">原因</h2> <p>推测可能是新版本 nvm 安装行为逻辑有变动,导致镜像不适配了。</p> <h2 id="附录">附录</h2> <h3 id="参考文献">参考文献</h3> <h3 id="版权信息">版权信息</h3> <p>本文原载于 <a class="link" href="https://blog.reincarnatey.net" target="_blank" rel="noopener" >reincarnatey.net</a>,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。</p>

2025/12/2
阅读更多

学习笔记 | Cloudflare 邮箱实现自动回复

<h2 id="前言">前言</h2> <p>也许你需要为你的 Cloudflare 实现一个自动回复?</p> <p>不管如何,我是需要的,但网络上资料又确实不多(至少我并未在中文互联网中找到),因而在此记录。</p> <h2 id="原理">原理</h2> <p>理所当然也别无选择地,我们使用 Cloudflare Workers 下的 Email Workers 实现。</p> <p>根据<a class="link" href="https://developers.cloudflare.com/email-routing/email-workers/reply-email-workers/" target="_blank" rel="noopener" >官方文档给出的回复方法</a>,我们需要使用 mimetext 中的 createMimeMessage,因此没办法像<a class="link" href="https://blog.reincarnatey.net/2024/0803-cloudflare-email-worker-forward-more/" target="_blank" rel="noopener" >上次</a>一样直接在线编辑了,必须要在本地开发好后部署。</p> <h2 id="安装-wrangler">安装 Wrangler</h2> <p>Wrangler 是 Cloudflare 官方推出的命令行界面(CLI)工具,专门用于管理和开发 Cloudflare Workers 以及其他相关的开发者平台产品。</p> <p>我们要在本地进行 Worker 的开发,所以先来安装 Wrangler,需要用到 npm。</p> <div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cmd" data-lang="cmd"><span style="display:flex;"><span>npm install -g wrangler </span></span></code></pre></div><p>安装完成后使用以下命令登录,在弹出的窗口中登录 Cloudflare 并授权。</p> <div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cmd" data-lang="cmd"><span style="display:flex;"><span>wrangler login </span></span></code></pre></div><h2 id="创建项目">创建项目</h2> <p>接着在你希望创建项目的目录下打开 cmd(用 powershell 可能因为禁止运行脚本而出错),新建项目。</p> <div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cmd" data-lang="cmd"><span style="display:flex;"><span>wrangler init auto-reply </span></span></code></pre></div><p>过程中需要回答一些问题,按照自己的情况选即可,使用方向键选择。</p> <p>这里我们只是想实现一个邮箱自动回复,模版选择 <code>Hello World example</code> 的 <code>Worker only</code> 即可,语言推荐 JavaScript(文档使用的语言),其他的随意。</p> <p>等待一段时间,项目目录就创建好了。</p> <p>因为要使用 Node.js 库,因此需要修改项目配置,启用 Node.js 兼容。</p> <p>项目目录下的 <code>wrangler.jsonc</code> 是项目配置文件,我们在里面添加:</p> <div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#98c379">&#34;compatibility_flags&#34;</span>: [ </span></span><span style="display:flex;"><span> <span style="color:#98c379">&#34;nodejs_compat&#34;</span> </span></span><span style="display:flex;"><span>] </span></span></code></pre></div><p>就完成项目配置了。</p> <h2 id="安装-mimetext-并编写代码">安装 mimetext 并编写代码</h2> <p>在项目目录下运行 cmd,输入命令安装。</p> <div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cmd" data-lang="cmd"><span style="display:flex;"><span>npm install mimetext </span></span></code></pre></div><p>然后修改 <code>src/index.js</code> 为下方代码,并修改注释标记的三处配置,就完成了。</p> <div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#c678dd">import</span> { <span style="color:#e06c75">EmailMessage</span> } <span style="color:#e06c75">from</span> <span style="color:#98c379">&#34;cloudflare:email&#34;</span>; </span></span><span style="display:flex;"><span><span style="color:#c678dd">import</span> { <span style="color:#e06c75">createMimeMessage</span> } <span style="color:#e06c75">from</span> <span style="color:#98c379">&#34;mimetext&#34;</span>; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#c678dd">export</span> <span style="color:#c678dd">default</span> { </span></span><span style="display:flex;"><span> <span style="color:#c678dd">async</span> <span style="color:#e06c75">email</span>(<span style="color:#e06c75">message</span>, <span style="color:#e06c75">env</span>, <span style="color:#e06c75">ctx</span>) { </span></span><span style="display:flex;"><span> <span style="color:#7f848e">// 配置发件人信息 </span></span></span><span style="display:flex;"><span><span style="color:#7f848e"></span> <span style="color:#c678dd">const</span> <span style="color:#e06c75">senderName</span> <span style="color:#56b6c2">=</span> <span style="color:#98c379">&#34;no-reply&#34;</span>; </span></span><span style="display:flex;"><span> <span style="color:#c678dd">const</span> <span style="color:#e06c75">senderAddress</span> <span style="color:#56b6c2">=</span> <span style="color:#98c379">&#34;&lt;SENDER&gt;@example.com&#34;</span>; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#c678dd">const</span> <span style="color:#e06c75">msg</span> <span style="color:#56b6c2">=</span> <span style="color:#e06c75">createMimeMessage</span>(); </span></span><span style="display:flex;"><span> <span style="color:#e06c75">msg</span>.<span style="color:#e06c75">setHeader</span>(<span style="color:#98c379">&#34;In-Reply-To&#34;</span>, <span style="color:#e06c75">message</span>.<span style="color:#e06c75">headers</span>.<span style="color:#e06c75">get</span>(<span style="color:#98c379">&#34;Message-ID&#34;</span>)); </span></span><span style="display:flex;"><span> <span style="color:#e06c75">msg</span>.<span style="color:#e06c75">setSender</span>({ <span style="color:#e06c75">name</span><span style="color:#56b6c2">:</span> <span style="color:#e06c75">senderName</span>, <span style="color:#e06c75">addr</span><span style="color:#56b6c2">:</span> <span style="color:#e06c75">senderAddress</span> }); </span></span><span style="display:flex;"><span> <span style="color:#e06c75">msg</span>.<span style="color:#e06c75">setRecipient</span>(<span style="color:#e06c75">message</span>.<span style="color:#e06c75">from</span>); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#7f848e">// 配置邮件标题和内容 </span></span></span><span style="display:flex;"><span><span style="color:#7f848e"></span> <span style="color:#e06c75">msg</span>.<span style="color:#e06c75">setSubject</span>(<span style="color:#98c379">&#34;自动回复&#34;</span>); </span></span><span style="display:flex;"><span> <span style="color:#e06c75">msg</span>.<span style="color:#e06c75">addMessage</span>({ </span></span><span style="display:flex;"><span> <span style="color:#e06c75">contentType</span><span style="color:#56b6c2">:</span> <span style="color:#98c379">&#39;text/plain&#39;</span>, </span></span><span style="display:flex;"><span> <span style="color:#e06c75">data</span><span style="color:#56b6c2">:</span> <span style="color:#98c379">`我们已收到您的邮件`</span> </span></span><span style="display:flex;"><span> }); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#c678dd">const</span> <span style="color:#e06c75">replyMessage</span> <span style="color:#56b6c2">=</span> <span style="color:#c678dd">new</span> <span style="color:#e06c75">EmailMessage</span>( </span></span><span style="display:flex;"><span> <span style="color:#e06c75">senderAddress</span>, </span></span><span style="display:flex;"><span> <span style="color:#e06c75">message</span>.<span style="color:#e06c75">from</span>, </span></span><span style="display:flex;"><span> <span style="color:#e06c75">msg</span>.<span style="color:#e06c75">asRaw</span>() </span></span><span style="display:flex;"><span> ); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#c678dd">await</span> <span style="color:#e06c75">message</span>.<span style="color:#e06c75">reply</span>(<span style="color:#e06c75">replyMessage</span>); </span></span><span style="display:flex;"><span> <span style="color:#7f848e">// 当然,不能光回复,还要将邮件转发到你接受邮件的邮箱,这个邮箱需要在 Cloudflare Email Routing 里验证过 </span></span></span><span style="display:flex;"><span><span style="color:#7f848e"></span> <span style="color:#c678dd">await</span> <span style="color:#e06c75">message</span>.<span style="color:#e06c75">forward</span>(<span style="color:#98c379">&#34;example@example.com&#34;</span>); </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span>} </span></span></code></pre></div><h2 id="部署">部署</h2> <p>最后,在项目目录下运行以下命令部署到云端。</p> <div class="highlight"><pre tabindex="0" style="color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cmd" data-lang="cmd"><span style="display:flex;"><span>wrangler deploy </span></span></code></pre></div><p>接着,打开你的 Cloudflare Dashboard,来到对应域名的 Email Routing 电子邮件路由页面,查看电子邮件 Workers,可以发现刚刚部署的已经出现在上面了,将其分配给对应的邮箱地址即可。</p> <p>注意需要等待约半分钟才会生效。</p> <p>可以给自己发一条邮件测试,发现成功收到了自动回复。</p> <h2 id="附录">附录</h2> <h3 id="参考文献">参考文献</h3> <ol> <li><a class="link" href="https://developers.cloudflare.com/email-routing/email-workers/reply-email-workers/" target="_blank" rel="noopener" >官方文档</a></li> <li><a class="link" href="https://github.com/mgmgprndev/CloudflareEmailWorker_AutoReply?tab=readme-ov-file" target="_blank" rel="noopener" >mgmgprndev/CloudflareEmailWorker_AutoReply 项目</a></li> <li><a class="link" href="https://blog.csdn.net/Tisfy/article/details/144488128" target="_blank" rel="noopener" >Cloudflare workers - 如何使用(起步篇)</a></li> <li><a class="link" href="https://fe.azhubaby.com/BackEnd/cloudflare/worker.html#%E9%80%9A%E8%BF%87-wrangler-%E9%83%A8%E7%BD%B2" target="_blank" rel="noopener" >Cloudflare菩萨系列:workers 使用指南</a></li> <li><a class="link" href="https://yangzh.cn/posts/cloudflare/wrangler" target="_blank" rel="noopener" >Wrangler 入门:开启你的 Cloudflare Serverless 之旅</a></li> <li><a class="link" href="https://developers.cloudflare.com/workers/configuration/compatibility-flags/#nodejs-compatibility-flag" target="_blank" rel="noopener" >官方文档 - Compatibility flags</a></li> </ol> <h3 id="版权信息">版权信息</h3> <p>本文原载于 <a class="link" href="https://blog.reincarnatey.net" target="_blank" rel="noopener" >reincarnatey.net</a>,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。</p>

2025/12/2
阅读更多

逻辑解构 | 秩序的帽子戏法

<h2 id="题目">题目</h2> <p>数学大臣尤泽尔被国王亚路开德召到皇宫,却发现前面已经排了 9 个非常奇怪的人——这些人全都戴上了帽子,或黑或白。</p> <p>早在一旁等候的侍卫克里亚,向一脸疑惑的尤泽尔走了过来。</p> <p>“陛下正在让他们完成一个挑战”,克里亚解释说,“每次我都会给他们每个人随机戴上黑或白色的帽子,所有人要轮流猜自己头顶上的帽子的颜色,最多只可以猜错一次。”</p> <p>“原来这些帽子不是他们自己戴上的?但陛下恐怕要失望了,很显然人类无法看到自己的头顶”,尤泽尔略加思索,“除非里面有数学大臣。”</p> <p>“数学大臣就可以看到头顶吗?”</p> <hr> <p>尤泽尔加入了挑战。</p> <p>他们有一次商讨策略的机会,可以按任意顺序排队和报答案,但在排好队之后尤泽尔才会开始给他们戴帽子,排好队后只有嘴可以动。请问他们有完成挑战的方法吗?</p> <blockquote> <p><strong>答案(不唯一)</strong></p> <p>由于每个人都看得到前面的人的帽子,也听得到其他人报答案,所以以下策略是可行的:</p> <ul> <li>每个人都面朝前方排成一条直线,并从后往前报答案</li> <li>对于最后一个人,若前面有奇数顶黑帽子,就报黑色,若有偶数顶黑帽子,就报白色</li> <li>对于其他人,根据后面的人报的颜色可以推算出自己的颜色</li> </ul> <p><strong>证明</strong></p> <p>由于每个人都看得到前面的人的帽子,也听得到其他人报答案,所以除了最后一个人以外,其他人:</p> <ul> <li>可以看到前面有多少顶黑帽子</li> <li>可以听到除了最后一个人,后面有多少顶黑帽子</li> <li>最后一个人报出了前 9 个人共有奇数还是偶数顶黑帽子</li> </ul> <p>不妨设总共有偶数顶黑帽子,否则就将颜色取反,此时有:</p> <ul> <li>若前面有偶数顶,后面有偶数顶,那么自己一定是白帽子</li> <li>若前面有偶数顶,后面有奇数顶,那么自己一定是黑帽子</li> <li>若前面有奇数顶,后面有偶数顶,那么自己一定是黑帽子</li> <li>若前面有奇数顶,后面有奇数顶,那么自己一定是白帽子</li> </ul> <p>上述推理很好证明,以第一点为例:若前面有偶数顶,后面有偶数顶,如果自己还是黑帽子的话就总共有“前面偶数顶+后面偶数顶+自己1顶=奇数顶”了,与总共有偶数顶黑帽子矛盾,所以自己一定是白帽子。</p> <p>其他三点证明也同理。因此该策略可以保证除了最后一个人以外必定猜对,可以完成挑战。</p> </blockquote> <h2 id="原理">原理</h2> <p>原理在证明中已经体现得淋漓尽致了,就是<strong>奇偶性</strong>,然后舍弃最后一个人来传递信息,再充分利用游戏规则中隐含的已知信息来推算答案。</p> <p>更深层的原理其实类似于<a class="link" href="https://blog.reincarnatey.net/2025/0630-2coin-problem/" target="_blank" rel="noopener" >本系列第一题</a>的结论:在所有数值域均为模数的情况下,模意义下减法具有唯一解。</p> <p>我们可以这么表述这个答案:设 $c_i$ 为从前往后第 $i$ 个人帽子的颜色,$0$ 为白色,$1$ 为黑色,这样从后往前报颜色,那么第 $i$ 个人:</p> <ul> <li>可以看到前面的颜色和:$s_1=c_1+c_2+\cdots+c_{i-1}$</li> <li>可以听到后面的颜色和:$s_2=c_{i+1}+c_{i+2}+\cdots+c_9$</li> <li>最后一个人报了总颜色和:$s=c_1+c_2+\cdots+c_9$</li> </ul> <p>因此自然可以算出自己的颜色 $c_i=s-s_1-s_2$。上式全部是模 $2$ 意义下的,根据上述结论,$c_i$ 有唯一解。</p> <p>当然,我们其实也可以将上述操作看作异或,这是另一种解释。</p> <h2 id="思考">思考</h2> <h3 id="可以更多人吗">可以更多人吗?</h3> <p>显然可以,因为上述策略总是可以保证除了最后一个人以外全对,因此无论有多少个人都可以完成挑战。</p> <h3 id="可以更多颜色吗">可以更多颜色吗?</h3> <p>也可以,因为该结论在任意模数下都是成立的,因此这个策略可以推广到任意颜色数</p> <h3 id="其他的答案">其他的答案?</h3> <p>在理解以上答案之后,我们不禁思考能否选择观察别的数据或别的性质。</p> <p>毫无疑问,由于最后一个人已知信息最多,但唯独绝对不可能知道自己的信息,因此最后一个人一定是负责报一个全局信息来让其他人能够猜出自己颜色的。</p> <p>什么样的信息符合要求呢?思考上述过程,我们发现要求是:对于任意已有的颜色序列,再加入不同的颜色会对信息造成不同的变化(不变也算作一种变化),且这一运算是存在逆运算的,且这一信息的可能状态数不超过颜色个数。</p> <p>先只考虑两个颜色的情况,此时我们需要用一个 bit 来表示出包含所有人颜色在内的信息。</p> <p>我绞尽脑汁想出来一个“长度为奇数的黑色段的奇偶性”,这是可行的,但其本质上其实与之前一个答案是一样的,因为黑帽子总数的奇偶性就取决于长度为奇数的黑色段的奇偶性,因此实际上是换一个表述。</p> <p>还有其他的表述形式,例如“黑色与白色个数的差值(若 $n$ 为奇数还需要减去 $1$)是否是 $4$ 的倍数”、“黑色连续段的长度的异或和的奇偶性”,这些其实都等价于黑帽子个数的奇偶性。</p> <p>实际上,对于每个人都是已知除了自己与最后一个人以外的所有颜色信息,所以我们只需要满足,在其他信息相同的情况下,自己是黑是白会导致全局信息不同即可。</p> <p>用数学来描述的话,这样的全局信息必须对应一个函数 $f: {B,W}^{n-1} \to {0,1}$,使得对于每个位置 $i$ 和每个其他帽子的配置,改变第 $i$ 顶帽子的颜色都会改变函数值 $f$。</p> <p>满足这种条件的函数,只能是前 $n-1$ 顶帽子黑帽子个数的奇偶性函数或其否定(即奇偶性的补)。</p> <p>因此,唯一可行的策略就是基于奇偶性的策略,不存在其他策略能保证最多错一次。</p> <h2 id="附录">附录</h2> <h3 id="参考文献">参考文献</h3> <p>由于这个问题非常经典,解法也非常经典,所以就写到这了。</p> <h3 id="版权信息">版权信息</h3> <p>本文原载于 <a class="link" href="https://blog.reincarnatey.net" target="_blank" rel="noopener" >reincarnatey.net</a>,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。</p>

2025/9/5
阅读更多

学习笔记 | 初学打字标准指法常见问题的自我 Q&A

<h2 id="前言">前言</h2> <p>博主于 2024 年八月末开始学习打字标准指法,于 2024 年九月初提出本文中的问题,于 2025年七月中回答本文中的问题。</p> <p>博主使用的是机械键盘,使用拼音输入。</p> <p>我原本的输入指法十分不标准,左手四指初始位置为 Shift、A、S、D,大致是由于我是在游戏过程中熟悉电脑键盘的,而游戏的常见键位导致很容易出现这样的初始位置。并在此错误基础上,由于我后来接触了编程与算法竞赛,需要大量的输入,由此形成了一套自己的“按法”(例如输入 scanf 时我的手的动作跨度很大、幅度很不合理,但由于习惯所以打得很快,或是 G 我会下意识用右手去按)。</p> <p>习惯的事情,难改是正常的,但越早改越好。要改过来也很容易,实际上打个小半天就能有点习惯了。</p> <p>我是使用打字练习网站进行练习,其他的打字软件应该也是一样的效果。</p> <p>个人推荐先从拼音练起,拼音是很固定的搭配组合,很容易就练得很顺手,相比之下英文与编程时可能远没有那么顺手。</p> <p>据说练习时最好不看键盘 ,我持保留意见。的确你不能想着一直看着键盘打字,练熟以后肯定是不看的,但是初学时知道自己的手指在做什么也很重要,我认为偶尔以检查的目光去看一下还是有必要的。</p> <p>打这篇文章时实际上还是没有完全习惯,打错很多,不过这是我没有练习的原因。</p> <p>总而言之,希望能解答一些初学者的疑惑。</p> <h2 id="练习标准指法的好处">练习标准指法的好处</h2> <ul> <li> <p>每个手指的安排相对更合理,可以减少手部移动,减轻手指负担</p> </li> <li> <p>减少需要的位移也会间接降低输错的概率,按三格开外的键比按旁边的键要容易按错的多</p> </li> <li> <p>熟悉以后可以加快平均输入速度</p> </li> <li> <p>可以更充分地利用所有手指</p> </li> <li> <p>个人认为打字时候的动作也更美观,至少你盯着自己打字的手看还蛮解压的</p> </li> </ul> <h2 id="q--a">Q &amp; A</h2> <p><strong>Q:哪只手按空格</strong></p> <p>A:左右手大拇指都停留在空格上,想用哪只用哪只。有一只说法是,按空格的上一个键是左手的话就用右手按空格,上一个键是右手的话就用左手按空格,这样会更省力,但实际上我认为怎么按都比较舒适,不会有太大的差别。</p> <p><strong>Q:无名指和小拇指感觉没力气,按键盘很虚,而且容易触发多次按下</strong></p> <p>A:这就说明以前的指法是错误的,没怎么用到这两个手指,打多了自然就有力气了,现在我的无名指和小拇指打字打起来感觉很正常,不会很虚,也不会触发多次按下。</p> <p><strong>Q:一换指法就跟不记得键盘一样</strong></p> <p>A:打少了导致的。</p> <p><strong>Q:凭什么右手小拇指在分号上</strong></p> <p>A:我是怎么问出这种问题的。右手小拇指在分号上,确实分号很少按,但它还负责了一大片区域呀,比方说回车、退格等等,实际上是最累的手指。</p> <p><strong>Q:左右手不协调</strong></p> <p>A:打少了导致的。</p> <p><strong>Q:左手中指无名指和右手中指移动的时候会连带着其他手指一起移动</strong></p> <p>A:打少了导致的。现在我不会出现这种情况,实际上出现的话也没关系,轻微动一动也可以的。</p> <p><strong>Q:总感觉某些指按某些键更合理</strong></p> <p>A:我已经记不起来那时候我是怎么想的了,应该也是打少了导致的。</p> <p><strong>Q:左手到 B、右手到 Y 太远了</strong></p> <p>A:确实,左手的 B 确实比较不舒服,右手的 Y 还好,但是习惯就好。</p> <p><strong>Q:Shift、Ctrl、Alt 哪只手按</strong></p> <p>A:如果要配合的键是右手按,那么就用左手按 Shift、Ctrl、Alt;如果要配合的键是左手按 ,那么就用右手按 Shift、Ctrl、Alt。</p> <p><strong>Q:打中文选词按数字键好远</strong></p> <p>A:这对于所有指法都是一样的吧。只能说善用空格键,然后习惯就好。</p> <p><strong>Q:老是打错</strong></p> <p>A:这不是指法的问题。</p> <p><strong>Q:打 R 的时候感觉手指有点挤</strong></p> <p>A:好像是有点,但现在已经蛮习惯的,没有觉得不舒服。所以习惯就好。</p> <p><strong>Q:手指何时该归位</strong></p> <p>A:最初的我认为打完之后手指可以在那个键上停留一会,这样如果连续打的话可以加快速度,过大概几秒手指才会归位,但是现在的我发现,打习惯之后,会感觉手指就像弹簧,你不用力的话会自动归位到初始位置,于是也就打完之后自动归位了。</p> <h2 id="附录">附录</h2> <h3 id="参考文献">参考文献</h3> <h3 id="版权信息">版权信息</h3> <p>本文原载于 <a class="link" href="https://blog.reincarnatey.net" target="_blank" rel="noopener" >reincarnatey.net</a>,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。</p>

2025/7/20
阅读更多

逻辑解构 | 真实与谎言的守门人

<h2 id="题目">题目</h2> <p>数学大臣尤泽尔受到国王亚路开德的召见,被侍卫克里亚带到了一个房间。在他的面前只有两扇门,门前各有一个守门人。</p> <p>“两个守门人中有一个人只说真话,另一个人只说假话”,克里亚说,“陛下在其中一扇门后面等着您,但陛下要求您只可以问其中一个人一个问题。”</p> <p>“另一扇门后面有什么?”尤泽尔问。</p> <p>这位王国最聪明的头脑,以往都是二话不说地轻松解决所有谜题,今天居然问起了失败的后果。克里亚有些诧异,但还是耐心地解释道“只有一把空椅子。”</p> <p>“不错”,尤泽尔呢喃了一句,令克里亚心里顿感不妙。</p> <p>尤泽尔随便走向其中一个守门人,问了一个有些复杂的问题,守门人随即陷入沉思,那痛苦的表情让克里亚有些担心。但好在,几分钟过后,守门人还是回答了上来,是正确的门。然而,克里亚尚未来得及松一口气,只见尤泽尔直接打开了另外一扇门——然后坐到了那把空椅子上。在守门人赶上之前,尤泽尔砰地一声关上了门。</p> <p>“让陛下来找我”,尤泽尔的声音透过门传来,“他只能问其中一个人一个问题”。</p> <hr> <p>陛下应该问什么问题,才能找到正确的门?</p> <blockquote> <p><strong>答案(不唯一)</strong></p> <p>问其中一个守门人:“如果我问另一个守门人‘哪扇是正确的门&rsquo;,他会回答哪扇门?”,回答的门就是错误的门,选择另一扇门即可。</p> <p><strong>证明</strong></p> <p>分类讨论:</p> <ul> <li>若问到了说真话的守门人,则另一个守门人说的是假话,会回答错误的门,那么这个说真话的守门人就会告诉你错误的门</li> <li>若问到了说假话的守门人,则另一个守门人说的是真话,会回答正确的门,那么这个说假话的守门人就会告诉你错误的门</li> </ul> <p>所以无论问的是哪个守门人,回答都是错误的门,因此选择另一扇门即可。</p> </blockquote> <h2 id="原理">原理</h2> <p>这里我们先完善一下“说假话”的定义:若答案是二元的(如是或不是、左或右等),则会说相反的答案;若答案非二元,则有可能说出任何不正确的答案。</p> <p>我们先来弄清楚这个游戏存在的二元:</p> <ul> <li>两个守门人,其中一个只说真话,一个只说假话</li> <li>两扇门,只有一扇门是正确的</li> </ul> <p>前者是游戏背景规则,也是做选择时的限制,但<strong>并非我们需要的答案</strong>;后者是游戏背景规则,也是我们需要的答案。</p> <p>只问一个问题很难同时得到两个问题的答案,因此我们应该考虑放弃弄清楚谁说真话谁说假话,只要确定哪扇门是正确或错误的就可以了。换言之,我们需要问一个“<strong>不管问到说真话还是说假话的人,都会回答相同的答案</strong>”的问题。</p> <p>答案的问题正是如此。从证明里我们能发现,不管问到说真话还是说假话的守门人,最后回答的都是错误的门。</p> <p>为何能达成这样的效果呢?我们研究一下,问题的回答在被我们得知之前都经过了什么。以左边的门为正确的门且问到了说真话的守门人为例:</p> <ul> <li>最内层的问题:哪扇是正确的门,此时回答为左</li> <li>内层问题:问另一个守门人“哪扇是正确的门”的回答,由于另一个守门人说的是假话,最内层回答为左,所以此时回答为右</li> <li>外层问题:问这个守门人“如果问另一个守门人…”的回答,由于这个守门人说的是真话,内存回答为右,所以此时回答为右</li> </ul> <p>再以左边的门为正确的门,且问到了说假话的守门人为例;</p> <ul> <li>最内层的问题:哪扇是正确的门,此时回答为左</li> <li>内层问题:问另一个守门人“哪扇是正确的门”的回答,由于另一个守门人说的是真话,最内层回答为左,所以此时回答为左</li> <li>外层问题:问这个守门人“如果问另一个守门人…”的回答,由于这个守门人说的是假话,内存回答为左,所以此时回答为右</li> </ul> <p>可以发现,两次回答的过程的共同点是,回答都是被反转了一次的。</p> <p>答案的巧妙之处在于,这个问题虽然只对一个守门人问了,但其实<strong>回答的过程把两个人都经过了</strong>,因此得到的回答一定是最内层问题的相反回答。</p> <p>因此,原理同上的问题都可以完成本题的任务。如“另一个守门人会告诉我正确的门是左边的门吗?”,如果回答不会,那么正确的门就是左边的门。</p> <h2 id="思考">思考</h2> <h3 id="这里面有没有什么数学原理呢">这里面有没有什么数学原理呢?</h3> <p>当然是有的。</p> <p>说句题外话:逻辑解构系列里的谜题当然都是有更深的原理的,这样才值得我们研究,而且几乎必然离不开数学,这也是为什么尤泽尔是数学大臣而不是物理大臣或者解谜大臣。</p> <p>理解上面的原理后,我们发现,因为原问题必定把两个守门人都经过一次,所以回答一定会被反转一次,此时两个守门人有点类似“串联”的关系。</p> <p>用逻辑表示说真话与说假话使答案发生的变化的话,说真话就是保持不变,说假话就是取反。</p> <p>答案问题中的“串联”,实际上就等价于最内层问题的一个取反,只不过是利用游戏规则表达成了语言而已。</p> <pre class="mermaid" style="text-align: center;"> flowchart LR A[原问题回答] B[说真话的守门人] C[说假话的守门人] D[给尤泽尔的回答] A--&gt;B B--保持不变--&gt;C C--取反--&gt;D </pre> <p>同理,我们很容易想到另一种“串联”方法:将自己与自己串联。说真话串上说真话,答案不变;说假话串上说假话,就是取反再取反,也是不变。转换成语言就是“如果我问你,哪扇是正确的门,你会回答哪扇门?”</p> <pre class="mermaid" style="text-align: center;"> flowchart LR subgraph 问到说假话的守门人 direction LR E[原问题回答] F[说假话的守门人] G[说假话的守门人] H[给尤泽尔的回答] E--&gt;F F--取反--&gt;G G--再取反--&gt;H end subgraph 问到说真话的守门人 direction LR A[原问题回答] B[说真话的守门人] C[说真话的守门人] D[给尤泽尔的回答] A--&gt;B B--保持不变--&gt;C C--保持不变--&gt;D end </pre> <p>这样我们就得出了本题的另一个可能的答案,并且这个答案会直接得到正确的门,不用再反转一次,并且哪怕只有一个守门人也可以问到正确的门。</p> <h3 id="和位运算有关系吗">和位运算有关系吗?</h3> <p>过程之中的反转,很容易让我们联想到布尔值。提到布尔值,很容易联想到的就是逻辑运算或者位运算,这里我们研究位运算,那不得不做的就是看一下真值表。</p> <p>以二元问题为例,我们把其中一个答案看作 $1$,相反答案看作 $0$。这里我们将一个问题在经过守门人之前的答案看作输入,守门人会给出的答案看作输出。</p> <p>那么,只说真话的守门人的真值表:</p> <table> <thead> <tr> <th style="text-align: center">输入</th> <th style="text-align: center">输出</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">0</td> <td style="text-align: center">0</td> </tr> <tr> <td style="text-align: center">1</td> <td style="text-align: center">1</td> </tr> </tbody> </table> <p>原封不动,我们可以看作和 $1$ 做与运算,也就是 <code>x &amp; 1</code>。</p> <p>我们再来看看只说假话的守门人的真值表:</p> <table> <thead> <tr> <th style="text-align: center">输入</th> <th style="text-align: center">输出</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">0</td> <td style="text-align: center">1</td> </tr> <tr> <td style="text-align: center">1</td> <td style="text-align: center">0</td> </tr> </tbody> </table> <p>取反,我们可以看作取反,也就是 <code>~x</code>,也可以看作 <code>x ^ 1</code>。</p> <p>由此,我们可以发现上面的第一种答案对应的运算其实就是 <code>~(x &amp; 1)</code> 或者 <code>~(x ^ 1)</code>,第二种对应的是 <code>~(~x)</code> 或者 <code>x ^ 1 ^ 1</code>。</p> <p>由此我们也可以玩的更复杂一些,叠更多的运算。当然,由于我们并不知道哪个人说真话哪个人说假话,所以两种运算符的数量要一致。</p> <p>例如,我们尝试构造 <code>~(~~x&amp;1&amp;1)&amp;1</code> 对应的问题:</p> <pre class="mermaid" style="text-align: center;"> graph LR A[原问题回答]--&gt;B[真话]--不变--&gt;C[真话]--不变--&gt;D[假话]--取反--&gt;E[假话]--取反--&gt;F[真话]--不变--&gt;G[假话]--取反--&gt;H[尤泽尔] </pre> <blockquote> <p>问说假话的人:如果我问另一个人【如果我问另一个人〖如果我问你“如果我问另一个人‘如果我问你,哪扇是正确的门,你会回答哪扇门’,他会回答哪扇门”,你会回答哪扇门〗他会回答哪扇门】,他会回答哪扇门?</p> </blockquote> <h3 id="更多的守门人">更多的守门人?</h3> <p>位运算总共有六种,运算对象有两种,由此可以构造出一共八种守门人,请选择你的角色:</p> <table> <thead> <tr> <th>位运算</th> <th>对应的守门人</th> </tr> </thead> <tbody> <tr> <td><code>x &amp; 1</code></td> <td>只说真话</td> </tr> <tr> <td><code>x &amp; 0</code></td> <td>只说否</td> </tr> <tr> <td><code>x | 1</code></td> <td>只说是</td> </tr> <tr> <td><code>x | 0</code></td> <td>只说真话</td> </tr> <tr> <td><code>x ^ 1</code></td> <td>只说假话</td> </tr> <tr> <td><code>x ^ 0</code></td> <td>只说真话</td> </tr> <tr> <td><code>~x</code></td> <td>只说假话</td> </tr> <tr> <td>左右移</td> <td>胡言乱语</td> </tr> </tbody> </table> <h3 id="真的没办法同时问出谁说真话谁说假话吗">真的没办法同时问出谁说真话谁说假话吗?</h3> <p>倘若限定只问二元问题,那确实是没办法的,因为规则限定只能问到一个二元信息,只能表示一个回答。</p> <p>若不限定只问二元问题,那就需要对“说假话”有更进一步的定义了,在特定定义下像这样的问题可能会有效:</p> <blockquote> <p>若你说真话且这是正确的门,请说 1;若你说真话且这是错误的门,请说 2;若你说假话且这是正确的门,请<strong>不要</strong>说 3;若你说假话且这是错误的门,请<strong>不要</strong>说 4。</p> </blockquote> <p>但我更倾向于,“说假话”的定义应该可以解释为:先假设你说真话,得到的答案我们定义为正确答案,则你可以回答除了正确答案以外的任意答案。</p> <p>在这个定义下,上述问题也无效。</p> <p>若答案只有两种,则只能表示一个回答;若答案有两种以上,那么说假话的人,除了正确答案可能会回答任意一种,无法和情况一一对应。也就是说,以最严格的规则是无法同时问出的。</p> <h2 id="附录">附录</h2> <h3 id="参考文献">参考文献</h3> <p>问题经过故事化(这会成为逻辑解构的传统),原问题与原答案来自于某本小说。</p> <h3 id="版权信息">版权信息</h3> <p>本文原载于 <a class="link" href="https://blog.reincarnatey.net" target="_blank" rel="noopener" >reincarnatey.net</a>,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。</p>

2025/7/4
阅读更多

逻辑解构 | 默契硬币

<h2 id="题目">题目</h2> <p>国王亚路开德试图量化一对搭档有多默契,于是他设计了一个默契测试:两位受试者分别在两个相隔遥远的封闭房间内各抛一枚硬币,然后猜测<strong>其搭档的抛硬币的结果</strong>,如果两个人中<strong>至少一个人</strong>猜对搭档的结果,则计一分。进行一百次这样的测试后的总分,就是这对搭档的默契值。</p> <p>然而,数学大臣尤泽尔立刻发现了这个测试的漏洞,他想到了一个可以百分百得分的策略。</p> <p>请问尤泽尔的策略是什么?</p> <blockquote> <p><strong>答案</strong></p> <p>一人始终把自己硬币的结果猜上去,一人始终把自己硬币的相反结果猜上去。</p> <p>在这样的策略下,总会有一人猜对,一人猜错。</p> <p><strong>证明</strong></p> <p>设 A 是那个始终把自己硬币的结果猜上去的人,B 是始终把自己硬币的相反结果猜上去的人。</p> <p>不妨设 A 抛到了正面。根据 A 的策略,A 会猜 B 抛到了正面,此时有两种可能:</p> <ul> <li> <p>如果 A 猜对了,即 B 抛到的是正面,根据 B 的策略,B 会猜 A 抛到了反面,B 猜错。</p> </li> <li> <p>如果 A 猜错了,即 B 抛到的是反面,根据 B 的策略,B 会猜 A 抛到了正面,B 猜对。</p> </li> </ul> <p>所以总会有一人猜对,一人猜对。根据游戏规则,在这样的策略下可以百分百得分。</p> </blockquote> <h2 id="原理">原理</h2> <p>先来看最容易想到的一种错误方式:每个人猜对的概率是 $\frac12$,那么两个人中至少一个人猜对的概率应该是 $\frac34$。如果这是对的,那么不应该存在百分百得分的策略才对。</p> <p>答案的正确性毫无疑问,但其并非来自于灵光一现,下面我们来理解答案的原理。</p> <p>答案是怎么起作用的?上面的想法错在哪儿了?为什么猜对方的硬币,策略却只与自己的结果有关?</p> <p>硬币只有两种结果,所以一共只有 16 种情况,我们可以使用枚举法。这里我列出了所有无法得分的情况,即两个人都猜错的情况:</p> <table> <thead> <tr> <th style="text-align: center">序号</th> <th style="text-align: center">A 结果</th> <th style="text-align: center">A 猜测 B 结果</th> <th style="text-align: center">B 结果</th> <th style="text-align: center">B 猜测 A 结果</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">1</td> <td style="text-align: center">正</td> <td style="text-align: center">正</td> <td style="text-align: center">反</td> <td style="text-align: center">反</td> </tr> <tr> <td style="text-align: center">2</td> <td style="text-align: center">反</td> <td style="text-align: center">反</td> <td style="text-align: center">正</td> <td style="text-align: center">正</td> </tr> <tr> <td style="text-align: center">3</td> <td style="text-align: center">正</td> <td style="text-align: center">反</td> <td style="text-align: center">正</td> <td style="text-align: center">反</td> </tr> <tr> <td style="text-align: center">4</td> <td style="text-align: center">反</td> <td style="text-align: center">正</td> <td style="text-align: center">反</td> <td style="text-align: center">正</td> </tr> </tbody> </table> <p>如果你观察力足够强,可以发现四种情况存在一些共性:</p> <ul> <li>1 和 2 是两个人都把自己硬币的结果猜上去了</li> <li>3 和 4 是两个人都把自己硬币的相反结果猜上去了</li> </ul> <p>现在可以回答第一个问题了:答案的策略完全避开了两个人都猜错的情况,所以就必然得分了。</p> <p>的确,枚举之后就可以瞪出答案。直接枚举情况然后针对特点来设计策略是一种好方法,但可能会有点令人失望。有没有更深一点的原理呢?</p> <p>还可以这样理解答案:”把自己硬币的结果猜上去“有些奇怪,其实意思就是“<strong>猜两个硬币的结果相同</strong>“。同理,另一方实际上在做的是”<strong>猜两个硬币的结果不相同</strong>”。显然,两个硬币的结果要么相同,要么不相同,所以必然一人对一人错,因而必然得分。这么一讲就非常好理解了。</p> <p>要回答第二个问题,我们需要用新的理解去重新看待这些事件。</p> <p>抛两次硬币,结果相同的概率的确是 $\frac12$,也就是这种策略下 A 和 B 猜对的概率确实都是 $\frac12$,但不同的是,这时 A 猜对和 B 猜对是一对<strong>互斥事件</strong>,而非我们先前认为的相互独立。</p> <p>独立与互斥,显然是策略不同导致的。随机猜时确实相互独立,但为什么这个游戏里可以按某种策略然后变成互斥?</p> <p>关键在于,正如上表,这个双人游戏实际上并非简单的猜两次抛硬币,而是<strong>包含了两个信息与两个决策,总共四个事件</strong>的。</p> <p>如果受试者随机等概率地猜测,信息与决策无关,四个事件之间相互独立,所以十六种情况概率相等,于是得分的概率就是 $\frac{12}{16}$。思维盲点在于,四个事件在游戏中并不完全独立,游戏中存在一个很容易忽视、极其隐秘的联系:<strong>猜之前是已知自己硬币的结果的。</strong></p> <p>画成流程图则如下:</p> <pre class="mermaid" style="text-align: center;"> graph TB A[受试者 A]--已知--&gt;B[A 的结果] A-.猜测.-&gt;D C[受试者 B]--已知--&gt;D[B 的结果] C-.猜测.-&gt;B </pre> <p>有已知信息,那么决策时就可以考虑<strong>利用已知信息,从 16 种情况中划去一些情况</strong>。</p> <p>例如,若 A 的策略是只把自己硬币的结果猜上去,那么 16 种情况就会划去 8 种,剩下 8 种情况。而上表 4 种不能得分的情况也被划掉了两种,只剩下上表中序号 1 和 2 的情况。</p> <p>不难想到,假如 B 也有一个利用已知信息的策略能够把 1 和 2 给划掉,同时可以得分的情况没有被划完,那么就可以实现百分百得分了。</p> <p>观察序号 1 和 2 中 B 的结果与已知的关系发现,B 都是把自己硬币的结果猜上去了,不难想到 B 的策略:只把自己硬币的相反结果猜上去。不能得分的情况全被划掉,同时还剩下 4 种可以得分的情况,这样就必然得分了,也就是我们的答案。</p> <p>第三个问题也迎刃而解:因为在猜之前,自己的结果是一个已知信息,既然要有策略,那么当然就只能是由已知信息来决定猜什么。</p> <p>好像划掉情况很容易呀,那还有没有别的答案呢?</p> <p>先来个简单的:A 只猜正,也就是把自己身份也当做一个已知信息来决策。我们把前面不能得分的四种情况再列一下:</p> <table> <thead> <tr> <th style="text-align: center">序号</th> <th style="text-align: center">A 结果</th> <th style="text-align: center">A 猜测 B 结果</th> <th style="text-align: center">B 结果</th> <th style="text-align: center">B 猜测 A 结果</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">1</td> <td style="text-align: center">正</td> <td style="text-align: center">正</td> <td style="text-align: center">反</td> <td style="text-align: center">反</td> </tr> <tr> <td style="text-align: center">2</td> <td style="text-align: center">反</td> <td style="text-align: center">反</td> <td style="text-align: center">正</td> <td style="text-align: center">正</td> </tr> <tr> <td style="text-align: center">3</td> <td style="text-align: center">正</td> <td style="text-align: center">反</td> <td style="text-align: center">正</td> <td style="text-align: center">反</td> </tr> <tr> <td style="text-align: center">4</td> <td style="text-align: center">反</td> <td style="text-align: center">正</td> <td style="text-align: center">反</td> <td style="text-align: center">正</td> </tr> </tbody> </table> <p>A 只猜正时,总情况数少一半,上表中四种情况只剩下 1 和 4。那么此时 B 能否找到对应的策略呢?答案是不能,因为情况 1 和 4 中,B 自己硬币结果都是反,但 B 猜测结果有正有反,两者找不到关联,没办法形成<strong>从已知推决策</strong>的有效策略,他只能知道自己抛到正面就稳了,但是抛到反面的话,B 没办法依据已知信息来决策自己猜正还是猜反,不能划掉这两种情况,因此不能必胜。A 只猜反也同理。</p> <p>从这里我们可以发现,上表四种情况我们要么剩 1 和 2,要么剩 3 和 4,否则会出现 B 自己的结果与 B 的猜测结果找不到关联,那么 B 决策时就利用不了已知信息,那就变回了独立的情况了。</p> <p>因此,没有别的答案,只能是答案的策略或其等价形式。</p> <h2 id="思考">思考</h2> <h3 id="这还是抛硬币吗">这还是抛硬币吗?</h3> <p>答案的策略,实际上将问题转化为了猜两个人抛硬币结果相不相同,为什么可以这样转化呢?两者之间有什么隐含的联系?</p> <p>我们来看看这两个游戏分别都发生了什么。</p> <p>采取答案的策略后,只剩下四种可能情况,我们一一列出:</p> <table> <thead> <tr> <th style="text-align: center">序号</th> <th style="text-align: center">A 结果</th> <th style="text-align: center">A 猜测 B 结果</th> <th style="text-align: center">B 结果</th> <th style="text-align: center">B 猜测 A 结果</th> <th style="text-align: center">结果</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">1</td> <td style="text-align: center">正</td> <td style="text-align: center">正</td> <td style="text-align: center">正</td> <td style="text-align: center">反</td> <td style="text-align: center">A 猜对</td> </tr> <tr> <td style="text-align: center">2</td> <td style="text-align: center">正</td> <td style="text-align: center">正</td> <td style="text-align: center">反</td> <td style="text-align: center">正</td> <td style="text-align: center">B 猜对</td> </tr> <tr> <td style="text-align: center">3</td> <td style="text-align: center">反</td> <td style="text-align: center">反</td> <td style="text-align: center">正</td> <td style="text-align: center">反</td> <td style="text-align: center">B 猜对</td> </tr> <tr> <td style="text-align: center">4</td> <td style="text-align: center">反</td> <td style="text-align: center">反</td> <td style="text-align: center">反</td> <td style="text-align: center">正</td> <td style="text-align: center">A 猜对</td> </tr> </tbody> </table> <p>因为 A 与 B 的猜测来自于 A 与 B 的结果,是确定的,因此我们不妨略去这两列,即:</p> <table> <thead> <tr> <th style="text-align: center">序号</th> <th style="text-align: center">A 结果</th> <th style="text-align: center">B 结果</th> <th style="text-align: center">结果</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">1</td> <td style="text-align: center">正</td> <td style="text-align: center">正</td> <td style="text-align: center">A 猜对</td> </tr> <tr> <td style="text-align: center">2</td> <td style="text-align: center">正</td> <td style="text-align: center">反</td> <td style="text-align: center">B 猜对</td> </tr> <tr> <td style="text-align: center">3</td> <td style="text-align: center">反</td> <td style="text-align: center">正</td> <td style="text-align: center">B 猜对</td> </tr> <tr> <td style="text-align: center">4</td> <td style="text-align: center">反</td> <td style="text-align: center">反</td> <td style="text-align: center">A 猜对</td> </tr> </tbody> </table> <p>抛两次硬币也是四种可能情况,我们列出:</p> <table> <thead> <tr> <th style="text-align: center">序号</th> <th style="text-align: center">第一个硬币</th> <th style="text-align: center">第二个硬币</th> <th style="text-align: center">结果</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">1</td> <td style="text-align: center">正</td> <td style="text-align: center">正</td> <td style="text-align: center">相同</td> </tr> <tr> <td style="text-align: center">2</td> <td style="text-align: center">正</td> <td style="text-align: center">反</td> <td style="text-align: center">不同</td> </tr> <tr> <td style="text-align: center">3</td> <td style="text-align: center">反</td> <td style="text-align: center">正</td> <td style="text-align: center">不同</td> </tr> <tr> <td style="text-align: center">4</td> <td style="text-align: center">反</td> <td style="text-align: center">反</td> <td style="text-align: center">相同</td> </tr> </tbody> </table> <p>很容易发现,之所以能这么转化,是因为答案的策略划掉了十二种情况,剩下的四种情况与抛两次硬币的情况相同,因而我们可以这么转化地去解释,但两个问题并没有本质上的关联。</p> <h3 id="那么我们能否设计出类似的游戏呢">那么,我们能否设计出类似的游戏呢?</h3> <p>实际上只要是类似于这个流程图的,都是一样的策略。</p> <pre class="mermaid" style="text-align: center;"> graph TB A[A]--已知--&gt;B[二元信息 1] A-.猜测.-&gt;D C[B]--已知--&gt;D[二元信息 2] C-.猜测.-&gt;B </pre> <p>例如,两个相隔遥远的人,互猜对方的性别。</p> <h3 id="有没有什么数学原理呢">有没有什么数学原理呢?</h3> <p>我们不妨转换为布尔值(硬币正面为 0,反面为 1),列出 A 与 B 策略的真值表。</p> <p>A 的策略:</p> <table> <thead> <tr> <th style="text-align: center">已知</th> <th style="text-align: center">猜测</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">0</td> <td style="text-align: center">0</td> </tr> <tr> <td style="text-align: center">1</td> <td style="text-align: center">1</td> </tr> </tbody> </table> <p>B 的策略:</p> <table> <thead> <tr> <th style="text-align: center">已知</th> <th style="text-align: center">猜测</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">0</td> <td style="text-align: center">1</td> </tr> <tr> <td style="text-align: center">1</td> <td style="text-align: center">0</td> </tr> </tbody> </table> <p>直接说 A 是相同 B 是相反好像并没有发现什么新的原理,因为策略本来就是这么描述的。所以我们往其他方向考虑:奇偶性?</p> <p>A 的已知与猜测的和是 0 或 2,都是偶数;而 B 的已知与猜测的和是 1,是奇数。因此我们可以这么描述策略:A 始终猜两个硬币的和是偶数,B 始终猜两个硬币的和是奇数。由于两个硬币的和要么是偶数要么是奇数,自然总有一个人对。</p> <p>上面的思路看起来很有空间,因为奇偶性其实就是进行模二,而<strong>模 $n$ 运算具有天然的 $n$ 分性。</strong></p> <h3 id="改成模三是不是可以拓展到三个呢">改成模三是不是可以拓展到三个呢?</h3> <p>当然是可以的。</p> <pre class="mermaid" style="text-align: center;"> flowchart TB subgraph 决策者 direction LR A[A] B[B] C[C] end subgraph 信息 direction LR D[三元信息 1] E[三元信息 2] F[三元信息 3] end A-.猜测.-&gt;D A--已知--&gt;E A--已知--&gt;F B-.猜测.-&gt;E B--已知--&gt;D B--已知--&gt;F C-.猜测.-&gt;F C--已知--&gt;D C--已知--&gt;E </pre> <p>流程图表示出来较为复杂,设计起来也是。这里有 $3^6$ 种情况,采用决策过后有 $81$ 种情况,只需让每个人占有其中 $27$ 种情况作为胜利即可。</p> <p>我们依据这个图设计一个最简单的、没有玩什么文字游戏、没有隐藏信息、没有加太多限制的游戏:</p> <blockquote> <p>三个人各戴一顶红色或黄色或蓝色的帽子(颜色可以重复),每个人只看得到别人帽子的颜色,看不到自己的,不能进行任何形式的交流,若三个人中有人猜对自己帽子的颜色即胜利。</p> </blockquote> <p>类比上述数学原理,我们设红为 0,黄为 1,蓝为 2,设三个帽子的和为 $s$。</p> <p>由于 $s\bmod 3$ 的必然是 0 或 1 或 2,我们容易想到以下策略:</p> <ul> <li>A 始终猜 $s\bmod 3\equiv 0$</li> <li>B 始终猜 $s \bmod 3 \equiv 1$</li> <li>C 始终猜 $s \bmod 3 \equiv 2$</li> </ul> <p>这样就必然有一个人是猜对的。同理,可以推广至更多人的情况。</p> <p>当然这个游戏是我现场设计的,不要纠结里面的漏洞。</p> <h3 id="套娃数学原理的数学原理">套娃:数学原理的数学原理</h3> <p>如果你深究上面的策略究竟是不是对的,一定会注意到策略成立的一个前提:ABC 这样的“猜”等价于某一种符合游戏规则的策略,即,<strong>这样的策略在游戏中能对应唯一确定的颜色。</strong></p> <p>我们可以直接列。由于另外两个帽子的和模三一定是 $0,1,2$ 之中一个,且自己的帽子也只能是 $0,1,2$ 之中一个,所以:</p> <ul> <li>若 $s \bmod 3\equiv 0$,则 $s$ 来自于 $0+0$ 或 $1+2$ 或 $2+1$</li> <li>若 $s \bmod 3\equiv 1$,则 $s$ 来自于 $0+1$ 或 $1+0$ 或 $2+2$</li> <li>若 $s \bmod 3\equiv 2$,则 $s$ 来自于 $0+2$ 或 $1+1$ 或 $2+0$</li> </ul> <p>例如,看到的是一个红帽子和一个黄帽子(总和为 $1$),并且我猜 $s\bmod3\equiv0$,那么可以算出自己是 $2$,即蓝帽子。</p> <p>实际上,这就是一个模运算的填空题:$1+\square\equiv0\pmod 3$。</p> <p>在 $\square\in{0,1,2}$ 的情况下,类似这样的填空题中 $\square$ 是有唯一解的。也就是说,在已知 $s$ 并已知另外两个帽子的和时,确实可以唯一确定自己的颜色出来,该策略有效。</p> <h2 id="附录">附录</h2> <h3 id="参考文献">参考文献</h3> <p>本题经过了我的美化(当然,这会成为逻辑解构系列的传统),第一道思考题来自 <a class="link" href="https://www.bilibili.com/video/BV17p4y1r7Qs" target="_blank" rel="noopener" >GM 的视频</a>。</p> <h3 id="版权信息">版权信息</h3> <p>本文原载于 <a class="link" href="https://blog.reincarnatey.net" target="_blank" rel="noopener" >reincarnatey.net</a>,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。</p>

2025/6/30
阅读更多

拾光纪行 | USTC 强基计划游记

<h2 id="前言">前言</h2> <p>距离高考大约一个多月的时候,开始报名强基计划。</p> <p>综合各学校、各专业以及我的倾向,最终选定了 USTC。我对 USTC 最初的好感来自于很帅的名字,在我眼里仅次于 THU;其次是在人工智能我喜欢的方向上 USTC 有先进的研究;最后是听说 USTC 的学生浓度都…比较有生活(</p> <p>虽然对我来说难度很高,能接受的专业也仅有一个,但抱着“文化考得上的大学不值得我读十年”以及出于中大的保底情况,所以还是选择了这一所我好感度很高、可以说比较向往的学校,尽管是冲全广东只招一个人的专业且不接受调剂。</p> <p>尽管合肥目前给我的印象其实不是很好,相比深圳确实没有那么舒适和现代化,但还是选择相信 USTC。</p> <p>实际上现在并不知道未来会如何,落榜的可能性远大于录取,并且在一个相对没那么喜欢的城市待十年对我来说也很难直接接受。USTC 的强基会锁档,出分前完成所有流程,然而我只要在笔试、面试、高考之中任意一个爆炸就会直接离场。</p> <p>我尽力去尝试,不管结果如何,我相信以我自己的能力,大学过后都能走到我应该的结局。</p> <h2 id="笔试">笔试</h2> <p>2025 年的笔试是在 6 月 15 日,我 14 日上午从深圳宝安机场出发飞抵合肥。</p> <p>下午去东校区踩点,不知道东校区是不是本校区,但是这个大门感觉还是比较…低调。但附近配套感觉除了“科气”十足以外并不称得上舒适,可能比起出校门,选择点外卖会更科学一点。</p> <p>踩完点之后去附近的南七天地逛了一下,以为是很大的超商,可能是我去的时间不对,去的时候人很少而且很多很多店铺都没开,感觉还是有些失望。什么吃的也没买到就出去了,在旁边另一个商场逛了一下发现不卖吃的,只好打道回府。顺带一提,那里的地下通道是真的有些…不合格。</p> <p>最后发现反而走到酒店附近才找到吸引我进去吃的店,后来我才注意到原来我酒店那条道叫做美食街。</p> <p>晚上继续复习,复习的主要是物理,因为以为会考竞赛知识点,所以这三天临时补了很多。然后看了一下物理数学近两年的真题找找感觉,就结束复习了。可能是因为我已经考过一次 SUSTech 的机试(其实被我当 USTC 笔试的模拟赛打了)</p> <p>第二天一早就起来,然后提前了一些出发,也提前了一些到考场。什么,人怎么这么多。</p> <p>进考场之后,监考老师提醒我们 17 号查成绩,21 号面试,注意消息。等了半个小时后就开考了,大致流程应该在尽量模仿高考,但不时露馅。</p> <p>先考 100 分钟数学,提前七八分钟拿到卷子开始浏览题目,有十道填空和两道大题。我从第一道题开始看,看了一会有思路了就往下过,一直过到了第七八题才打开考铃,也就是说还没打铃我就已经会做七八道题了,芜湖起飞。</p> <p>考前想的思路大部分都是对的,最终都得到了答案,虽然有些题我不记得我的答案是多少,后续对答案也对不了,但我觉得应该是没问题。不会的题有两道,一道是球盒的期望问题,可以写出式子但化简时无从下手,最后蒙了答案但是错了;另一道是奇怪数列吧好像,有 sigma 和一个一九九几年的数字的题,一开始的思路错了,后面发现不会做于是等到考试快结束的时候感觉回来列了前三个找规律,但因为时间不够,第三个没算出来,又忘了第一个,所以找了个很错的规律,打铃之后才发现存在规律,当时很遗憾,后面发现那个规律也只有前三个是对的,释怀了,不会就是不会。</p> <p>值得一提的是我很喜欢斐波那契数列那道题,虽然被学 OI 出身的我读完题后就感觉到了很浓的递推味然后秒了,但那道题的设题方式确实很新颖很有创意。</p> <p>大题的话,第一道大题是复数大题,最后应该会变成数论,我数论都是从 OI 学的,做不来,跳。第二道大题发现讨论就可以了,咔咔写,但是脑子有点点转不动所以写的比较慢,挺久才写完,在这里应该浪费了不少时间。</p> <p>10 分钟休息过后又是 100 分钟的物理,我不想评价,没考太多竞赛但一点也不简单,而且还有多选题,可恶。我感觉我最有把握的题是多选最后一道,虽然那道题题面有误,能量标错了,但是不影响答案。其他的题基本连蒙带猜,大题也根本写不动,把能理解的写了就结束了。</p> <p>后来听说物理好像不答不加也不扣分,但答错还要倒扣一分,我当时没注意看。我只一直盯着多选题里面那个“可能有多个答案“的”可能“然后在想他会不会在多选题里出单选题。</p> <p>考完之后有一种解放感,去找女朋友玩了好久。17 号从早上开始时不时刷新,最终是晚上在女朋友家刚吃完饭已刷新看到我入围面试,蛮开心的。</p> <p>数学 70 分,满分 100 的这个难度能考到这个分数我还是相当满意了,也就是说我写的大部分都是对的。物理 34,意料之中。笔试总分 104,入围线 70,那我岂不是不用考物理也能入围。</p> <p>毕竟我学过 MO 和 IO 但没学过 PhiO,所以我觉得这样的分数还是意料之中的。不知道这个入围线能不能参考,但按照往年的分数线,其实感觉 104 分竞争力不是很大,也同样是淘汰边缘了感觉。</p> <p>不过我听说我的竞赛奖在面试环节可以加分,希望如此。好好准备面试,等到出分后就知道结局啦!</p> <p>话说看知乎,之前强基有礼物,今年怎么没有?是要等到面试才有嘛,期待一波。</p> <h2 id="面试">面试</h2> <p>没有礼物,可恶,为什么今年没有,为什么为什么为什么为什么。</p> <p>21 号上午面试,我 20 号上午面试完 SUSTech 直接前往机场飞到合肥。</p> <p>上午应该都是第一类考生,大概有两个考场,每个考场约 108 个人,分为三轮,每轮三组,每组 12 个人。</p> <p>大概面试流程:12 个人分为甲乙两组,先五分钟阅读和讨论材料 A 及问题,然后 1-6 号轮流发言,接着 12-7 号轮流对前面同学的发言提出问题,发言都是两分钟,然后再给五分钟阅读和讨论材料 B 及问题,然后 7-12 号轮流发言,6-1 号轮流提出问题,也都是两分钟。</p> <p>材料 A 与 B 印在同一张纸的正反两面,另给了两张白纸可供记录,需自己带笔。不能提及自己身份和高中,所以当然不需要自我介绍。</p> <p>今年我的面试真题两则都是科大今年的创新成果,材料 A 是可用于抓握复杂或微小物体的对数螺旋软体触手,材料 B 是利用谐波衰减速度不同以及拍频效应来减少纳米波雷达的心跳谐波监测受到呼吸谐波的干扰,问题大致都是些有关专业、进行联想、推理原因、探索应用之类的。</p> <p>个人认为提前押材料并没有意义,因为考场给出的材料基本都有具体的点,还是要依据具体问题和材料原文去回答,像我这次材料 A 早在很久之前在 b 站发布视频的时候我就有看过,但个人感觉除了稳定信心以外没有实际帮助。</p> <p>值得注意的是,如果你是提出问题的一方,有必要认真先前发言的同学的内容(包括对方和己方),这样你才有针对性的回答,或者在合适的时候提到哪个同学发言的哪个内容,告诉老师你认真听别人发言了;如果你是回答问题的一方,一定要在讨论阶段和大家分配好每个人的角色,比如四个问题六个人怎么分配,可能一个问题里有两个小问要不要拆开来回答,或者需不需要一个人负责补充或总结,最好是在准备阶段简单记录下自己的发言要点,然后也可以记录一下前面同学的发言,听发言的时候也可以思考一下别人的问题,在自己发言的时候可以提出补充。</p> <p>个人觉得,发言的时候客套话(老师好同学好谢谢之类的)适量就好,但是重要的是发言流畅,有逻辑性。可以说慢一点,但是嘴巴最好不要停,脑子暂时跟不上的时候就随便塞一些有逻辑的空话进去(考虑到技术可行性、考虑到实际情况、根据前面同学发言、根据材料之类的),另外说话应该谦虚友善一些,毕竟这不是辩论只是小组讨论,应该使用“我认同对方同学的观点,但我觉得还可以考虑”、”对方同学的角度很好,我可以补充“、”我认为/我觉得/我的看法是“、”对方同学的考虑有一定合理性,但我有别的看法“、”对方同学的看法可能…,我们不妨…“之类的语言,要避免使用强烈的否定甚至攻击对方。<strong>一定要知道不是在辩论,只是小组讨论</strong>,让你提出问题不是和对方辩论,对方发言没问题或者很好的部分应该要认同对方观点甚至可以帮对方补充。</p> <p>理论上非金银牌的竞赛获奖的加分会在面试分数中有所体现,但这只是理论。面试不会提前出分,会在高考出分后直接与综合成绩一并公布,并在高考出分几天后公布各省各专业录取线以及可以录取情况查询方法。有一说一,强基招那么少人,应该基本每个省都是每个专业只招一个人,这个公布录取线基本就是公布录取的人的综合分了吧。</p> <p>这个综合分其实很不好估,往年录取分数线参考意义也不大,因为综合分的三个部分中面试成绩你不知道,而笔试和高考每年难度都不同,尽管相对排名可能不变,但在综合分中的参与得分情况就会不同,所以具体分数线无法比较。</p> <p>个人感觉发挥的还不错。笔试+面试的两分就顶高考一分了,希望我的省一可以给面试多加点分,这样可以补一补笔试和高考的漏分,别白学三年竞赛。</p> <p>虽然其实录取概率极小,但不管结果怎么样我都已经尽力了,rp++ 吧。</p> <h2 id="出分">出分</h2> <p>高考分实在有些炸裂,无缘 USTC 了。</p> <h2 id="结果">结果</h2> <p>未录取,但是也不算太遗憾吧。除了这次没有礼物。</p> <p>面试分 55.5。</p> <p>综合分相差的有点多,约等于三十分高考,或是六十分校测。</p> <p>就算我发挥好了也考不到这么高,这么看来爆炸的其实不只有高考,基本是全炸,所以也就不遗憾了。虽然是三年以来很喜欢的学校,但倒也称不上梦想吧,无非就是好感比 SYSU 高一点所以挣扎了一下罢了。</p> <p>过段时间还会写 SYSU 综评游记。</p> <p>顺带一提,填这个志愿是真的烦。</p> <h2 id="附录">附录</h2> <p>依稀记得报考 USTC 羟基前看了一篇往年学长的知乎文章,与我的结局十分类似。</p> <h3 id="参考文献">参考文献</h3> <h3 id="版权信息">版权信息</h3> <p>本文原载于 <a class="link" href="https://blog.reincarnatey.net" target="_blank" rel="noopener" >reincarnatey.net</a>,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。</p>

2025/6/18
阅读更多

推荐订阅

Recent content on forecho's Blog

Provides a better reading experience (full articles) over the official ones.