1

输入应该是一个字符串:

"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. ...(魔法)

我不知道如何将这些碎片拼凑在一起。任何想法?或者也许是更好的方法?提前谢谢

编辑:我想我找到了解决方案 :) 我会在大约一小时内发布它(它很棒 -> 真值表、二进制数、转置)

...这里的解决方案

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
4

3 回答 3

2

稍微改变一下 pduersteler 的答案:

possibilities = []
string = "abcd@example.com"
(string.split('@')[0].size-1).times do |pos|
  possibility = string.dup
  possibilities << possibility.insert(pos+1, '.')
end
于 2012-05-16T13:47:55.403 回答
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"]
于 2012-05-16T14:38:15.593 回答
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字符串将复制字符串并在副本上工作,而原始字符串保持不变。

于 2012-05-16T13:31:52.277 回答