Narcissistic decimal number: Difference between revisions

+ two D entries
m (→‎{{header|REXX}}: adjust numeric digits to handle the largest narcissistic number.)
(+ two D entries)
Line 70:
^C
</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}}==