2012-05-16 61 views
1

輸入應爲字符串:如何在ruby中對字符串進行多重組合?

"[email protected]" 

輸出應該是一個字符串數組:

["[email protected]", 
"[email protected]", 
"[email protected]", 
"[email protected]", 
"[email protected]", 
"[email protected]", 
"[email protected]"] 

的想法:「使在第一組部件每個可能的組合(」 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. 功能...(魔術)

我不知道如何把碎片放在一起。任何想法?或者更好的方法? thanx提前

編輯: 我想我找到了解決辦法:) 我將它張貼在大約一小時(這是輝煌 - >真值表,二進制數,換位)

......和這裏的解決方案

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 
+2

就問:這是一個問題,也可能用'homework'標記? ;) – pduersteler

+0

以及你想用這個做什麼?檢查給定的電子郵件和e.m.a.i.l是否相同? –

+0

實際上,它不是作業......但它可以給它的標籤(我很抱歉在stackoverflow上提出這個問題,我只是做了一個帳戶... ...) –

回答

0

的選擇是重複n到您的字符串與時俱進點,其中n是字符的減額1.這是你在做什麼的權利,但不限定了兩個方法。

事情是這樣的:

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

編輯
現在測試。謝謝您的意見,您需要在插入前在字符串上撥打.dup。否則,點會插入到字符串中,並會留在那裏,每次迭代都會造成混亂。在字符串上調用.dup將複製該字符串並在該副本上工作,而不改變原始字符串。

+1

太棒了!感謝名單。 「abcd」 - >四個字符,「abcd」 - >三個點 (text.length-1).times do設置點... 可能工作,thanx :) –

+1

這將無法正常工作,因爲[insert]( http://www.ruby-doc.org/core-1.9.3/String.html#method-i-insert)會在內部更改字符串。 –

+1

'insert'修改原始stringm,但'string.dup.insert'可以爲你工作。 –

2

更改pduersteler回答一點點:

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

這隻產生'[「[email protected]com」,「[email protected]」,「[email protected]」],OP想要更多不同的版本。 –

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"] 
相關問題