示例工程【免费下载链接】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),仅供参考