Primes - allocate descendants to their ancestors
var maxsum = 99
var primes = maxsum.primes
var descendants = (maxsum+1).of { [] }
var ancestors = (maxsum+1).of { [] }
for p in (primes) {
descendants[p] << p
for s in (1 .. descendants.end-p) {
descendants[s + p] << descendants[s].map {|q| p*q }...
}
}
for p in (primes + [4]) {
descendants[p].pop
}
var total = 0
for s in (1 .. maxsum) {
descendants[s].sort!
total += (var dsclen = descendants[s].len)
var idx = descendants[s].first_index {|x| x > maxsum }
for d in (descendants[s].first(idx+1)) {
ancestors[d] = (ancestors[s] + [s])
}
if ((s <= 20) || (s ~~ [46, 74, 99])) {
printf("%2d: %d Ancestor(s): %-15s %5s Descendant(s): %s\n", s,
ancestors[s].len, "[#{ancestors[s].join(' ')}]", descendants[s].len,
dsclen <= 10 ? descendants[s] : "[#{descendants[s].first(10).join(' ')} ...]")
}
}
say "\nTotal descendants: #{total}"Output:
Last updated
Was this helpful?