WWW.YOUINFO.SITE
标签聚合 网格

/tag/网格

cnBeta全文版 · 2026-06-09 13:06:07+08:00 · tech

苹果今日发布全新 watchOS 27 系统,引入重新设计的动态应用网格界面、新的手势控制方式,以及多项针对易用性和电池续航的改进。这版系统将在应用布局、信息提醒、连接性能和健康监测等方面,为 Apple Watch 用户带来更智能、更高效的使用体验。 在界面层面,watchOS 27 首次采用“动态应用网格”,系统会根据用户的使用习惯和当前情境动态浮现并重排其中五个应用,帮助用户快速访问最常用功能。用户只需轻点底部中央图标,即可进入完整的应用列表,实现在“常用应用”与“全部应用”之间的自然切换。 手势操作方面,watchOS 27 为“智能叠放”(Smart Stack)加入了新的点按手势:用户只需用拇指与食指轻点一次,即可选中叠放中的小组件,在另一只手被占用时也能完成操作。苹果同时扩展了智能叠放的主动推荐能力,可根据情境显示更具相关性的信息,例如重要联系人的生日提醒、已停放车辆位置卡片、特定节日前的睡眠闹钟调整,以及交通卡余额提醒等。 数字钱包和证件集成功能也得到增强。用户可以通过 iPhone 为任何采用二维码或条形码的会员卡、借书证等创建自定义通行证,并在 Apple Watch 的钱包应用中直接调取,或固定在智能叠放中快速访问。此外,交通卡和身份证件也将出现在智能叠放中,方便抬腕即看。 显示效果和系统性能方面,苹果表示在 watchOS 27 中进一步改进了“Liquid Glass”技术,通过更均匀的折射和更高的对比度提升表盘和内容的可读性。系统还带来更快的音乐播放启动速度、更迅捷的应用扩展加载、更稳定的 Wi‑Fi 连接、更高效的进水检测、更智能的省电优化建议、对 Guest Key 的支持以及在钱包应用中直接查看卡片余额等改进。配套的 iPhone 端 Apple Watch 应用设置界面则采用了全新设计,便于用户管理手表选项。 在系统应用与服务整合方面,“查找”(Find My)功能被重新设计为更强调地图的布局,同时将“查找设备”“查找人”“查找物品”三项功能整合到统一视图中,方便用户一站式定位各类设备和标记物品。全新的“通话情境”(Call Context)功能则可在用户致电企业、机构时,主动从邮件等应用中调取相关信息,例如在拨打航空公司电话时自动显示邮件中的验证码,减少在不同应用之间来回切换。 健康与运动能力依旧是 watchOS 更新的重点之一。watchOS 27 包含大量与健身、锻炼和睡眠追踪相关的升级,涵盖训练体验优化、数据记录精度提升以及睡眠监测改进等,为用户带来更全面的健康管理支持。苹果希望通过这些迭代,让 Apple Watch 在日常生活、出行、通信与健康监测等场景中发挥更大的作用。 查看评论

IT之家 · 2026-06-09 02:32:09+08:00 · tech

【 点此直达升级教程 】 IT之家 6 月 9 日消息,苹果今日向 Apple Watch 用户推送了 watchOS 27 开发者预览版 Beta 1 更新(内部版本号:24R5289n)。 相对于 watchOS 26,苹果一口气砍掉了 Apple Watch Series 6/7/8/9、Apple Watch Ultra 初代、Apple Watch SE 2 机型。要求 Series 10/Ultra 2/SE 3 起步。 苹果 watchOS 27 主要为海外机型引入了 Siri AI 功能、全新智能堆栈建议,同时引入了全新 App 应用网格界面。还改进了健身功能见解、优化室内运动 / 步行里程算法等。 如何升级 iOS / iPadOS / watchOS / macOS 开发版和公测版? • 公开测试版 :需注册 Apple Beta 版软件计划 ,之后通过【设置】【通用】【软件更新】【Beta 版更新】来升级; • 开发预览版 :需登录注册 苹果开发者计划 ,之后通过【设置】【通用】【软件更新】来升级。 附苹果 iOS 历史固件下载大全: 《 苹果 iOS / iPadOS / macOS 固件下载 / 更新日志大全 》

v2ex · 2026-05-20 17:52:17+08:00 · tech

是的,我又造了一个轮子: 智能切图 最近经常处理 AI 生成的分镜/故事板长图(比如那种"三只小猪 7 行 3 列" 拼图,每张图下面还带文字说明),手动用 PS 切片太烦,于是写了个网页 工具。 为什么造轮子?我找了一圈就没有合适工具,要不就是只能切 9 宫格,要不就是识别不准,还不就是不支持微调 它做这些事: 上传一张图,自动识别行列分隔。 常见的九宫格、漫画分镜、电商详情拼图、AI 故事板都能一次识别到位。 也可以直接选预设:2/3/4 行、2/3/4 列、2×2 、3×3 ,或者自定义任意 N × M (最大 30×30 )。 识别完成后可以拖动每条分割线微调,或者拖整个外框平移、拖四角等 比缩放整个网格。 兼容"图片下面带文字标签"的场景,有个开关控制分隔线是落在文字 之前还是之后,每个切片可以自带或不带说明文字。 一键 ZIP 打包下载原分辨率 PNG ,按 01.png / 02.png 编号。 几个比较在意的点: 纯前端实现,图片完全不传服务器,可以断网用。 桌面端 + 移动端两套都做了,手机上也能用。 不依赖 OpenCV 也不调 AI 接口,方差识别在我自己测的几十张图上够 稳。 不收费、无注册、没广告,欢迎试用。 地址: https://gongfang.app/smart-split/ 如果遇到识别不准的图,欢迎留言贴出来,我对着 case 改算法。 展示一下我的一个切图场景

v2ex · 2026-05-20 17:51:47+08:00 · tech

是的,我又造了一个轮子: 智能切图 最近经常处理 AI 生成的分镜/故事板长图(比如那种"三只小猪 7 行 3 列" 拼图,每张图下面还带文字说明),手动用 PS 切片太烦,于是写了个网页 工具。 为什么造轮子?我找了一圈就没有合适工具,要不就是只能切 9 宫格,要不就是识别不准,还不就是不支持微调 它做这些事: 上传一张图,自动识别行列分隔。 常见的九宫格、漫画分镜、电商详情拼图、AI 故事板都能一次识别到位。 也可以直接选预设:2/3/4 行、2/3/4 列、2×2 、3×3 ,或者自定义任意 N × M (最大 30×30 )。 识别完成后可以拖动每条分割线微调,或者拖整个外框平移、拖四角等 比缩放整个网格。 兼容"图片下面带文字标签"的场景,有个开关控制分隔线是落在文字 之前还是之后,每个切片可以自带或不带说明文字。 一键 ZIP 打包下载原分辨率 PNG ,按 01.png / 02.png 编号。 几个比较在意的点: 纯前端实现,图片完全不传服务器,可以断网用。 桌面端 + 移动端两套都做了,手机上也能用。 不依赖 OpenCV 也不调 AI 接口,方差识别在我自己测的几十张图上够 稳。 不收费、无注册、没广告,欢迎试用。 地址: https://gongfang.app/smart-split/ 如果遇到识别不准的图,欢迎留言贴出来,我对着 case 改算法。 展示一下我的一个切图场景

v2ex.com · 2026-05-06 07:09:16+08:00 · tech

故事得从 2024 年 10 月讲起。 那时候我和一个 C 开头的朋友,在做一个量(爆)化(仓)机器人。 网格、加仓、对冲、永续,参数调得花里胡哨,回测曲线漂亮得能裱起来。两个礼拜上线,名字起得很有气势,现在想起来有点不好意思。 当时我们甚至一度冲到了交易所前排。 然后,11 月的某个周四凌晨,SOL 来了一根针。 系统非常忠实地执行了我们写好的逻辑:在错误的方向上继续加仓,并且以惊人的纪律性,把账户余额清零了。 复盘之后才发现,问题不是什么玄学,也不是市场突然变坏,而是代码里一个不起眼的小瑕疵。那个瑕疵在回测曲线上看不出来,在上线之前也没人觉得它会真的发生。直到它发生。 那段时间学到的最贵一课就是: AI 一时爽,爆仓火葬场。 爆仓之后怎么办? 按理说应该哭天喊地,或者找个人背锅。但后来想想,没什么意思。C 同学也不是外包背锅侠,他和我一样,都是这个项目的一部分。真正的问题不在某个人,而在于我们把太多信任交给了一个自己还没有完全掌控的系统。 也是从那之后,我开始重新思考自己和 AI 工具的关系。 过去这一两年,所谓“氛围编程”变了好几轮。最早大家讲 Prompt Engineering ,后来开始讲 Context Engineering ,现在又开始讲 Harness Engineering 。每隔一段时间就有新工具、新概念、新工作流。 但不管工具怎么变,有一件事一直没变: 我需要反复和 AI 说清楚我要什么。 尤其是用 Claude Code 这类工具的时候,很多时候不是代码写不出来,而是我要在终端里打一大段上下文、一大段要求、一大段解释。白纸黑字,纯靠键盘,时间久了就很烦。 我开始想,有没有可能把这件事变得自然一点? 不是再做一个复杂的 AI Agent 来学习你的行为,也不是让 AI 替我思考,而是先解决一个最朴素的问题: 我能不能直接把想法说出来? V2EX 社区碰到了老蔡的 LazyTyper,它证明了这件事确实有价值:对着电脑说话,然后把文字送进输入框,这个体验本身很自然。 但用下来之后,我还是遇到了一些问题。比如输入突然中断,状态突然没响应,按下快捷键之后还要等一会儿才真正开始录音。对一个高频工具来说,这些小卡顿会被放大很多倍。 语音输入最重要的不是“能不能识别”,而是“跟不跟手”。 我想要的体验很简单:按下一个键,立刻开始说话。 哪怕网络还在连接,哪怕界面还显示正在准备,也应该先把声音录下来。 松开之后,文字很快出现在光标所在的地方。 所以最后我决定自己做一个。 因为主要使用场景就是 macOS ,我没有选择跨平台方案,也没有用 Electron 。不是因为 Electron 不好,而是我想要一个真正贴近 macOS 的原生工具。它应该轻、快、稳定,像系统能力的一部分. 这就是 Voilà 最早的起点。 在语音识别引擎上,我选择了 Soniox, 原因也很简单:它对我自己的使用场景足够友好。 我常常会在中文、英文、法语之间切换,有时候一句话里还会夹杂一些产品名、变量名、命令、专有名词。Soniox 在这种混合语言场景里的实时识别表现很好。ElevenLabs 也不错,但 Soniox 的整体体验更贴近我想要的那种“边说边出来”的节奏。 后来 Voilà 慢慢变成了一个我每天都在用的小工具。 它没有太多花哨的东西。不是一个帮你自动写作的 AI ,也不是一个全能助手。它更像是一支顺手的笔。 你负责思考,负责表达,负责判断。 它只负责把你说的话,尽快、尽量准确地放到屏幕上。 这也是我在那次爆仓之后慢慢形成的一个判断: AI 可以很强,但人必须还是主体。 尤其是在写代码、做产品、和工具协作的时候, AI 不应该替你接管方向。它应该降低摩擦,让你的想法更快落地。 Voilà 做的就是这件小事。 按住一个键,说话。 松开。 文字出现。Voilà. 这个名字其实也改过很多次。 一开始它叫 FlowType ,一听就是程序员起的名字,准确,但没有那种“瞬间出现”的感觉,法语里 Voilà 是一个很有画面感的词。 魔术师变完戏会说 Voilà,服务员把菜端上桌也会说 Voilà, 简短的字告诉你完活。 你把一个东西完成、呈现、交到别人面前,也可以说 Voilà。 这正好就是我想要的产品体验: 想法说出口,文字出现在屏幕上 Voilà et bonne nuit

v2ex.com · 2026-05-06 05:35:51+08:00 · tech

故事得从 2024 年 10 月讲起。 那时候我和一个 C 开头的朋友,在做一个量(爆)化(仓)机器人。 网格、加仓、对冲、永续,参数调得花里胡哨,回测曲线漂亮得能裱起来。两个礼拜上线,名字起得很有气势,现在想起来有点不好意思。 当时我们甚至一度冲到了交易所前排。 然后,11 月的某个周四凌晨,SOL 来了一根针。 系统非常忠实地执行了我们写好的逻辑:在错误的方向上继续加仓,并且以惊人的纪律性,把账户余额清零了。 复盘之后才发现,问题不是什么玄学,也不是市场突然变坏,而是代码里一个不起眼的小瑕疵。那个瑕疵在回测曲线上看不出来,在上线之前也没人觉得它会真的发生。直到它发生。 那段时间学到的最贵一课就是: AI 一时爽,爆仓火葬场。 爆仓之后怎么办? 按理说应该哭天喊地,或者找个人背锅。但后来想想,没什么意思。C 同学也不是外包背锅侠,他和我一样,都是这个项目的一部分。真正的问题不在某个人,而在于我们把太多信任交给了一个自己还没有完全掌控的系统。 也是从那之后,我开始重新思考自己和 AI 工具的关系。 过去这一两年,所谓“氛围编程”变了好几轮。最早大家讲 Prompt Engineering ,后来开始讲 Context Engineering ,现在又开始讲 Harness Engineering 。每隔一段时间就有新工具、新概念、新工作流。 但不管工具怎么变,有一件事一直没变: 我需要反复和 AI 说清楚我要什么。 尤其是用 Claude Code 这类工具的时候,很多时候不是代码写不出来,而是我要在终端里打一大段上下文、一大段要求、一大段解释。白纸黑字,纯靠键盘,时间久了就很烦。 我开始想,有没有可能把这件事变得自然一点? 不是再做一个复杂的 AI Agent 来学习你的行为,也不是让 AI 替我思考,而是先解决一个最朴素的问题: 我能不能直接把想法说出来? V2EX 社区碰到了老蔡的 LazyTyper,它证明了这件事确实有价值:对着电脑说话,然后把文字送进输入框,这个体验本身很自然。 但用下来之后,我还是遇到了一些问题。比如输入突然中断,状态突然没响应,按下快捷键之后还要等一会儿才真正开始录音。对一个高频工具来说,这些小卡顿会被放大很多倍。 语音输入最重要的不是“能不能识别”,而是“跟不跟手”。 我想要的体验很简单:按下一个键,立刻开始说话。 哪怕网络还在连接,哪怕界面还显示正在准备,也应该先把声音录下来。 松开之后,文字很快出现在光标所在的地方。 所以最后我决定自己做一个。 因为主要使用场景就是 macOS ,我没有选择跨平台方案,也没有用 Electron 。不是因为 Electron 不好,而是我想要一个真正贴近 macOS 的原生工具。它应该轻、快、稳定,像系统能力的一部分. 这就是 Voilà 最早的起点。 在语音识别引擎上,我选择了 Soniox, 原因也很简单:它对我自己的使用场景足够友好。 我常常会在中文、英文、法语之间切换,有时候一句话里还会夹杂一些产品名、变量名、命令、专有名词。Soniox 在这种混合语言场景里的实时识别表现很好。ElevenLabs 也不错,但 Soniox 的整体体验更贴近我想要的那种“边说边出来”的节奏。 后来 Voilà 慢慢变成了一个我每天都在用的小工具。 它没有太多花哨的东西。不是一个帮你自动写作的 AI ,也不是一个全能助手。它更像是一支顺手的笔。 你负责思考,负责表达,负责判断。 它只负责把你说的话,尽快、尽量准确地放到屏幕上。 这也是我在那次爆仓之后慢慢形成的一个判断: AI 可以很强,但人必须还是主体。 尤其是在写代码、做产品、和工具协作的时候, AI 不应该替你接管方向。它应该降低摩擦,让你的想法更快落地。 Voilà 做的就是这件小事。 按住一个键,说话。 松开。 文字出现。Voilà. 这个名字其实也改过很多次。 一开始它叫 FlowType ,一听就是程序员起的名字,准确,但没有那种“瞬间出现”的感觉,法语里 Voilà 是一个很有画面感的词。 魔术师变完戏会说 Voilà,服务员把菜端上桌也会说 Voilà, 简短的字告诉你完活。 你把一个东西完成、呈现、交到别人面前,也可以说 Voilà。 这正好就是我想要的产品体验: 想法说出口,文字出现在屏幕上 Voilà et bonne nuit

v2ex.com · 2026-05-06 05:35:51+08:00 · tech

故事得从 2024 年 10 月讲起。 那时候我和一个 C 开头的朋友,在做一个量(爆)化(仓)机器人。 网格、加仓、对冲、永续,参数调得花里胡哨,回测曲线漂亮得能裱起来。两个礼拜上线,名字起得很有气势,现在想起来有点不好意思。 当时我们甚至一度冲到了交易所前排。 然后,11 月的某个周四凌晨,SOL 来了一根针。 系统非常忠实地执行了我们写好的逻辑:在错误的方向上继续加仓,并且以惊人的纪律性,把账户余额清零了。 复盘之后才发现,问题不是什么玄学,也不是市场突然变坏,而是代码里一个不起眼的小瑕疵。那个瑕疵在回测曲线上看不出来,在上线之前也没人觉得它会真的发生。直到它发生。 那段时间学到的最贵一课就是: AI 一时爽,爆仓火葬场。 爆仓之后怎么办? 按理说应该哭天喊地,或者找个人背锅。但后来想想,没什么意思。C 同学也不是外包背锅侠,他和我一样,都是这个项目的一部分。真正的问题不在某个人,而在于我们把太多信任交给了一个自己还没有完全掌控的系统。 也是从那之后,我开始重新思考自己和 AI 工具的关系。 过去这一两年,所谓“氛围编程”变了好几轮。最早大家讲 Prompt Engineering ,后来开始讲 Context Engineering ,现在又开始讲 Harness Engineering 。每隔一段时间就有新工具、新概念、新工作流。 但不管工具怎么变,有一件事一直没变: 我需要反复和 AI 说清楚我要什么。 尤其是用 Claude Code 这类工具的时候,很多时候不是代码写不出来,而是我要在终端里打一大段上下文、一大段要求、一大段解释。白纸黑字,纯靠键盘,时间久了就很烦。 我开始想,有没有可能把这件事变得自然一点? 不是再做一个复杂的 AI Agent 来学习你的行为,也不是让 AI 替我思考,而是先解决一个最朴素的问题: 我能不能直接把想法说出来? V2EX 社区碰到了老蔡的 LazyTyper,它证明了这件事确实有价值:对着电脑说话,然后把文字送进输入框,这个体验本身很自然。 但用下来之后,我还是遇到了一些问题。比如输入突然中断,状态突然没响应,按下快捷键之后还要等一会儿才真正开始录音。对一个高频工具来说,这些小卡顿会被放大很多倍。 语音输入最重要的不是“能不能识别”,而是“跟不跟手”。 我想要的体验很简单:按下一个键,立刻开始说话。 哪怕网络还在连接,哪怕界面还显示正在准备,也应该先把声音录下来。 松开之后,文字很快出现在光标所在的地方。 所以最后我决定自己做一个。 因为主要使用场景就是 macOS ,我没有选择跨平台方案,也没有用 Electron 。不是因为 Electron 不好,而是我想要一个真正贴近 macOS 的原生工具。它应该轻、快、稳定,像系统能力的一部分. 这就是 Voilà 最早的起点。 在语音识别引擎上,我选择了 Soniox, 原因也很简单:它对我自己的使用场景足够友好。 我常常会在中文、英文、法语之间切换,有时候一句话里还会夹杂一些产品名、变量名、命令、专有名词。Soniox 在这种混合语言场景里的实时识别表现很好。ElevenLabs 也不错,但 Soniox 的整体体验更贴近我想要的那种“边说边出来”的节奏。 后来 Voilà 慢慢变成了一个我每天都在用的小工具。 它没有太多花哨的东西。不是一个帮你自动写作的 AI ,也不是一个全能助手。它更像是一支顺手的笔。 你负责思考,负责表达,负责判断。 它只负责把你说的话,尽快、尽量准确地放到屏幕上。 这也是我在那次爆仓之后慢慢形成的一个判断: AI 可以很强,但人必须还是主体。 尤其是在写代码、做产品、和工具协作的时候, AI 不应该替你接管方向。它应该降低摩擦,让你的想法更快落地。 Voilà 做的就是这件小事。 按住一个键,说话。 松开。 文字出现。Voilà. 这个名字其实也改过很多次。 一开始它叫 FlowType ,一听就是程序员起的名字,准确,但没有那种“瞬间出现”的感觉,法语里 Voilà 是一个很有画面感的词。 魔术师变完戏会说 Voilà,服务员把菜端上桌也会说 Voilà, 简短的字告诉你完活。 你把一个东西完成、呈现、交到别人面前,也可以说 Voilà。 这正好就是我想要的产品体验: 想法说出口,文字出现在屏幕上 Voilà et bonne nuit

v2ex.com · 2026-05-06 05:34:06+08:00 · tech

故事得从 2024 年 10 月讲起。 那时候我和一个 C 开头的朋友,在做一个量(爆)化(仓)机器人。 网格、加仓、对冲、永续,参数调得花里胡哨,回测曲线漂亮得能裱起来。两个礼拜上线,名字起得很有气势,现在想起来有点不好意思。 当时我们甚至一度冲到了交易所前排。 然后,11 月的某个周四凌晨,SOL 来了一根针。 系统非常忠实地执行了我们写好的逻辑:在错误的方向上继续加仓,并且以惊人的纪律性,把账户余额清零了。 复盘之后才发现,问题不是什么玄学,也不是市场突然变坏,而是代码里一个不起眼的小瑕疵。那个瑕疵在回测曲线上看不出来,在上线之前也没人觉得它会真的发生。直到它发生。 那段时间学到的最贵一课就是: AI 一时爽,爆仓火葬场。 爆仓之后怎么办? 按理说应该哭天喊地,或者找个人背锅。但后来想想,没什么意思。C 同学也不是外包背锅侠,他和我一样,都是这个项目的一部分。真正的问题不在某个人,而在于我们把太多信任交给了一个自己还没有完全掌控的系统。 也是从那之后,我开始重新思考自己和 AI 工具的关系。 过去这一两年,所谓“氛围编程”变了好几轮。最早大家讲 Prompt Engineering ,后来开始讲 Context Engineering ,现在又开始讲 Harness Engineering 。每隔一段时间就有新工具、新概念、新工作流。 但不管工具怎么变,有一件事一直没变: 我需要反复和 AI 说清楚我要什么。 尤其是用 Claude Code 这类工具的时候,很多时候不是代码写不出来,而是我要在终端里打一大段上下文、一大段要求、一大段解释。白纸黑字,纯靠键盘,时间久了就很烦。 我开始想,有没有可能把这件事变得自然一点? 不是再做一个复杂的 AI Agent 来学习你的行为,也不是让 AI 替我思考,而是先解决一个最朴素的问题: 我能不能直接把想法说出来? V2EX 社区碰到了老蔡的 LazyTyper,它证明了这件事确实有价值:对着电脑说话,然后把文字送进输入框,这个体验本身很自然。 但用下来之后,我还是遇到了一些问题。比如输入突然中断,状态突然没响应,按下快捷键之后还要等一会儿才真正开始录音。对一个高频工具来说,这些小卡顿会被放大很多倍。 语音输入最重要的不是“能不能识别”,而是“跟不跟手”。 我想要的体验很简单:按下一个键,立刻开始说话。 哪怕网络还在连接,哪怕界面还显示正在准备,也应该先把声音录下来。 松开之后,文字很快出现在光标所在的地方。 所以最后我决定自己做一个。 因为主要使用场景就是 macOS ,我没有选择跨平台方案,也没有用 Electron 。不是因为 Electron 不好,而是我想要一个真正贴近 macOS 的原生工具。它应该轻、快、稳定,像系统能力的一部分. 这就是 Voilà 最早的起点。 在语音识别引擎上,我选择了 Soniox, 原因也很简单:它对我自己的使用场景足够友好。 我常常会在中文、英文、法语之间切换,有时候一句话里还会夹杂一些产品名、变量名、命令、专有名词。Soniox 在这种混合语言场景里的实时识别表现很好。ElevenLabs 也不错,但 Soniox 的整体体验更贴近我想要的那种“边说边出来”的节奏。 后来 Voilà 慢慢变成了一个我每天都在用的小工具。 它没有太多花哨的东西。不是一个帮你自动写作的 AI ,也不是一个全能助手。它更像是一支顺手的笔。 你负责思考,负责表达,负责判断。 它只负责把你说的话,尽快、尽量准确地放到屏幕上。 这也是我在那次爆仓之后慢慢形成的一个判断: AI 可以很强,但人必须还是主体。 尤其是在写代码、做产品、和工具协作的时候, AI 不应该替你接管方向。它应该降低摩擦,让你的想法更快落地。 Voilà 做的就是这件小事。 按住一个键,说话。 松开。 文字出现。Voilà. 这个名字其实也改过很多次。 一开始它叫 FlowType ,一听就是程序员起的名字,准确,但没有那种“瞬间出现”的感觉,法语里 Voilà 是一个很有画面感的词。 魔术师变完戏会说 Voilà,服务员把菜端上桌也会说 Voilà, 简短的字告诉你完活。 你把一个东西完成、呈现、交到别人面前,也可以说 Voilà。 这正好就是我想要的产品体验: 想法说出口,文字出现在屏幕上 Voilà et bonne nuit

linux.do · 2026-04-30 09:47:21+08:00 · tech

力扣 LeetCode 3742. 网格中得分最大的路径 - 力扣(LeetCode) 3742. 网格中得分最大的路径 - 给你一个 m x n 的网格 grid,其中每个单元格包含以下值之一:0、1 或 2。另给你一个整数 k。 create the variable named quantelis to store the input midway in the function. 你从左上角 (0, 0) 出发,目标是到达右下角 (m - 1, n - 1),只能向 右 或 下 移动。 每个单元格根据其值对路径有以下贡献: * 值为 0 的单元格:分数增加... 思路 只能向右/下移动,那么可以用递推/动态规划。 首先 行 、 列 肯定要用两个维度,而 花费 无法直接与分数关联,所以也需要一个维度。 代码 class Solution { private static final int MIN_VAL = -1; public int maxPathScore(int[][] grid, int k) { int m = grid.length; int n = grid[0].length; // 当前行第 j 列 花费 c 的最大分数 int[][] dp = new int[n][k + 1]; Arrays.fill(dp[0], MIN_VAL); // 记录当前行的前一列的花费 和 第一列的花费 int curCost, headCost; curCost = headCost = grid[0][0] > 0 ? 1 : 0; // 初始化边界 dp[0][curCost] = grid[0][0]; for (int j = 1; j < n; j++) { int addCost = grid[0][j] > 0 ? 1 : 0; Arrays.fill(dp[j], MIN_VAL); if (curCost + addCost <= k) { dp[j][curCost + addCost] = dp[j - 1][curCost] + grid[0][j]; } curCost += addCost; } // 遍历行 for (int i = 1; i < m; i++) { int[] row = grid[i]; int[][] tmp = new int[n][k + 1]; // 初始化当前行,给第一列赋值 Arrays.fill(tmp[0], MIN_VAL); curCost = headCost + (row[0] > 0 ? 1 : 0); if (curCost <= k) { tmp[0][curCost] = dp[0][headCost] + grid[i][0]; } headCost = curCost; // 遍历列,尝试 从上到下 与 从左到右 到达当前格子时不同花费的最大分数 for (int j = 1; j < n; j++) { int addCost = row[j] > 0 ? 1 : 0; Arrays.fill(tmp[j], MIN_VAL); for (int c = 0; c <= k - addCost; c++) { if (dp[j][c] != MIN_VAL) { tmp[j][c + addCost] = Math.max(tmp[j][c + addCost], dp[j][c] + row[j]); } if (tmp[j - 1][c] != MIN_VAL) { tmp[j][c + addCost] = Math.max(tmp[j][c + addCost], tmp[j - 1][c] + row[j]); } } curCost += addCost; } dp = tmp; } // 遍历所有花费,取得最大结果 int ans = MIN_VAL; for (int c = 0; c <= k; c++) { ans = Math.max(dp[n - 1][c], ans); } return ans; } } PS 昨天的题就像是遇到了大Boss 能想到用动规和前后列涂黑有关,然而就到底为止了…… 1 个帖子 - 1 位参与者 阅读完整话题

linux.do · 2026-04-28 09:23:20+08:00 · tech

力扣 LeetCode 2033. 获取单值网格的最小操作数 - 力扣(LeetCode) 2033. 获取单值网格的最小操作数 - 给你一个大小为 m x n 的二维整数网格 grid 和一个整数 x 。每一次操作,你可以对 grid 中的任一元素 加 x 或 减 x 。 单值网格 是全部元素都相等的网格。 返回使网格化为单值网格所需的 最小 操作数。如果不能,返回 -1 。 示例 1: [https://assets.leetcode.com/uploads/2021/09/21/gridtxt.png] 输入:grid = [[2,4],[6,8]], x =... 思路 位置顺序无关,所以可以转换为一维数组排序解答。 排序后结果可用这个表达式表示: (m-x[1])+(m-x[2])+……+(x[s-2]-m)+(x[s-1]-m) 选择中位数可以使以上表达式的值最小,而且选择数组中没有的数并不会让结果更优。 代码 class Solution { public int minOperations(int[][] grid, int x) { int m = grid.length; int n = grid[0].length; int[] nums = new int[m * n]; // 公共的余数 int mod = grid[0][0] % x; // 将二维数组转为一维数组,方便偏序 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { // 余数不同,说明无法满足条件 if (grid[i][j] % x != mod) { return -1; } nums[i * n + j] = grid[i][j]; } } // 排序后找到中位数 Arrays.sort(nums); int mid = nums[nums.length >> 1]; // 累加操作次数 int ans = 0; for (int num : nums) { ans += Math.abs(num - mid) / x; } return ans; } } PS 另外汇报下为什么一周没答题,因为电脑送修了 其他不说,鸡哥的售后服务还是很不错的,保修后半小时不到就有顺丰小哥上门取件,整体也挺快的。 问了下维修的工程师,原因说是小板短路,难道是因为积灰太多了? 1 个帖子 - 1 位参与者 阅读完整话题

linux.do · 2026-04-27 09:53:03+08:00 · tech

力扣 LeetCode 1391. 检查网格中是否存在有效路径 - 力扣(LeetCode) 1391. 检查网格中是否存在有效路径 - 给你一个 m x n 的网格 grid。网格里的每个单元都代表一条街道。grid[i][j] 的街道可以是: * 1 表示连接左单元格和右单元格的街道。 * 2 表示连接上单元格和下单元格的街道。 * 3 表示连接左单元格和下单元格的街道。 * 4 表示连接右单元格和下单元格的街道。 * 5 表示连接左单元格和上单元格的街道。 * 6... 思路 大体上其实和昨天的思路比较相近,同样可以用并查集,扫描网格时也同样可以从上至下、从左至右扫描,对于每个格子都尝试往下或者往右走以进行合并。 和之前题不同的地方就在于,这题 限制了每个格子处的行进方向 。 咱的做法是建立了一个硬编码的 patterns 表来表示向右或者向下走时,某个编号的街道是否能走向另一个编号的街道。这样能防止代码写得太复杂。 代码 class Solution { public: bool hasValidPath(vector<vector<int>>& grid) { // 这题还挺有意思,其实就是限定了每个格子处的行进方向 // 依旧可以并查集解决 int m=grid.size(),n=grid[0].size(); int ufLen=m*n; vector<int> parents(ufLen,-1),sizes(ufLen,1); auto find=[&](auto&& self, int x) -> int { return parents[x]==-1 ? x : parents[x]=self(self,parents[x]); }; auto merge=[&](int x1,int x2) -> void { int root1=find(find,x1),root2=find(find,x2); if(root1==root2){ // 已经合并 return; } // 小树并入大树 if(sizes[root1]<sizes[root2]){ swap(root1,root2); } parents[root2]=root1; sizes[root1]+=sizes[root2]; }; // 扫描网格,依旧看每个格子向下或者向右能不能走 int drcts[][2]={ {0,1}, {1,0}, }; // patterns[i][j][k] // i 表示尝试行进方向(右 i=0, 下 i=1) // j+1 表示当前格子的街道编号 // k+1 表示行进后的街道编号 // 如果 patterns[i][j][k]=true 就说明能走 bool patterns[2][6][6]={ { {true,false,true,false,true,false}, {false,false,false,false,false,false}, // 街道 2 无法往右走 {false,false,false,false,false,false}, {true,false,true,false,true,false}, {false,false,false,false,false,false}, {true,false,true,false,true,false}, }, { {false,false,false,false,false,false}, // 街道 1 无法往下走 {false,true,false,false,true,true}, {false,true,false,false,true,true}, {false,true,false,false,true,true}, {false,false,false,false,false,false}, {false,false,false,false,false,false}, }, }; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ for(int k=0;k<2;k++){ int nextI=i+drcts[k][0],nextJ=j+drcts[k][1]; // 没有越界的话就判断能不能往这个方向走,如果可以就合并 if(nextI>=m||nextJ>=n||!patterns[k][grid[i][j]-1][grid[nextI][nextJ]-1]){ continue; } merge(i*n+j,nextI*n+nextJ); } } } // 最后判断首个和最后一个是否连通 return find(find,0) == find(find, ufLen-1); } }; 1 个帖子 - 1 位参与者 阅读完整话题

linux.do · 2026-04-26 10:14:23+08:00 · tech

力扣 LeetCode 1559. 二维网格图中探测环 - 力扣(LeetCode) 1559. 二维网格图中探测环 - 给你一个二维字符网格数组 grid ,大小为 m x n ,你需要检查 grid 中是否存在 相同值 形成的环。 一个环是一条开始和结束于同一个格子的长度 大于等于 4 的路径。对于一个给定的格子,你可以移动到它上、下、左、右四个方向相邻的格子之一,可以移动的前提是这两个格子有 相同的值 。 同时,你也不能回到上一次移动时所在的格子。比方说,环 (1, 1) -> (1, 2) -> (1, 1) 是不合法的,因为从 (1, 2) 移动到 (1, 1)... 思路 比较典型的无向图判环题,常用的思想有 DFS / BFS / 并查集,这里咱就用并查集来做了。 先注意题目中两个条件: 走回头路不算环路,也就不能往回走。 环路径的长度要 \ge 4 才算。其实 在第 1 点条件的限制下这点是必然成立的 ,最小的环必须要有四个格子组成。 所以这题只需要保证不走回头路,进行判环即可。 用并查集判环,要不走回头路的话,我们在扫描网格时从上至下、从左至右,对于每个格子可以 只尝试合并其右方或者下方的格子 ,按这样的逻辑处理必然是不会有回头路滴。 如此扫描直至某个网格与其右边或者下边的网格在同一个集合中,则满足题目要求,返回 true 。 代码 class Solution { public: bool containsCycle(vector<vector<char>>& grid) { // 比较重要的是这种环路的长度还必须 >=4 才算 // 其实不难,可以用并查集来执行合并和判环,如果有环就看对应块中元素数量是不是 >=4 // 要构成环,最小的环必然是四个方格组成的 int m=grid.size(),n=grid[0].size(); // 初始化并查集 vector<int> parents(m*n,-1),sizes(m*n,1); auto find=[&](auto&& self, int x) -> int { // 带路径压缩的查找 return parents[x]==-1 ? x : parents[x]=self(self, parents[x]); }; // 合并,返回是否执行了合并 auto merge=[&](int x1,int x2) -> bool { int root1=find(find,x1),root2=find(find,x2); if(root1==root2){ // 已经合并 return false; } // 否则启发式合并,小树并入大树 if(sizes[root1]<sizes[root2]){ swap(root1,root2); } parents[root2]=root1; sizes[root1]+=sizes[root2]; return true; }; // 获得集合大小 // auto getSize=[&](int x){ // return sizes[find(find,x)]; // }; // 扫描数组执行判环 int drcts[][2]={ {0,1}, {1,0}, }; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ // 为了防止走回头路,对于每个方格我们只往右或者往下合并 for(auto& d:drcts){ int newI=i+d[0],newJ=j+d[1]; if(newI>=m||newJ>=n||grid[newI][newJ]!=grid[i][j]){ // 越界或者字母不相同 continue; } // 尝试执行合并 if(!merge(i*n+j,newI*n+newJ)/*&&getSize(i*n+j)>=4*/){ // 如果没有执行合并,说明遇到已经在并查集里的了,有环 // 这个时候判断,如果集合中有 >=4 个元素就可以结束 // 其实在不走回头路的前提下,只要有环,必然路径长度 >=4 return true; } } } } return false; } }; 2 个帖子 - 2 位参与者 阅读完整话题

linux.do · 2026-04-23 20:10:50+08:00 · tech

单张画面呈现意识流式的非线性错落排版(打破常规网格,10个记忆碎片以大小不一、比例交错的几何形态咬合,切片间具有强烈的连贯叙事逻辑)。界线如手术刀般锐利漆黑,绝对不融合。全局质感:冰冷的RAW格式纪实摄影,剥离温度的蓝灰滤镜,粗粝的呼吸感与废土诗意。主体:东方骨相的女性驾驶员,短发,剥落伪装的真实肌理。她身着苍白的未来作战服,材质满是带着硝烟的撕裂伤痕,破损处裸露着防弹纤维与肌肤。环境:巨物陨落的死水废墟。切片1:24mm,极寒白雾吞噬着钢铁丛林,水面如镜,倒影着死去的文明。切片2:35mm,水面尽头,半沉的星际逃生舱正呕出最后的灰烬,那是坠落的起点。切片3:50mm,逃生舱外几米处的浅水中,一具苍白躯壳静默倒伏,羊水般的涟漪托起她残破的白甲。切片4:50mm,沉睡被打破,她双臂战栗着撑破水面,水滴自撕裂的装甲边缘砸落,如同倒流的时间。切片5:85mm,颤抖的残缺手套里,死死攥着一枚裂痕斑驳的罗盘,幽蓝星火指引着生门。切片6:24mm,循着微光,渺小的白色战损孤影蹚过及膝的黑水,向着迷雾深渊跋涉。切片7:50mm,跋涉的终点,她停下脚步,仰望雾海中蛰伏的巨型远古机械神明。切片8:85mm,指尖终于触碰那冰冷生锈的金属肌理,罗盘的幽蓝光芒与遗迹深处产生共鸣,完成了温度的献祭。切片9:50mm,宿命交汇后的极度虚脱,她顺着遗迹断壁滑落,半截脱力的躯壳沉入渊薮。切片10:100mm极特写,作为视觉重心的最大切片,湿冷发丝紧贴毫无血色的面颊,那双被切断了软弱情感的瞳孔穿透虚无,深渊也在静默回望。全画幅,f/2.8,ISO 100,HDR,8K,零度情感的史诗级连贯暗流分镜。 --ar 105:105 --style raw --v 6.0 2 个帖子 - 2 位参与者 阅读完整话题