#(Ruby 1.9+) counting_numbers = Enumerator.new do |yielder| (0..1.0/0).each do |number| yielder.yield number end end def trans_mult(transa, transb) trans_ret = Array.new 0.upto(transa.length-1) do |index| trans_ret.push(transa[transb[index]]) end return trans_ret end def lolipop(trans) trans_hash ={} trans_hash[trans.clone] =0 index = 1 trans_current = trans_mult(trans, trans) while trans_hash[trans_current] == nil trans_hash[trans_current.clone] = index # puts trans_current.inspect index = index +1 trans_current = trans_mult(trans_current, trans) end cycle_length =trans_hash.size - trans_hash[trans_current] return [trans_hash.size, cycle_length] end 1.upto(10) do |index| tran_size =index histo_hash = {} counting_numbers.take(tran_size).repeated_permutation(tran_size).each { |x| size, cycle_length = lolipop(x) #tail_length = size-cycle_length if (histo_hash[cycle_length] == nil) histo_hash[cycle_length] =1 else histo_hash[cycle_length] = histo_hash[cycle_length]+1 end } puts "#{tran_size}|" + histo_hash.inspect end