的另一種方法:
string = "this is a test"
subs = [{"a"=>"@"}, {"i"=>"!"}, {"s"=>"$"}]
subs.repeated_combination(subs.size)
.map {|e| string.gsub(/./) {|c| (g = e.find {|h| h.key?(c)}) ? g[c] : c}}
.uniq
#=> ["this is @ test", "th!s !s @ test", "thi$ i$ @ te$t", "th!$ !$ @ te$t",
# "th!s !s a test", "th!$ !$ a te$t", thi$ i$ a te$t"]
說明:
a = subs.repeated_combination(subs.size)
# Enumerator...
a.to_a
# [[{"a"=>"@"},{"a"=>"@"},{"a"=>"@"}], [{"a"=>"@"},{"a"=>"@"},{"i"=>"!"}],
# [{"a"=>"@"},{"a"=>"@"},{"s"=>"$"}], [{"a"=>"@"},{"i"=>"!"},{"i"=>"!"}],
# [{"a"=>"@"},{"i"=>"!"},{"s"=>"$"}], [{"a"=>"@"},{"s"=>"$"},{"s"=>"$"}],
# [{"i"=>"!"},{"i"=>"!"},{"i"=>"!"}], [{"i"=>"!"},{"i"=>"!"},{"s"=>"$"}],
# [{"i"=>"!"},{"s"=>"$"},{"s"=>"$"}], [{"s"=>"$"},{"s"=>"$"},{"s"=>"$"}]]
b = a.map {|e| string.gsub(/./) {|c| (g = e.find {|h| h.key?(c)}) ? g[c] : c}}
#=> ["this is @ test", "th!s !s @ test", "thi$ i$ @ te$t", "th!s !s @ test",
# "th!$ !$ @ te$t", "thi$ i$ @ te$t", "th!s !s a test", "th!$ !$ a te$t",
# "th!$ !$ a te$t", "thi$ i$ a te$t"]
要了解b
的計算方式,傳遞給該塊的a
第二元件:
e = [{"a"=>"@"},{"a"=>"@"},{"i"=>"!"}]
由於該正則表達式的,/./
,gsub
傳遞的string
每個字符c
到塊
{|c| (g = e.find {|h| h.key?(c)}) ? g[c] : c}
搜索結果由e
來確定如果三個哈希中的任何一個都有c
作爲關鍵字。如果找到一個,即g
,則將字符c
替換爲g[c]
;否則,角色保持不變。
請注意,e
的前兩個元素是相同的。通過將第一行改爲:
subs.repeated_combination(subs.size).map(&:uniq)
可以提高效率,但效率不是這種方法的優點之一。
返回到主計算,最後的步驟是:
b.uniq
#=> ["this is @ test", "th!s !s @ test", "thi$ i$ @ te$t", "th!$ !$ @ te$t",
# "th!s !s a test", "th!$ !$ a te$t", "thi$ i$ a te$t"]
只是好奇,爲什麼你要生成的組合? –
它適用於我正在使用的計算機安全課程中的任務。我們要寫一個密碼破解器,給出一個單詞列表應該破解我們的教授給我們的散列密碼。以上是已經實現的,儘管以非常難看的方式將每個組合在腳本中進行硬編碼。 – user3207230
你是否需要確切的預期產出,那麼我需要更多地回答我的問題? –