Magnanimous numbers: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (Task clarifiction) |
(Add Factor) |
||
Line 31: | Line 31: | ||
=={{header|Factor}}== |
|||
{{works with|Factor|0.99 2020-01-23}} |
|||
<lang factor>USING: arrays grouping io kernel lists lists.lazy |
|||
lists.lazy.examples math math.parser math.primes math.ranges |
|||
prettyprint sequences ; |
|||
! Optimization for numbers > 1001; |
|||
! first and last digits must have opposite parity. |
|||
! Thanks to Raku entry for this. |
|||
: mixed-parity? ( str -- ? ) |
|||
[ first even? ] [ last even? xor ] bi ; |
|||
: >stringy ( l -- l ) [ number>string ] lmap-lazy ; |
|||
: 1001- ( -- l ) naturals [ 1002 < ] lwhile >stringy ; |
|||
: 1002+ ( -- l ) 1002 lfrom >stringy [ mixed-parity? ] lfilter ; |
|||
: candidates ( -- l ) 1001- 1002+ lappend-lazy ; |
|||
: (magnanimous?) ( str -- ? ) |
|||
dup length 1 - [1,b] [ cut 2array ] with map |
|||
[ [ string>number ] map-sum ] map [ prime? ] all? ; |
|||
: magnanimous? ( str -- ? ) |
|||
dup length 1 = [ drop t ] [ (magnanimous?) ] if ; |
|||
: magnanimous ( -- l ) candidates [ magnanimous? ] lfilter ; |
|||
: show ( seq from to -- ) rot subseq 15 group simple-table. nl ; |
|||
400 magnanimous ltake list>array |
|||
[ "First 45 magnanimous numbers" print 0 45 show ] |
|||
[ "241st through 250th magnanimous numbers" print 240 250 show ] |
|||
[ "391st through 400th magnanimous numbers" print 390 400 show ] |
|||
tri</lang> |
|||
{{out}} |
|||
<pre> |
|||
First 45 magnanimous numbers |
|||
0 1 2 3 4 5 6 7 8 9 11 12 14 16 20 |
|||
21 23 25 29 30 32 34 38 41 43 47 49 50 52 56 |
|||
58 61 65 67 70 74 76 83 85 89 92 94 98 101 110 |
|||
241st through 250th magnanimous numbers |
|||
17992 19972 20209 20261 20861 22061 22201 22801 22885 24407 |
|||
391st through 400th magnanimous numbers |
|||
486685 488489 515116 533176 551558 559952 595592 595598 600881 602081 |
|||
</pre> |
|||
=={{header|Raku}}== |
=={{header|Raku}}== |