aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-167/adam-russell/perl/ch-1.pl8
-rw-r--r--challenge-167/adam-russell/perl/ch-2.pl6
-rw-r--r--challenge-167/jaldhar-h-vyas/blog.txt1
-rwxr-xr-xchallenge-167/jaldhar-h-vyas/perl/ch-1.pl46
-rwxr-xr-xchallenge-167/jaldhar-h-vyas/perl/ch-2.pl49
-rwxr-xr-xchallenge-167/jaldhar-h-vyas/raku/ch-1.raku26
-rwxr-xr-xchallenge-167/jaldhar-h-vyas/raku/ch-2.raku45
-rw-r--r--challenge-168/luca-ferrari/blog-1.txt1
-rw-r--r--challenge-168/luca-ferrari/blog-2.txt1
-rw-r--r--challenge-168/luca-ferrari/blog-3.txt1
-rw-r--r--challenge-168/luca-ferrari/blog-4.txt1
-rw-r--r--challenge-168/luca-ferrari/blog-5.txt1
-rw-r--r--challenge-168/luca-ferrari/blog-6.txt1
-rw-r--r--challenge-168/luca-ferrari/postgresql/ch-1.plperl40
-rw-r--r--challenge-168/luca-ferrari/postgresql/ch-1.sql68
-rw-r--r--challenge-168/luca-ferrari/postgresql/ch-2.plperl52
-rw-r--r--challenge-168/luca-ferrari/postgresql/ch-2.sql69
-rwxr-xr-xchallenge-168/luca-ferrari/raku/ch-1.p621
-rwxr-xr-xchallenge-168/luca-ferrari/raku/ch-2.p635
-rw-r--r--challenge-168/mark-anderson/raku/ch-1.raku5
-rw-r--r--challenge-168/mark-anderson/raku/ch-2.raku16
-rw-r--r--challenge-168/peter-campbell-smith/blog.txt1
-rwxr-xr-xchallenge-168/peter-campbell-smith/perl/ch-1.pl45
-rwxr-xr-xchallenge-168/peter-campbell-smith/perl/ch-2.pl42
-rwxr-xr-xchallenge-168/roger-bell-west/javascript/ch-1.js81
-rwxr-xr-xchallenge-168/roger-bell-west/javascript/ch-2.js93
-rw-r--r--challenge-168/roger-bell-west/kotlin/ch-1.kt58
-rw-r--r--challenge-168/roger-bell-west/kotlin/ch-2.kt94
-rwxr-xr-xchallenge-168/roger-bell-west/lua/ch-1.lua102
-rwxr-xr-xchallenge-168/roger-bell-west/lua/ch-2.lua101
-rwxr-xr-xchallenge-168/roger-bell-west/perl/ch-1.pl56
-rwxr-xr-xchallenge-168/roger-bell-west/perl/ch-2.pl80
-rw-r--r--challenge-168/roger-bell-west/postscript/ch-1.ps244
-rw-r--r--challenge-168/roger-bell-west/postscript/ch-2.ps237
-rwxr-xr-xchallenge-168/roger-bell-west/python/ch-1.py52
-rwxr-xr-xchallenge-168/roger-bell-west/python/ch-2.py76
-rwxr-xr-xchallenge-168/roger-bell-west/raku/ch-1.p652
-rwxr-xr-xchallenge-168/roger-bell-west/raku/ch-2.p682
-rwxr-xr-xchallenge-168/roger-bell-west/ruby/ch-1.rb32
-rwxr-xr-xchallenge-168/roger-bell-west/ruby/ch-2.rb37
-rwxr-xr-xchallenge-168/roger-bell-west/rust/ch-1.rs72
-rwxr-xr-xchallenge-168/roger-bell-west/rust/ch-2.rs86
-rw-r--r--challenge-168/ryan-thompson/README.md12
-rw-r--r--challenge-168/ryan-thompson/blog.txt1
-rw-r--r--challenge-168/ryan-thompson/blog1.txt1
-rwxr-xr-xchallenge-168/ryan-thompson/perl/ch-1.pl26
-rwxr-xr-xchallenge-168/ryan-thompson/perl/ch-2.pl29
-rw-r--r--challenge-168/ryan-thompson/raku/ch-1.raku21
-rwxr-xr-xchallenge-168/ryan-thompson/raku/ch-2.raku17
-rw-r--r--challenge-168/wlmb/blog.txt1
-rwxr-xr-xchallenge-168/wlmb/perl/ch-1.pl20
-rwxr-xr-xchallenge-168/wlmb/perl/ch-2.pl15
-rw-r--r--stats/pwc-challenge-167.json510
-rw-r--r--stats/pwc-current.json428
-rw-r--r--stats/pwc-language-breakdown-summary.json64
-rw-r--r--stats/pwc-language-breakdown.json1163
-rw-r--r--stats/pwc-leaders.json812
-rw-r--r--stats/pwc-summary-1-30.json110
-rw-r--r--stats/pwc-summary-121-150.json104
-rw-r--r--stats/pwc-summary-151-180.json42
-rw-r--r--stats/pwc-summary-181-210.json118
-rw-r--r--stats/pwc-summary-211-240.json44
-rw-r--r--stats/pwc-summary-241-270.json40
-rw-r--r--stats/pwc-summary-31-60.json126
-rw-r--r--stats/pwc-summary-61-90.json128
-rw-r--r--stats/pwc-summary-91-120.json102
-rw-r--r--stats/pwc-summary.json588
67 files changed, 4632 insertions, 2106 deletions
diff --git a/challenge-167/adam-russell/perl/ch-1.pl b/challenge-167/adam-russell/perl/ch-1.pl
index 7dda485fdc..4bfd74d9ac 100644
--- a/challenge-167/adam-russell/perl/ch-1.pl
+++ b/challenge-167/adam-russell/perl/ch-1.pl
@@ -7,13 +7,16 @@ use boolean;
use Math::Primality qw/is_prime/;
sub is_circular_prime{
- my($x) = @_;
+ my($x, $circular) = @_;
my @digits = split(//, $x);
+ my @rotations;
for my $i (0 .. @digits - 1){
@digits = (@digits[1 .. @digits - 1], $digits[0]);
my $candidate = join("", @digits) + 0;
+ push @rotations, $candidate;
return false if !is_prime($candidate);
}
+ map{$circular->{$_} = -1} @rotations;
return true;
}
@@ -23,9 +26,8 @@ sub first_n_circular_primes{
my %circular;
my @circular_primes;
{
- if(is_circular_prime($i) && !$circular{join("", sort {$a <=> $b} split(//, $i))}){
+ if(!$circular{$i} && is_circular_prime($i, \%circular)){
push @circular_primes, $i;
- $circular{join("", sort {$a <=> $b} split(//, $i))} = -1;
}
$i++;
redo if @circular_primes < $n;
diff --git a/challenge-167/adam-russell/perl/ch-2.pl b/challenge-167/adam-russell/perl/ch-2.pl
index ba38e6c0dd..6b2214bb1c 100644
--- a/challenge-167/adam-russell/perl/ch-2.pl
+++ b/challenge-167/adam-russell/perl/ch-2.pl
@@ -34,7 +34,7 @@ sub gamma{
}
MAIN:{
- print gamma(3) . "\n";
- print gamma(5) . "\n";
- print gamma(7) . "\n";
+ printf("%.2f\n",gamma(3));
+ printf("%.2f\n",gamma(5));
+ printf("%.2f\n",gamma(7));
} \ No newline at end of file
diff --git a/challenge-167/jaldhar-h-vyas/blog.txt b/challenge-167/jaldhar-h-vyas/blog.txt
new file mode 100644
index 0000000000..401873b45e
--- /dev/null
+++ b/challenge-167/jaldhar-h-vyas/blog.txt
@@ -0,0 +1 @@
+https://www.braincells.com/perl/2022/06/perl_weekly_challenge_week_167.html \ No newline at end of file
diff --git a/challenge-167/jaldhar-h-vyas/perl/ch-1.pl b/challenge-167/jaldhar-h-vyas/perl/ch-1.pl
new file mode 100755
index 0000000000..1f5b9007a9
--- /dev/null
+++ b/challenge-167/jaldhar-h-vyas/perl/ch-1.pl
@@ -0,0 +1,46 @@
+#!/usr/bin/perl
+use 5.030;
+use warnings;
+
+sub isPrime {
+ my ($n) = @_;
+
+ if ($n < 2) {
+ return undef;
+ }
+
+ if ($n == 2) {
+ return 1;
+ }
+
+ for my $i (2 .. sqrt($n)) {
+ if ($n % $i == 0) {
+ return undef;
+ }
+ }
+
+ return 1;
+}
+
+my @circularPrimes;
+my $n = 99;
+
+outer: while (scalar @circularPrimes < 10) {
+ $n++;
+
+ unless ($n =~ /^[1379]+$/) {
+ next;
+ }
+
+ my $rotated = $n;
+ for (0 .. length $n) {
+ unless (isPrime($rotated) && ! grep { $_ == $rotated } @circularPrimes) {
+ next outer;
+ }
+
+ $rotated = substr($rotated, 1) . substr($rotated, 0, 1);
+ }
+ push @circularPrimes, $n;
+}
+
+say join q{, }, @circularPrimes;
diff --git a/challenge-167/jaldhar-h-vyas/perl/ch-2.pl b/challenge-167/jaldhar-h-vyas/perl/ch-2.pl
new file mode 100755
index 0000000000..de90de30ea
--- /dev/null
+++ b/challenge-167/jaldhar-h-vyas/perl/ch-2.pl
@@ -0,0 +1,49 @@
+#!/usr/bin/perl
+use 5.030;
+use warnings;
+use utf8;
+use Math::Complex qw/ Im Re pi /;
+use Math::Round qw/ nearest /;
+use constant ε => 1e-7;
+
+sub dropImaginary {
+ my ($z) = @_;
+
+ if (abs(Im($z)) < ε) {
+ $z = Re($z);
+ }
+
+ return $z;
+}
+
+sub Γ {
+ my ($z) = @_;
+ $z = Math::Complex->new($z);
+
+ if (Re($z) < .5) {
+ return pi / sin(pi * $z) / Γ(1 - $z);
+ } else {
+ my @coefficients = qw/
+ 676.5203681218851
+ -1259.1392167224028
+ 771.32342877765313
+ -176.61502916214059
+ 12.507343278686905
+ -0.13857109526572012
+ 9.9843695780195716e-6
+ 1.5056327351493116e-7
+ /;
+ $z -= 1;
+ my $sum = 0.99999999999980993;
+ my $i = 0;
+ for my $c (@coefficients) {
+ $sum += $c / ($z + 1 + $i++);
+ }
+ my $t = $z + scalar @coefficients - 0.5;
+ return dropImaginary(sqrt(2 * pi) * $t ** ($z + 0.5) * exp(-$t) * $sum);
+ }
+}
+
+for my $i (3, 5, 7) {
+ say nearest(0.01, Γ($i));
+}
diff --git a/challenge-167/jaldhar-h-vyas/raku/ch-1.raku b/challenge-167/jaldhar-h-vyas/raku/ch-1.raku
new file mode 100755
index 0000000000..90f8adb86b
--- /dev/null
+++ b/challenge-167/jaldhar-h-vyas/raku/ch-1.raku
@@ -0,0 +1,26 @@
+#!/usr/bin/raku
+
+sub MAIN() {
+ my @circularPrimes;
+ my $n = 99;
+
+ outer: while @circularPrimes.elems < 10 {
+ $n++;
+
+ unless $n ~~ /^ <[1379]>+ $/ {
+ next;
+ }
+
+ my $rotated = $n;
+ for 0 ..^ $n.chars {
+ unless $rotated.is-prime && $rotated.Int ∉ @circularPrimes {
+ next outer;
+ }
+
+ $rotated = $rotated.substr(1 .. *) ~ $rotated.substr(0, 1);
+ }
+ @circularPrimes.push($n);
+ }
+
+ @circularPrimes.join(q{, }).say;
+} \ No newline at end of file
diff --git a/challenge-167/jaldhar-h-vyas/raku/ch-2.raku b/challenge-167/jaldhar-h-vyas/raku/ch-2.raku
new file mode 100755
index 0000000000..add7e1e8bd
--- /dev/null
+++ b/challenge-167/jaldhar-h-vyas/raku/ch-2.raku
@@ -0,0 +1,45 @@
+#!/usr/bin/raku
+
+sub Γ(Real $n) {
+ my $z = Complex.new($n, 0);
+
+ if $z.re < 0.5 {
+ return pi / sin(pi * $z) / Γ(1 - $z);
+ } else {
+ my @coefficients = <
+ 676.5203681218851
+ -1259.1392167224028
+ 771.32342877765313
+ -176.61502916214059
+ 12.507343278686905
+ -0.13857109526572012
+ 9.9843695780195716e-6
+ 1.5056327351493116e-7
+ >;
+ $z -= 1;
+ my $sum = 0.99999999999980993;
+ my $i = 0;
+ for @coefficients -> $c {
+ $sum += $c / ($z + 1 + $i++);
+ }
+ my $t = $z + @coefficients.elems - 0.5;
+ return dropImaginary(sqrt(2 * pi) * $t ** ($z + 0.5) * exp(-$t) * $sum);
+ }
+}
+
+sub dropImaginary(Complex $n) {
+ constant ε = 1e-7;
+ my $z = $n;
+
+ if $z.im.abs < ε {
+ $z = $z.re;
+ }
+
+ return $z;
+}
+
+sub MAIN() {
+ for (3, 5, 7) -> $i {
+ say Γ($i).round(0.01);
+ }
+} \ No newline at end of file
diff --git a/challenge-168/luca-ferrari/blog-1.txt b/challenge-168/luca-ferrari/blog-1.txt
new file mode 100644
index 0000000000..2b0b3a1caa
--- /dev/null
+++ b/challenge-168/luca-ferrari/blog-1.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task1
diff --git a/challenge-168/luca-ferrari/blog-2.txt b/challenge-168/luca-ferrari/blog-2.txt
new file mode 100644
index 0000000000..a3ce243b5c
--- /dev/null
+++ b/challenge-168/luca-ferrari/blog-2.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task2
diff --git a/challenge-168/luca-ferrari/blog-3.txt b/challenge-168/luca-ferrari/blog-3.txt
new file mode 100644
index 0000000000..e600750e8c
--- /dev/null
+++ b/challenge-168/luca-ferrari/blog-3.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task1plperl
diff --git a/challenge-168/luca-ferrari/blog-4.txt b/challenge-168/luca-ferrari/blog-4.txt
new file mode 100644
index 0000000000..1423018e36
--- /dev/null
+++ b/challenge-168/luca-ferrari/blog-4.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task2plperl
diff --git a/challenge-168/luca-ferrari/blog-5.txt b/challenge-168/luca-ferrari/blog-5.txt
new file mode 100644
index 0000000000..79cafaf9e2
--- /dev/null
+++ b/challenge-168/luca-ferrari/blog-5.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task1plpgsql
diff --git a/challenge-168/luca-ferrari/blog-6.txt b/challenge-168/luca-ferrari/blog-6.txt
new file mode 100644
index 0000000000..65410b3ae8
--- /dev/null
+++ b/challenge-168/luca-ferrari/blog-6.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task2plpgsql
diff --git a/challenge-168/luca-ferrari/postgresql/ch-1.plperl b/challenge-168/luca-ferrari/postgresql/ch-1.plperl
new file mode 100644
index 0000000000..585589ec97
--- /dev/null
+++ b/challenge-168/luca-ferrari/postgresql/ch-1.plperl
@@ -0,0 +1,40 @@
+-- Perl Weekly Challenge 168
+-- Task 1
+
+CREATE SCHEMA IF NOT EXISTS pwc168;
+
+CREATE OR REPLACE FUNCTION
+pwc168.task1_plperl( int )
+RETURNS SETOF bigint
+AS $CODE$
+ my ( $limit ) = @_;
+ $limit //= 13;
+ my @perrin = (3, 0, 2);
+ my $seen = {};
+
+ my $is_prime = sub {
+ my ( $number ) = @_;
+
+ for ( 2 .. $number - 1 ) {
+ return undef if $number % $_ == 0;
+ }
+
+ return 1;
+ };
+
+ while ( $limit > 0 ) {
+ my $current = $perrin[ -2 ] + $perrin[ -3 ];
+ elog( DEBUG, "Limit $n and current is $current" );
+ push @perrin, $current;
+ next if ! $is_prime->( $current );
+ next if $seen->{ $current };
+
+ # found!
+ $seen->{ $current }++;
+ return_next( $current );
+ $limit--;
+ }
+
+return undef;
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-168/luca-ferrari/postgresql/ch-1.sql b/challenge-168/luca-ferrari/postgresql/ch-1.sql
new file mode 100644
index 0000000000..96bda1b3c5
--- /dev/null
+++ b/challenge-168/luca-ferrari/postgresql/ch-1.sql
@@ -0,0 +1,68 @@
+-- Perl Weekly Challenge 168
+-- Task 1
+
+CREATE SCHEMA IF NOT EXISTS pwc168;
+
+CREATE OR REPLACE FUNCTION
+pwc168.is_prime( n bigint )
+RETURNS bool
+AS $CODE$
+DECLARE
+ i bigint;
+BEGIN
+ FOR i IN 2 .. n - 1 LOOP
+ IF n % i = 0 THEN
+ RETURN FALSE;
+ END IF;
+ END LOOP;
+
+ RETURN TRUE;
+END
+$CODE$
+LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION
+pwc168.task1_plpgsql( l bigint default 5000 )
+RETURNS SETOF BIGINT
+AS $CODE$
+DECLARE
+ a bigint;
+ b bigint;
+ c bigint;
+ d bigint;
+BEGIN
+ -- bootstrap
+ a := 3;
+ b := 0;
+ c := 2;
+
+ RETURN NEXT a;
+ RETURN NEXT b;
+ RETURN NEXT c;
+
+ WHILE l > 0 LOOP
+ d := a + b;
+ a := b;
+ b := c;
+ c := d;
+
+ RAISE INFO 'Level % value %', l, c;
+ RETURN NEXT c;
+ l := l - 1;
+ END LOOP;
+
+
+RETURN;
+END
+$CODE$
+LANGUAGE plpgsql;
+
+
+-- use more than 50 to get all the numbers
+-- BUT THIS CAN BE VERY SLOW from 70 and beyond!
+SELECT DISTINCT n
+FROM pwc168.task1_plpgsql( 50 ) n
+WHERE pwc168.is_prime( n )
+ORDER BY 1
+LIMIT 13;
diff --git a/challenge-168/luca-ferrari/postgresql/ch-2.plperl b/challenge-168/luca-ferrari/postgresql/ch-2.plperl
new file mode 100644
index 0000000000..e150136c3e
--- /dev/null
+++ b/challenge-168/luca-ferrari/postgresql/ch-2.plperl
@@ -0,0 +1,52 @@
+-- Perl Weekly Challenge 168
+-- Task 2
+
+CREATE SCHEMA IF NOT EXISTS pwc168;
+
+CREATE OR REPLACE FUNCTION
+pwc168.task2_plperl( int )
+RETURNS int
+AS $CODE$
+
+my ( $value ) = @_;
+
+my $is_prime = sub {
+ my ( $number ) = @_;
+
+ for ( 2 .. $number - 1 ) {
+ return 0 if ( $number % $_ == 0 );
+ }
+
+ return 1;
+};
+
+my $prime_factors = sub {
+ my ( $number ) = @_;
+ my @factors;
+
+ return if $is_prime->( $number );
+
+ for ( 2 .. $number - 1 ) {
+ next if ! $is_prime->( $_ );
+ next if $number % $_ != 0;
+ next if $_ > $number;
+
+ while ( ( $number % $_ ) == 0 ) {
+ push @factors, $_;
+ $number /= $_;
+ }
+ }
+
+ return @factors;
+};
+
+
+my $value = join( '', $prime_factors->( $value ) );
+while ( ! $is_prime->( $value ) ) {
+ $value = join( '', $prime_factors->( $value ) );
+}
+
+return $value;
+
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-168/luca-ferrari/postgresql/ch-2.sql b/challenge-168/luca-ferrari/postgresql/ch-2.sql
new file mode 100644
index 0000000000..c0bffbf930
--- /dev/null
+++ b/challenge-168/luca-ferrari/postgresql/ch-2.sql
@@ -0,0 +1,69 @@
+-- Perl Weekly Challenge 168
+-- Task 2
+
+CREATE SCHEMA IF NOT EXISTS pwc168;
+
+CREATE OR REPLACE FUNCTION
+pwc168.task2_prime_factors( n int )
+RETURNS SETOF int
+AS $CODE$
+DECLARE
+ i int;
+ p bool;
+BEGIN
+
+ FOR i IN 2 .. n - 1 LOOP
+ p := pwc168.is_prime( i );
+
+ IF p AND n % i = 0 THEN
+ WHILE n % i = 0 LOOP
+ n := n / i;
+ RETURN NEXT i;
+ END LOOP;
+ END IF;
+ END LOOP;
+
+RETURN;
+END
+$CODE$
+LANGUAGE plpgsql;
+
+
+/*
+testdb=> select * from pwc168.task2_plpgsql( 10 );
+task2_plpgsql
+---------------
+773
+
+*/
+
+CREATE OR REPLACE FUNCTION
+pwc168.task2_plpgsql( n int DEFAULT 10 )
+RETURNS int
+AS $CODE$
+DECLARE
+ i int;
+ v text;
+ p bool;
+BEGIN
+ v = '0';
+ FOR i IN SELECT * FROM pwc168.task2_prime_factors( n ) LOOP
+ v := v || i;
+ END LOOP;
+
+
+ p := pwc168.is_prime( v::int );
+
+ WHILE NOT p LOOP
+ i := v::int;
+ v = '0';
+ FOR i IN SELECT * FROM pwc168.task2_prime_factors( i ) LOOP
+ v := v || i;
+ END LOOP;
+ p := pwc168.is_prime( v::int );
+ END LOOP;
+
+ RETURN v::int;
+END
+$CODE$
+LANGUAGE plpgsql;
diff --git a/challenge-168/luca-ferrari/raku/ch-1.p6 b/challenge-168/luca-ferrari/raku/ch-1.p6
new file mode 100755
index 0000000000..7059667b9b
--- /dev/null
+++ b/challenge-168/luca-ferrari/raku/ch-1.p6
@@ -0,0 +1,21 @@
+#!raku
+
+# Perl Weekly Challenge 168
+
+sub MAIN( Int $limit where { $limit > 1 } = 13 ) {
+
+ # this requires too much time!
+ # my @perrin = 3, 0, 2, -> $left, $right { $left + $right } ... *;
+ # my @perrin-primes = @perrin.grep( *.is-prime );
+ # @perrin-primes.unique.head( 3 ).join( "\n" ).say;
+
+ my @perrin = 3, 0, 2;
+ my @perrin-primes;
+
+ while ( @perrin-primes.elems < $limit ) {
+ @perrin.push: @perrin[ * - 2 ] + @perrin[ * - 3 ];
+ @perrin-primes.push: @perrin[ * - 1 ] if @perrin[ * - 1 ].is-prime && ! @perrin-primes.grep( @perrin[ * - 1 ] );
+ }
+
+ @perrin-primes.sort.join( "\n" ).say;
+}
diff --git a/challenge-168/luca-ferrari/raku/ch-2.p6 b/challenge-168/luca-ferrari/raku/ch-2.p6
new file mode 100755
index 0000000000..a19f99a7ca
--- /dev/null
+++ b/challenge-168/luca-ferrari/raku/ch-2.p6
@@ -0,0 +1,35 @@
+#!raku
+
+# Perl Weekly Challenge 168
+
+sub prime-factors( Int $n where { $n > 0 } )
+{
+ my $number = $n;
+ my @factors;
+ return $n if $n.is-prime;
+
+ for 2 ..^ $n {
+ next if ! $_.is-prime;
+ next if $number !%% $_;
+ next if $_ > $number;
+
+ while ( $number %% $_ ) {
+ @factors.push: $_;
+ $number /= $_;
+ }
+
+ }
+
+ return @factors;
+}
+
+su