我正在尝试在Ruby中打印出一个较低的套接字符串的所有upxased版本排列。例如:
原始字符串:aaa,
输出是:
AAA
AAA
AAA
AAA
AAA
AAA
AAA
AAA
非常感谢任何帮助或提示。
答案 0 :(得分:3)
str = 'aaa'
(0...1<<str.length).map { |i|
str.chars.map.with_index { |a,b| ((i>>b)&1).zero? ? a : a.upcase }.join
}
# => aaa Aaa aAa AAa aaA AaA aAA AAA
基本思想是n
(2**n == 1<<n
)输出字符串的强大功能为n=str.length
。因此,您可以使用从0到i
的索引2**n-1
作为要升级字母的位域。 E.g。
000 -> aaa
001 -> aaA
010 -> aAa
011 -> aAA
etc.
答案 1 :(得分:3)
您可以使用repeated_permutation
做您想做的事情:
%w(a A).repeated_permutation(3).map(&:join)
# => ["aaa", "aaA", "aAa", "aAA", "Aaa", "AaA", "AAa", "AAA"]
对于任意字符串,您可以创建问题的排列是否要对该字母进行整理,例如:
str = 'abcde'
chars = str.chars
[false, true].repeated_permutation(str.length).map do |permutation|
chars.zip(permutation).map do |char, upcase|
upcase ? char.upcase : char
end.join
end
# => ["abcde", "abcdE", "abcDe", "abcDE", "abCde", "abCdE", "abCDe", "abCDE",
# "aBcde", "aBcdE", "aBcDe", "aBcDE", "aBCde", "aBCdE", "aBCDe", "aBCDE",
# "Abcde", "AbcdE", "AbcDe", "AbcDE", "AbCde", "AbCdE", "AbCDe", "AbCDE",
# "ABcde", "ABcdE", "ABcDe", "ABcDE", "ABCde", "ABCdE", "ABCDe", "ABCDE"]
答案 2 :(得分:3)
我更喜欢@Uri针对特定情况的解决方案,但会建议使用小写字母的任意字符串:
str = "abad"
arr = str.chars.map { |c| [c,c.upcase] }
arr.shift.product(*arr).map(&:join)
#=> ["abad", "abaD", "abAd", "abAD", "aBad", "aBaD", "aBAd", "aBAD",
# "Abad", "AbaD", "AbAd", "AbAD", "ABad", "ABaD", "ABAd", "ABAD"]