如何在ruby中使用字符串进行多次组合?

时间:2012-05-16 13:21:53

标签: ruby string

输入应该是一个字符串:

"abcd@gmail.com"

输出应该是一个字符串数组:

["abcd@gmail.com",
 "a.bcd@gmail.com",
 "ab.cd@gmail.com",
 "abc.d@gmail.com",
 "a.b.cd@gmail.com",
 "a.bc.d@gmail.com",
 "a.b.c.d@gmail.com"]

这个想法:“用点做第一个字符串部分(”abcd“)中的每个可能的组合。不允许连续的点。在第一个字符串部分的开头和结尾都没有允许的点(” ABCD “)”

这是我到目前为止所提出的:

text,s = "abcd".split""
i=0

def first_dot(text)
  text.insert 1,"."
end

def set_next_dot(text)
  i = text.rindex(".")
  text.delete_at i
  text.insert(i+1,".")
end

我的方法是

  1. 编写一个设置第一个点
  2. 的函数
  3. 编写一个设置下一个点的函数
  4. ...(魔术)
  5. 我不知道怎么把这些碎片放在一起。任何的想法?或许还有更好的方法? 提前谢谢

    编辑: 我想我找到了解决方案:) 我将在大约一个小时内发布它(它很精彩 - >真值表,二进制数,换位)

    ...此处为解决方案

    s = "abc"
    states = s.length
    possibilites = 2**states
    
    def set_space_or_dot(value)
      value.gsub("0","").gsub("1",".")
    end
    
    def fill_with_leading_zeros(val, states)
      if val.length < states 
       "0"*(states-val.length)+val
      else
       val
      end
    end
    
    a = Array.new(possibilites,s)
    a = a.map{|x| x.split ""}
    
    b = [*0...possibilites].map{|x| x.to_s(2).to_s}
    b = b.map{|x| fill_with_leading_zeros x,states} 
    b = b.map{|x| x.split ""}
    
    c = []
    
    for i in 0 ... a.size
      c[i] = (set_space_or_dot (a[i].zip b[i]).join).strip
    end
    

3 个答案:

答案 0 :(得分:2)

更改pduersteler回答:

possibilities = []
string = "abcd@example.com"
(string.split('@')[0].size-1).times do |pos|
  possibility = string.dup
  possibilities << possibility.insert(pos+1, '.')
end

答案 1 :(得分:1)

这个怎么样(可能需要更多微调以满足您的需求):

s = "abcd"

(0..s.size-1).map do |i|
  start, rest = [s[0..i], s[(i+1)..-1]]
  (0..rest.size-1).map { |j| rest.dup.insert(j, '.') }.map { |s| "#{start}#{s}"}
end.flatten.compact
#=> ["a.bcd", "ab.cd", "abc.d", "ab.cd", "abc.d", "abc.d"]

答案 2 :(得分:0)

一个选项是通过移动点的字符串迭代n次,其中n是字符数量减1.这是你现在正在做的,但没有定义两个方法。

这样的事情:

possibilities = []
string = "abcd@example.com"
(string.split('@')[0].size-1).times do |pos|
  possibilities << string.dup.insert(pos+1, '.')
end

修改
现在测试了。感谢评论,你需要在插入之前在字符串上调用.dup。否则,点会插入到字符串中,并且会在每次迭代时保持不变,从而导致混乱。在字符串上调用.dup将复制字符串并在副本上工作,保持原始字符串不变。