如何在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"]