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. ...(マジック)

ピースの合わせ方がわからない。何か案が?それとももっと良い方法ですか?事前に感謝

編集:解決策を見つけたと思います:)約1時間で投稿します(素晴らしいです->真理値表、2進数、転置)

...そしてここで解決策

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 を引いた数です。これが現在行っていることですが、2 つのメソッドを定義していません。

このようなもの:

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 に答える