def gen_products(swap, str)
swap_all = Hash.new { |_,k| [k] }.merge(swap)
arr = swap_all.values_at(*str.chars)
arr.shift.product(*arr).map(&:join)
end
Hash#values_atとArray#product、(ブロックで)Hash::newを参照してください。 h = Hash.new { |_,k| [k] }
とh
にキーがk
でない場合、h[k]
は[k]
を返します。ここで
swap = { 'a'=>['$', '%', '^'], 'b'=>['3'], 'c'=>['4', '@'] }
gen_products(swap, "abc")
#=> ["$34", "[email protected]", "%34", "%[email protected]", "^34", "^[email protected]"]
swap_all = Hash.new { |_,k| [k] }.merge(swap)
#=> {"a"=>["$", "%", "^"], "b"=>["3"], "c"=>["4", "@"]}
vals = swap_all.values_at(*str.chars)
#=> [["$", "%", "^"], ["3"], ["4", "@"]]
もう一つの例:
gen_products(swap, "bca")
#=> ["34$", "34%", "34^", "[email protected]$", "[email protected]%", "[email protected]^"]
と1以上:ここ
gen_products(swap, "axbycx")
#=> ["$x3y4x", "[email protected]", "%x3y4x", "%[email protected]", "^x3y4x", "^[email protected]"]
swap_all = Hash.new { |_,k| [k] }.merge(swap)
#=> {"a"=>["$", "%", "^"], "b"=>["3"], "c"=>["4", "@"]}
vals = swap_all.values_at(*str.chars)
#=> [["$", "%", "^"], ["x"], ["3"], ["y"], ["4", "@"], ["x"]]
3つのネストされたループ(すべての組み合わせを列挙する)とtr/gsubと呼ばれる最も内側のループでは、これは簡単です(この場合)。 –
一般的な実装を行うことは、少なくとも、些細なことではありませんが、私は認めます。しかし、それを試してみてください。 –
ロビン、私の答えを選んでいただきありがとうございますが、あなたは本当にgreenieを与える前に(おそらく2時間以上)待つべきです。迅速な選択は他の回答を妨げる可能性があり、まだ答えに取り組んでいる他の人には迷惑です。急いではありません。チェックマークを外して後で決定することを検討してください。 –