Magnanimous numbers: Difference between revisions

Add Factor
m (Task clarifiction)
(Add Factor)
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}}==
1,827

edits