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}}== |