一个词是一个anagram http://en.wikipedia.org/wiki/Anagram如果该单词中的字母可以重新排列以形成不同的单词。
Task:
Input:
a 单词列表 http://cmalabs.com/files/words来自 stdin,每个单词用新行分隔。
e.g.
A
A's
AOL
AOL's
Aachen
Aachen's
Aaliyah
Aaliyah's
Aaron
Aaron's
Abbas
Abbasid
Abbasid's
Output:
所有组的字谜词,每组由单独的线分隔。
运行示例:
./anagram < words
marcos caroms macros
lump's plum's
dewar's wader's
postman tampons
dent tend
macho mocha
stoker's stroke's
hops posh shop
chasity scythia
...
我有一个 149 字符的 perl 解决方案,只要有更多人发布,我就会发布:)
玩得开心!
编辑:澄清
- 假设字谜不区分大小写(即大写和小写字母相同)
- 仅应打印包含 1 个以上项目的套装
- 每组字谜词只能打印一次
- 字谜集中的每个单词只能出现一次
EDIT2:更多说明
- 如果两个单词仅大小写不同,则它们应折叠为同一个单词,并且由您决定折叠单词使用哪种大小写方案
- 单词组只需以新行结束,只要每个单词以某种方式分隔即可,例如逗号分隔或空格分隔均有效。我了解某些语言内置了快速数组打印方法,因此如果它不输出空格分隔的数组,您应该可以利用它。
Powershell, 104 97 91 86 83 chars
$k=@{};$input|%{$k["$([char[]]$_|%{$_+0}|sort)"]+=@($_)}
$k.Values|?{$_[1]}|%{"$_"}
新要求的更新(+8 个字符):
要排除仅大小写不同的单词,我们可以从输入列表中删除重复项(不区分大小写),即$input|sort -u
where -u
代表-unique
. sort
默认情况下不区分大小写:
$k=@{};$input|sort -u|%{$k["$([char[]]$_|%{$_+0}|sort)"]+=@($_)}
$k.Values|?{$_[1]}|%{"$_"}
的解释[char[]]$_|%{$_+0}|sort
-part
它是哈希表条目的键,在该条目下存储单词的字谜。我最初的解决方案是:$_.ToLower().ToCharArray()|sort
。然后我发现我不需要ToLower()
对于键,因为哈希表查找不区分大小写。
[char[]]$_|sort
将是理想的,但是键的字符排序需要不区分大小写(否则Cab
and abc
将存储在不同的密钥下)。很遗憾,sort
对于字符不区分大小写(仅对于字符串)。
我们需要的是[string[]][char[]]$_|sort
,但我找到了一种将每个字符转换为字符串的更短方法,即将其他内容连接到它,在本例中是一个整数0
, hence [char[]]$_|%{$_+0}|sort
。这不会影响排序顺序,实际的键最终类似于:d0 o0 r0 w0
。它不漂亮,但它可以完成工作:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)