Narcissistic decimal number: Difference between revisions

Content added Content deleted
m (→‎{{header|REXX}}: adjust numeric digits to handle the largest narcissistic number.)
(+ two D entries)
Line 70: Line 70:
^C
^C
</pre>
</pre>

=={{header|D}}==
===Simple Version===
<lang d>void main() {
import std.stdio, std.algorithm, std.conv, std.range;

immutable isNarcissistic = (in uint n) pure =>
n.text.map!(d => (d - '0') ^^ n.text.length).sum == n;
writefln("%(%(%d %)\n%)",
uint.max.iota.filter!isNarcissistic.take(25).chunks(5));
}</lang>
{{out}}
<pre>0 1 2 3 4
5 6 7 8 9
153 370 371 407 1634
8208 9474 54748 92727 93084
548834 1741725 4210818 9800817 9926315</pre>

===Faster Version===
<lang d>import std.stdio, std.algorithm, std.range, std.array;

uint[] narcissists(in uint m) pure nothrow {
typeof(return) result;

foreach (immutable uint digits; 0 .. 10) {
const digitPowers = 10.iota.map!(i => i ^^ digits).array;

foreach (immutable n; 10 ^^ (digits - 1) .. 10 ^^ digits) {
uint div = n, digitPSum;
while (div) {
digitPSum += digitPowers[div % 10];
div /= 10;
}

if (n == digitPSum) {
result ~= n;
if (result.length >= m)
return result;
}
}
}

assert(0);
}

void main() {
writefln("%(%(%d %)\n%)", 25.narcissists.chunks(5));
}</lang>
With LDC2 compiler prints the same output in less than 0.3 seconds.


=={{header|Perl 6}}==
=={{header|Perl 6}}==