开发Raku脚本:查找仅单字符差异的同长单词(可指定差异字符)
Raku脚本:查找词表中单字符差异的单词对
核心功能实现
先将词表按单词长度分组,避免跨长度的无效比较。随后对同长度的单词两两对比,统计字符差异数,筛选出仅存在单字符不同的单词对。
sub find-single-diff-pairs(@words) { # 按单词长度分组 my %groups = @words.classify(*.chars); my @results; for %groups.values -> @same-length { # 生成不重复的单词对进行比较 for 0 ..^ @same-length.end -> $i { for $i+1 ..^ @same-length.end -> $j { my $word1 = @same-length[$i]; my $word2 = @same-length[$j]; # 统计字符差异数量 my $diff-count = [+] $word1.comb Z!= $word2.comb; if $diff-count == 1 { push @results, ($word1, $word2); } } } } return @results; } # 读取词表文件(每行一个单词,自动过滤空行) my @wordlist = 'wordlist.txt'.IO.lines.grep(*.chars > 0); # 输出所有符合条件的单词对 for find-single-diff-pairs(@wordlist) -> ($a, $b) { say "$a ↔ $b"; }
扩展:指定差异字符对
如果需要限定差异为特定字符组合(如s/t),可以在统计差异数的基础上,额外检查差异位置的字符是否匹配指定的字符对(支持双向匹配,即s→t或t→s)。
修改后的功能函数:
sub find-specific-diff-pairs(@words, Str $diff-pair) { my ($c1, $c2) = $diff-pair.split('/'); my %groups = @words.classify(*.chars); my @results; for %groups.values -> @same-length { for 0 ..^ @same-length.end -> $i { for $i+1 ..^ @same-length.end -> $j { my $word1 = @same-length[$i]; my $word2 = @same-length[$j]; # 提取所有字符差异的位置及对应字符 my @diffs = grep { $_[0] != $_[1] }, $word1.comb Z $word2.comb; next unless @diffs.elems == 1; my ($char-a, $char-b) = @diffs[0]; # 检查是否匹配指定的字符差异对 if ($char-a eq $c1 && $char-b eq $c2) || ($char-a eq $c2 && $char-b eq $c1) { push @results, ($word1, $word2); } } } } return @results; } # 使用示例:筛选仅存在s/t字符差异的单词对 my @matches = find-specific-diff-pairs(@wordlist, 's/t'); for @matches -> ($a, $b) { say "$a ↔ $b"; }
使用说明
- 准备词表文件
wordlist.txt,每行存放一个单词; - 基础版脚本会输出所有单字符差异的单词对;
- 指定差异字符时,调用
find-specific-diff-pairs函数并传入类似's/t'的字符对参数; - 脚本会自动忽略空行,仅处理非空单词。
内容的提问来源于stack exchange,提问作者Jim Bollinger
相关产品推荐
相关产品推荐

