( @spickermann)
# 1
array = [1,2,3]
n = 4
arr = array.product(*[array]*(n-1)).map { |arr| arr.reduce(:*) }
arr.size
arr.each { |e| puts e }
1
2
3
2
4
6
3
6
9
...
54
27
54
81
, map each arr.reduce(:*) puts arr.reduce(:*).
# 2
sz = array.size
(0...sz**n).map { |i| i.to_s(sz)
.rjust(n,'_')
.chars
.reduce(1) { |t,e| t * (e=='_' ? 1 : array[e.to_i]) }
}