Answers:
更好的解决方案:
echo {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}
为了实现完全可伸缩性:
echo harley \
| perl -nle 'print "echo ",
join "",map { "{" . lc . "," .uc ."}" } split //' \
| xargs -I {} bash -c "{}"
如果您绝对必须每行只有一个单词,请选择
for w in {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y};do echo $w;done
相应的可伸缩版本为:
echo harley \
| perl -nle 'print join "",map { "{" . lc . "," .uc ."}" } split //' \
| xargs -I {} bash -c 'for w in {};do echo $w;done'
为了好玩,尝试用“ supercalifragilisticexpialidocious”替换“ harley”。已经5分钟了,我的计算机仍在处理此问题,并且可能永远无法完成:)
printf '%s\n' {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}
printf
编辑2:这个答案是错误的。它不会产生应有的2 ^ n个组合。
编辑:我不知道为什么,但这个解决方案真的快相比,@Joeseph R. perl的解决方案。它运行“Supercalifragilisticexpialidocious”在小于0.3秒!
这是我要解决的问题:
#!/bin/bash
str=${1^^} # convert to uppercase
len=${#str} # get length of string
for ((perm=0; perm <= len; perm++)); do
for ((i=0; i <= len; i++)); do
lower=${str,,} # convert to lowercase
# Uppercase n-th letter for permutation
if [ $perm -gt 0 ]; then
nth=${lower:perm-1}
lower=$(echo ${lower:0:perm-1}${nth^})
fi
echo -n ${str:0:i} # print orig string from 0 to $i
echo ${lower:i} # print new string from $i to end
done
done | sort -u
运行它:
$ ./permutations.sh hi
hi
hI
Hi
HI
$ ./permutations.sh harley
harley
harleY
harlEy
harLey
haRley
hArley
Harley
HarleY
HarlEy
HarLey
HaRley
HArley
HArleY
HArlEy
HArLey
HARley
HARleY
HARlEy
HARLey
HARLeY
HARLEy
HARLEY
随意分叉和修改它,我相信它可以被优化。https://gist.github.com/ryanmjacobs/4c02ad80f833dee0c307
harley
你应该有64分的结果,在这里的harLEY
,例如?
如果您希望使用现成的工具而不是编码,则可以使用TextMechanic(排列/组合生成器工具)和Unit-Conversion.info