19/02/12 21:33:58.92 4uAoJeXz.net
>>99 Ruby
def hoge(str)
return str if str.match?(/\A[^{}\/]*\z/)
raise 'ERROR' if str.match?(/\A[^{]*}|{[^}]*\z/)
a, *b = str.scan(/(?<={|\A)[^{}]*(?=}|\z)/).map{|s| s.empty? ? [''] : s.split(?/)}
s = str.gsub(/(?:{|\A)[^{}]*(?:}|\z)/, '%s')
a.product(*b).flat_map{|e| hoge(s % e)}.uniq.sort
end
%w[
{あ{いう/え}/お{か/き}/く}け{こ}
さ{し/す}せそ{{た/ち}つ/て}と]
].each{|s| puts hoge(s), $/}
# =>
あいうけこ
あえけこ
おかけこ
おきけこ
くけこ
さしせそたつと
さしせそちつと
さしせそてと
さすせそたつと
さすせそちつと
さすせそてと