2023-07-18 13:51:12 -07:00
|
|
|
|
func is_pseudoperfect(n, d = n.divisors.first(-1), s = d.sum, m = d.end) {
|
2023-07-01 11:58:00 -04:00
|
|
|
|
|
|
|
|
|
|
return false if (m < 0)
|
|
|
|
|
|
|
|
|
|
|
|
while (d[m] > n) {
|
|
|
|
|
|
s -= d[m--]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true if (n == s)
|
|
|
|
|
|
return true if (d[m] == n)
|
|
|
|
|
|
|
|
|
|
|
|
__FUNC__(n-d[m], d, s-d[m], m-1) || __FUNC__(n, d, s-d[m], m-1)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func is_weird(n) {
|
2023-07-18 13:51:12 -07:00
|
|
|
|
(n.sigma > 2*n) && !is_pseudoperfect(n)
|
2023-07-01 11:58:00 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var w = (1..Inf -> lazy.grep(is_weird).first(25))
|
|
|
|
|
|
say "The first 25 weird numbers:\n#{w.join(' ')}"
|