我有一些字典可以拼写file.dic
。比方说:
abc
aword
bword
cab
worda
wordzzz
我正在寻找不同的词排列(或字谜)彼此的。
如果有一个命令“字母排序”,我会或多或少地这样做:
cat file.dic | letter-sort | paste - file.dic | sort
这给了我:
abc abc
abc cab
adorw aword
adorw worda
bdorw bword
dorwzzz wordzzz
所以现在我清楚地看到文件中的字谜。是否有这样的letters-sort
命令或者如何以其他方式获得这样的结果?
答案1
要在文件中逐行对字母进行排序,您可以执行以下操作:
while read line; do
grep -o . <<< "${line}" | sort | tr -d '\n'
echo
done < file.dic
输出:
abc
adorw
bdorw
abc
adorw
dorwzzz
答案2
您可以使用该fold
命令将字符串分解为单个字符的数组,如下面的脚本
#!/bin/bash
CHARS=`echo $1 | fold -w1`
# $CHARS now contain an array of single character in the string $1
for i in "${CHARS[@]}"
do
# do something with each character
echo $i;
done
假设您已经保存了上面的脚本,test.sh
您可以按如下方式运行它:
$./test.sh abcde
它将把字符串“abcde”分解成一个字符数组,然后你可以用它来查找它的字谜。
答案3
你提到的python
,坚持下去python
。如果 1. 两个单词包含相同的字母并且 2. 字母频率匹配,则这两个单词是彼此的字谜词。内置的Counter
类可以用来做一次性字母频率,无需排序
from __future__ import print_function
from collections import Counter, defaultdict
from itertools import combinations_with_replacement
with open('file') as f:
data = (l.rstrip('\n') for l in f)
data = ((l, Counter(l)) for l in data)
perms = defaultdict(list)
for l, c in data:
perms[frozenset(c.iteritems())].append(l)
for anagrams in perms.itervalues():
print(*anagrams)
bword
aword worda
abc cab
wordzzz
答案4
Perl 及其命令行标志非常擅长简洁:
以下命令对单词中的字母进行排序
perl -CS -ne 'chomp; print(join("", sort(split("", $_ . "\n"))))'
实际上,如果您正在使用字谜词,您可能更喜欢使用该an
实用程序。这可以将字典作为参数:
an -d /usr/share/dict/ngerman Anagramword