Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ruby中使用字符串进行多个组合?_Ruby_String - Fatal编程技术网

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

如何在ruby中使用字符串进行多个组合?,ruby,string,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”)的开头和结尾不

输入应为字符串:

"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
我的方法是

  • 写一个函数,设置第一个点
  • 编写一个设置下一个点的函数
  • …(魔法)
  • 我不知道如何把这些碎片拼在一起。有什么想法吗?或者是更好的方法? 先发制人

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

    …这里是解决方案

    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
    
    s=“abc”
    状态=s长度
    可能性=2**状态
    def set_space_或_dot(值)
    value.gsub(“0”,“0”).gsub(“1”,“0”)
    结束
    def用前导零填充(val,状态)
    如果val.length<状态
    “0”*(states-val.length)+val
    其他的
    瓦尔
    结束
    结束
    a=数组。新(可能值,s)
    a=a.map{| x | x.split”“}
    b=[*0…可能性].map{x | x.to_s(2).to_s}
    b=b.map{| x |用_前导_零x,状态}
    b=b.map{| x | x.split”“}
    c=[]
    因为我在0。。。a、 大小
    c[i]=(设置空间或点(a[i].zip b[i]).join).strip
    结束
    
    一个选项是在移动点的字符串中迭代n次,其中n是字符数减去1。这就是您现在正在做的,但没有定义两种方法

    大概是这样的:

    possibilities = []
    string = "abcd@example.com"
    (string.split('@')[0].size-1).times do |pos|
      possibilities << string.dup.insert(pos+1, '.')
    end
    
    可能性=[]
    字符串=”abcd@example.com"
    (string.split('@')[0].size-1)。时间做| pos|
    
    可能性稍微改变一下Pduestler的答案:

    possibilities = []
    string = "abcd@example.com"
    (string.split('@')[0].size-1).times do |pos|
      possibility = string.dup
      possibilities << possibility.insert(pos+1, '.')
    end
    
    可能性=[]
    字符串=”abcd@example.com"
    (string.split('@')[0].size-1)。时间做| pos|
    可能性=string.dup
    可能性这方面如何(可能需要更多微调以满足您的需要):


    只是问:这是一个也可能被标记为作业的问题吗你想用这个做什么?检查给定的电子邮件和e.m.a.i.l是否相同?事实上,这不是家庭作业……但给它加上那个标签没关系(我很不好意思问这个关于stackoverflow的问题,我只做了一个说明…@Tiago:删除一个或多个点,然后执行检查在ruby中不是问题,这是一个单行线;)不要认为你需要为这些问题感到羞耻,不是每个人都在同一个niveau上,或者在解决编程问题上有相同的想法。太好了!塔克斯。“abcd”->四个字符,“a.b.c.d”->三个点(文本长度-1)。时间不设置点。。。这可能会起作用,thanx:)这不会起作用,因为会在内部更改字符串。
    insert
    修改原始字符串m,但
    string.dup.insert
    可能会对您起作用。好的,也许最好让字符串“分解”成数组,似乎总是更便于操作…感谢您的输入,编写代码时没有可能对其进行测试。更新答案@BadassProgramming新手并不认为将字符串分解为数组进行操作总是更好的。这只会生成
    [“a。bcd@example.com“,”ab。cd@example.com美国广播公司。d@example.com“]
    ,OP需要更多不同的版本。
    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"]