From: Gregory Seidman Date: 2006-12-07T22:45:33+09:00 Subject: Re: [Puzzle] How to do parameter variation? On Thu, Dec 07, 2006 at 04:25:43PM +0900, Gary Boone wrote: } } Suppose you want to do several runs of a program or function, varying } the parameters each time. You start with a hash of parameter lists: } } params = { speed=>[1,2,3], beta=>[0.1, 0.002, 0.4], x=>['a', 'b'] } } } Given this set, you'll call the test function 18 times: } } test_function( {speed=>1, beta=>0.1, x=>'a'} ) } test_function( {speed=>1, beta=>0.1, x=>'b'} ) } test_function( {speed=>1, beta=>0.002, x=>'a'} ) } ... etc } } So the puzzle is how to take the original params list and generate a } list of all the combinations of the parameters? The resulting parameter } sets will be passed one at a time to the function as shown above. } } Notes: } - I used hashes and lists to explain the problem. Maybe there's a better } way. } - You don't know how many parameters will be given. } - The number of values for each parameter is unknown in advance. } - The parameters have different types, as shown above. Each parameter's } values are all the same type, though. params = { :speed => [1,2,3], :beta => [0.1, 0.002, 0.4], :x => ['a', 'b'] } all = params.inject([{}]) do |perms,(k,list)| perms.inject([]) do |expanded,base| list.each do |v| expanded << base.merge(k => v) end expanded end end require 'yaml' puts all.size puts all.to_yaml --Greg