深入解析 Reto 9:用多语言实现 Heterograma、Isograma 与 Pangrama 文本检测
示例工程【免费下载链接】retos-programacion-2023Ejercicios de código semanales en 2023 de la comunidad MoureDev para practicar lógica en cualquier lenguaje de programación.项目地址https://gitcode.com/gh_mirrors/re/retos-programacion-2023点击查看免费下载导读本文以 MoureDev 社区《Retos de programación semanales 2023》系列第 9 个练习难度Fácil2023-02-27 发布为蓝本系统讲解异序词检测的三种经典文本属性Heterograma无重复字母、Isograma每个字母出现次数相同与 Pangrama包含字母表全部字母。文章不仅完整还原题目要求还结合当前仓库中 19 种语言Python、JavaScript、Java、Kotlin、Go、Rust、C、C、C#、Dart、Swift、PHP、Haskell、Perl、Raku、Ruby、Scala、TypeScript、VBScript的社区实现剖析字符规范化、频次统计与字母表判定三类核心算法帮助读者掌握一套可跨语言复用的字符串分析解题范式。题目解读三种检测函数题目出自 [Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [Fácil]/ejercicio.md](Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [Fácil]/ejercicio.md)原文要求如下/* * Crea 3 funciones, cada una encargada de detectar si una cadena de * texto es un heterograma, un isograma o un pangrama. * - Debes buscar la definición de cada uno de estos términos. */即创建3 个函数分别检测给定文本字符串是否为 Heterograma、Isograma 或 Pangrama并且要求解题者自行查证这三个术语的定义——这正是该练习的训练重点在动手编码之前先把问题的数学定义想清楚。仓库的参与规则见根目录 README.md规定每个练习目录下都有ejercicio.md题目文件社区成员可将自己的解法按「Reto #[编号]/[语言目录]/[GitHub用户名].[扩展名]」的格式提交 Pull Request。本练习目录中共沉淀了 174 个文件、覆盖 19 种编程语言的实现是观察同一算法在不同语言生态中如何落地的绝佳样本。三个术语的精确定义不同社区的解法对三者的定义高度一致可归纳如下术语定义典型示例Heterograma文本中不包含任何重复字母每个字母恰好出现一次murcielago、hiperblanduzcosIsograma文本中每个字母出现的次数都相同即存在常数 c使所有字母出现次数均为 canna各 2 次、Hhoollaa各 2 次Pangrama文本包含该语言字母表中的每一个字母至少一次The quick brown fox jumps over the lazy dog、西语经典例句El veloz murciélago hindú comía feliz cardillo y kiwi...值得注意的是Isograma 与 Heterograma 的包含关系Heterograma 本质上是每个字母出现 1 次的 Isograma即一阶 Isograma。仓库中多处实现直接利用了这一关系例如 python/nlarrea.py 的注释明确指出heterograma texto que no contiene letras repetidas而 rust/hdescobarh.rs 更是用形式化语言给出定义Let Q(x) be the times the letter x appears in an expression X. - Isogram: a X that satisfies ∀x∈X, Q(x)c, such that c is a constant x≥1. - Heterogram (or first-order isogram): an isogram such that c1. Let A(l) be the alphabet of the language l. - Pangram: a X that satisfies ∀a∈A(l), Q(a) 1这套形式化定义是理解全部解法的关键三个检测器本质上都围绕字母频次表做不同的断言——Heterograma 断言最大频次为 1Isograma 断言所有频次相等Pangrama 断言字母表全集都被覆盖。通用算法骨架三步走综合仓库中 63 个 Python、27 个 JavaScript、17 个 Java 等实现可提炼出放之四海皆准的三步流程规范化Normalize转小写大小写不敏感、去除空格/标点/数字、处理重音与特殊字母á→a、保留或归一ñ频次统计Count建立字符 → 出现次数的映射判定Assert依据上表的条件对频次表做出布尔断言。以 Python 官方解法 python/mouredev.py 为例其核心是复用同一个字符计数器__char_counterdef __char_counter(text: str) - dict[str, int]: no_number_text re.sub(r\d, , text.lower().replace( , )) no_punt_text re.sub(r[^\w\s], , no_number_text) # Obtenemos el unicode pero preservando la ñ unicode unidecode(no_punt_text.replace(ñ, .)).replace(., ñ) ...三个检测函数分别对频次表取不同视图def isHeterogram(text: str) - bool: # 所有频次都等于 1 for counter in __char_counter(text).values(): if counter 1: return False return True def isIsogram(text: str) - bool: # 所有频次彼此相等 order 0 for counter in __char_counter(text).values(): if order is 0: order counter if order is not counter: return False return True def isPangram(text: str) - bool: # 去重后恰好 27 个字母含 ñ return len(__char_counter(text).keys()) is 27该解法用unidecode库统一处理重音á、ü等归一为基本拉丁字母并通过先把ñ替换为临时占位符、归一化后再换回的技巧保留西班牙语特有的ñ因此 Pangrama 判定按 27 个字母26 个拉丁字母 ñ计算。仓库多语言实现的四种范式浏览 19 种语言的提交可归纳出四种典型的实现策略范式一集合比较法Set 去重利用去重后长度 原长度判定无重复字母。典型如 JavaScript javascript/miguelex.jsconst isHeterogram (cadena) cadena.length new Set(removeDiacritics(cadena)).size;Java 版 java/miguelex.java 与之同构用cadena.chars().distinct().count()实现Swift 版 swift/miguelex.swift 用Set(removeDiacritics(cadena: cadena)).countC# 版 c#/miguelex.cs 用cadena.Distinct().Count()。这一范式的时间复杂度为 O(n)代码最简洁。范式二字母表差集法Alphabet 删除维护一个待覆盖字母表集合遍历文本时逐字母删除集合清空即判定为 Pangrama。Java、Kotlin、Go、Swift、C# 等多处实现都采用此模式例如 kotlin/miguelex.ktprivate fun isPangram(cadena: String): Boolean { val alfabeto mutableSetOfChar() for (letra in a..z) { alfabeto.add(letra) } for (letra in removeDiacritics(cadena.toLowerCase())) { if (letra in alfabeto) alfabeto.remove(letra) if (alfabeto.isEmpty()) return true } return false }该范式还支持短路优化每删一个字母就检查集合是否为空一旦覆盖完全即可提前返回无需遍历完整个文本。Go 版 go/miguelex.go 用map[rune]bool实现同样的删除逻辑。范式三正则断言法RegExp 负向前瞻用正则表达式的负向前瞻一次性完成无重复字符校验。TypeScript 与 Dart 的实现中采用了^(?!.*(.).*\1)[a-zA-Z]$这一经典模式例如 dart/malopezrom.dartbool isHetereogram(String text) { final textLower text.toLowerCase().cleanText().replaceAll(RegExp([^a-z]), ); final regExp RegExp(r^(?!.*(.).*\1)[a-zA-Z]$); return regExp.hasMatch(textLower); }同时这些实现通过String 扩展方法String.prototype/extension StringExtension/fun String.xxx把三个检测器与字符清洗逻辑封装为字符串的内置能力调用时形如word.isIsogram()、word.isPangram()可读性极佳。范式四原生字符表法数组 / 计数器不依赖高级集合用固定数组或哈希表做频次计数。C 语言实现 c/FranzxFernandez.c 用bool letter_found[26]数组配合idx str[i] - a完成 Pangrama 覆盖检查Java 版 java/CarlosCarrilloP.java 使用boolean[] letras new boolean[26]做同样的位图判定PHP 版 php/lombervid.php 则借助内置的count_chars($str, 1)直接返回频次数组一行判断max($counts) min($counts)即可判定 Isogramacount_chars($str, 3)返回去重字符串并与range(a,z)比较判定 Pangrama。这类写法更贴近底层、依赖更少。细节与陷阱为什么 esdrújula 不是 Heterograma社区实现与测试用例共同暴露了四个必须处理的边界问题大小写不敏感所有实现第一步都执行lower()/toLowerCase()/lowercased()保证Murcielago与murcielago判定一致重音与变音符号esdrújula含重音ú若不做归一化u与ú会被当作两个不同字符导致去重计数误判。miguelex 系列实现用一张á→a、é→e、…、ñ→n、ç→c的映射表逐字符替换见 javascript/miguelex.jsPython 则用unidecode库ñ的特殊地位西语字母表共 27 个字母Pangrama 判定必须包含ñ。mouredev.py 通过占位符技巧保留ñpython/KevinED11.py 则在检测到文本含ñ时向ascii_lowercase追加ñpython/PabloGradolph.py 直接在字母表中显式列出 27 个字母空格、标点与数字绝大多数实现用正则[^a-z]/[^\w\s]或preg_replace将其剔除确保anna单词与Hhoollaa连续字符串这类输入不受干扰。关于 Unicode 的极端情况rust/hdescobarh.rs 在注释中做了最严谨的提醒同一个字母字符可能有多个编码形式——í既可以是单码点U00ED也可以是组合序列U0069 U0301且同一字母在不同语言中归属不同西语u/ü是同一元音德语则视为两个字母。该实现通过Alphabet结构体把基础字母表 变体归一映射抽象为语言参数Language::Spanish并将输入字符必须属于目标语言字母表作为构造期校验是目前仓库中建模最完整的一版。测试用例与验证结果各实现附带的示例输入就是天然测试集可直接用于验证自己的解法Heterogramamurcielago→trueesdrújula→falsehiperblanduzcos→true含标点变体hiperblanduzcós !!w→true标点被剔除Isogramaanna→true2 阶Hhoollaa→trueHholla→falsePangrama英文经典句the quick brown fox jumps over the lazy dog→true西语经典句El veloz murciélago hindú comía feliz cardillo y kiwi. La cigüeña tocaba el saxofón detrás del palenque de paja→truemiguelex 系列在多语言中反复使用此句abcdefghijklmnopqrstuvwxyz→true含ñ变体abcdefghijklmnñopqrstuvwxyz→true。特别值得借鉴的是 rust/hdescobarh.rs 内置的#[cfg(test)]单元测试模块覆盖了纯小写、大小写混合、含重音、含ñ四类输入并验证了 Isograma 的阶数返回值racondicidonar的阶为 2——这是本仓库中少数带完整测试的练习提交可作为工程化练习的标准范例。参与方式与延伸学习如果你也想动手实现并参与社区互评可遵循根目录 README.md 中的流程Fork 仓库后在本练习目录 [Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [Fácil]](Retos/Reto #9 - HETEROGRAMA, ISOGRAMA Y PANGRAMA [Fácil]) 下将解法文件放入对应语言的子目录语言目录不存在时自建目录名全小写并以Reto #9 - [lenguaje_utilizado]为标题提交 Pull Request。官方解法可参考 python/mouredev.py。进一步练习可尝试将 Isograma 扩展为返回阶数每个字母的出现次数而非仅布尔值把 Pangrama 的字母表改为可配置参数以支持不同语言正如 kotlin/malopezrom.kts 中isPangram(alphabet: String)的做法或参考 Rust 版为你的实现补充 Unicode 组合字符与ñ的单元测试。掌握规范化 → 统计 → 断言这条主线后本题的三种检测器可以在任意语言中轻松复现。赞分享示例工程【免费下载链接】retos-programacion-2023Ejercicios de código semanales en 2023 de la comunidad MoureDev para practicar lógica en cualquier lenguaje de programación.项目地址https://gitcode.com/gh_mirrors/re/retos-programacion-2023点击查看免费下载相关推荐孪生素数检测实战解析 Reto 21 挑战的多语言实现与素数判定优化孪生素数检测实战解析 Reto 21 挑战的多语言实现与素数判定优化 本篇技术指南以 MoureDev 社区 2023 年编程挑战第 21 期Reto 21示例工程Reto 25 实战用多语言实现 Konami Code上上下下左右左右 BA键盘序列检测Reto 25 实战用多语言实现 Konami Code上上下下左右左右 BA键盘序列检测 本文以 Reto 25 EL CÓDIGO KONAMI 为题示例工程xberg 多语言检测实战Go 中启用多语言检测并解析 ISO 639-3 语言代码xberg 多语言检测实战Go 中启用多语言检测并解析 ISO 639 3 语言代码 本篇技术指南围绕 xberg 文档智能提取核心的多语言检测能力展开以后端AI 应用NLP上一篇Qwen3-ASR 时间戳深度解析:33ms 级非自回归强制对齐模型凭什么超越 WhisperX?下一篇Dillinger 项目 Agent 技能库中的 2D 游戏开发实践指南精灵、瓦片地图、物理与摄像机系统设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

实时控制学习1

实时控制学习1

1、rclcpp::spin(node) 背后可以怎么理解?简单理解:spin(node) ↓ 创建/使用 Executor ↓ 把 Node 加进去 ↓ 持续等待 ROS2 事件 ↓ 执行 callbackSingleThreadedExecutor用一个线程依次执行 callback。比如 Node 有:Callback A Callback B …

2026/10/15 3:50:43 阅读更多 →
安装、启动OpenCode

安装、启动OpenCode

关于作者: 我是星河,一个深耕自己,不内耗的长期主义者。一个对技术充满激情,对工作对生活充满热情的热血青年。坚信,真正能让大家看懂的技术文章才是好文章,坚持用更通俗易懂的大白话写技术博文&#xff0c…

2026/10/15 3:50:43 阅读更多 →
S029A-STM32单片机病房呼叫系统(LCD1602)【Proteus仿真+Keil程序+原理图】

S029A-STM32单片机病房呼叫系统(LCD1602)【Proteus仿真+Keil程序+原理图】

☆、设计硬件组成:STM32单片机最小系统LCD1602液晶显示屏按键设置蜂鸣器LED灯; 1、本设计采用STM32F103C8T6单片机作为主控芯片; 2、八路呼叫:具有8个呼叫按键,实现呼叫,并且系统按呼叫顺序进行记录编号&…

2026/10/15 3:50:43 阅读更多 →

最新新闻

MIPS核心指令硬件原理与工程避坑指南

MIPS核心指令硬件原理与工程避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 4:46:53 阅读更多 →
iOS应用代码保护与Ipa Guard命令行自动化集成指南

iOS应用代码保护与Ipa Guard命令行自动化集成指南

1. 项目背景与核心价值在iOS应用开发领域,代码保护一直是开发者关注的重点。随着移动应用市场的竞争加剧,防止逆向工程和代码窃取变得尤为重要。传统的代码混淆工具往往需要手动操作,这在持续集成和自动化部署流程中显得效率低下。Ipa Guard命…

2026/10/15 4:46:53 阅读更多 →
Samba容器化实战:多租户隔离、协议兼容与权限映射

Samba容器化实战:多租户隔离、协议兼容与权限映射

1. 为什么在容器里跑Samba,而不是直接装在宿主机上?“Docker里跑Samba?这不反直觉吗?”——这是我第一次被团队同事问到这个问题时的真实反应。当时我们正在重构一个老旧的文件协作系统,原方案是在物理服务器上直接部署…

2026/10/15 4:46:53 阅读更多 →
STM32+华为云IoT+Qt:从传感器到云端的物联网数据链路实战

STM32+华为云IoT+Qt:从传感器到云端的物联网数据链路实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 4:46:53 阅读更多 →
沙箱代理工作流实战:隔离、权限与提示注入防御

沙箱代理工作流实战:隔离、权限与提示注入防御

1. 沙箱代理工作流到底在解决什么问题第一次接触“沙箱代理工作流”这个概念,是在一个自动化任务编排的项目里。当时团队想让一个智能代理去帮我们处理一批外部数据:抓取、清洗、分类、再写回内部系统。听起来很顺,但真正跑起来才发现&#x…

2026/10/15 4:46:53 阅读更多 →
模板代码生成工具:从元数据到可用接口的完整实现

模板代码生成工具:从元数据到可用接口的完整实现

1. 为什么需要模板代码生成工具:一大半重复代码其实不该手写做后端开发的朋友应该都有过这种体验:新项目启动,建表、写实体、写Mapper、写Service接口和实现、写Controller,然后前端再把列表页、表单页、弹窗、状态标签挨个撸一遍…

2026/10/15 4:45:53 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →