Niven Numbers in Perl and Javascript
The Problem
Print all the niven numbers from 0 to 50 inclusive, each on their own line. A niven number is a non-negative number that is divisible by the sum of its digits.
Discussion
n % 0
included n / 0
, which is bad. So, despite 0 to 50 inclusive, I’m starting at one.
Perl
#!/usr/bin/env perl
use feature qw{ say };
use strict;
use warnings;
use List::Util qw{sum};
for my $i ( 1 .. 50 ) {
my @j = split //, $i; # split the number into characters
my $k = sum @j; # Perl doesn't overload operators,
# but overloads types, so if you do
# a math operation on a scalar, it
# finds the most number-like
# interpretation of that scalar
my $l = $i % $k == 0; # true if it divides evenly.
say $i if $l; # say if true
# we COULD combine these two
}
1
2
3
4
5
6
7
8
9
10
12
18
20
21
24
27
30
36
40
42
45
48
50
Javascript
"use strict;";
console.log(
Array(50) // a 50-element array
.fill() // touch everything so we can map it
.map((n, i) => 1 + i) // and make it [1,2,3,4...]
.filter(n => {
let o = n
.toString()
.split("")
.map(v => 0 + parseInt(v))
.reduce((a, v) => (a += 0 + parseInt(v)));
let p = n % o == 0;
return p;
})
);
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 18, 20, 21, 24, 27, 30, 36, 40, 42, 45, 48, 50 ]
If you have any questions or comments, I would be glad to hear it. Ask me on Twitter or make an issue on my blog repo.