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?