Jump to content

Wasteful, equidigital and frugal numbers: Difference between revisions

m
→‎{{header|Raku}}: DRY, factor out common code, add caching, efficiency tweaks, more alliterative naming.
(Added Perl)
m (→‎{{header|Raku}}: DRY, factor out common code, add caching, efficiency tweaks, more alliterative naming.)
Line 312:
use Lingua::EN::Numbers;
 
my %cache;
sub frugal ($n, $base = 10) { ($n > 1) && $n.base($base).chars > sum $n.&prime-factors.Bag.map: { .key.base($base).chars + (.value > 1 ?? .value.base($base).chars !! 0) } }
 
sub equidigital ($n, $base = 10) { ($n == 1) || $n.base($base).chars == sum $n.&prime-factors.Bag.map: { .key.base($base).chars + (.value > 1 ?? .value.base($base).chars !! 0) } }
sub wasteful factor-char-sum ($n, $base = 10) { $n.base($base).chars < sum $n.&prime-factors.Bag.map: { .key.base($base).chars + (.value > 1 ?? .value.base($base).chars !! 0) } }
 
sub frugal economical ($n, $base = 10) { ($n > 1) && $n.base($base).chars > sum (%cache{$n.&prime-factors.Bag.map: { .key.base(}[$base).charsn] +//= (.valuefactor-char-sum >$n, 1 ?? .value.base($base).chars !! 0) } }
sub equidigital ($n, $base = 10) { ($n == 1) || $n.base($base).chars == sum (%cache{$n.&prime-factors.Bag.map: { .key.base(}[$base).charsn] +//= (.valuefactor-char-sum >$n, 1 ?? .value.base($base).chars !! 0) } }
sub extravagant ($n, $base = 10) { $n.base($base).chars < (%cache{$base}[$n] //= factor-char-sum $n, $base) }
 
 
for 10, 11 -> $base {
%cache{$base}[3e6] = Any; # preallocate to avoid concurrency issues
say "\nIn Base $base:";
for &wastefulextravagant, &equidigital, &frugaleconomical -> &sub {
say "\nFirst 50 {&sub.name} numbers:";
say (^∞).grep( {.&sub($base)} )[^50].batch(10)».&comma».fmt("%6s").join: "\n";
Line 326 ⟶ 331:
 
my $upto = 1e6.Int;
my atomicint ($Wastefulextravagant, $Equidigitalequidigital, $Frugaleconomical);
say "\nOf the positive integers up to {$upto.&cardinal} :";
(1..^$upto).race(:5000batch).map: { .&frugalextravagant($base) ?? ++⚛$Frugalextravagant !! .&equidigital($base) ?? ++⚛$Equidigitalequidigital !! ++⚛$Wastefuleconomical };
say " WastefulExtravagant: {comma $Wastefulextravagant}\nEquidigitaln Equidigital: {comma $Equidigitalequidigital}\n FrugalEconomical: {comma $Frugaleconomical}";
%cache{$base} = Empty;
}</lang>
{{out}}
<pre>In Base 10:
 
First 50 wastefulextravagant numbers:
4 6 8 9 12 18 20 22 24 26
28 30 33 34 36 38 39 40 42 44
Line 350 ⟶ 356:
10,000th: 33,769
 
First 50 frugaleconomical numbers:
125 128 243 256 343 512 625 729 1,024 1,029
1,215 1,250 1,280 1,331 1,369 1,458 1,536 1,681 1,701 1,715
Line 359 ⟶ 365:
 
Of the positive integers up to one million :
Wasteful Extravagant: 831,231
Equidigital: 165,645
FrugalEconomical: 3,123
 
In Base 11:
 
First 50 wastefulextravagant numbers:
4 6 8 9 10 12 18 20 22 24
26 28 30 33 34 36 38 39 40 42
Line 381 ⟶ 387:
10,000th: 33,203
 
First 50 frugaleconomical numbers:
125 128 243 256 343 512 625 729 1,024 1,331
1,369 1,458 1,536 1,681 1,701 1,715 1,792 1,849 1,875 2,048
Line 390 ⟶ 396:
 
Of the positive integers up to one million :
Wasteful Extravagant: 795,861
Equidigital: 200,710
FrugalEconomical: 3,428</pre>
 
=={{header|Wren}}==
10,333

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.