diff options
| -rw-r--r-- | challenge-159/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-159/arne-sommer/raku/ch-1.raku | 22 | ||||
| -rwxr-xr-x | challenge-159/arne-sommer/raku/ch-2.raku | 39 | ||||
| -rwxr-xr-x | challenge-159/arne-sommer/raku/farey-sequence | 22 | ||||
| -rwxr-xr-x | challenge-159/arne-sommer/raku/moebius-number | 39 |
5 files changed, 123 insertions, 0 deletions
diff --git a/challenge-159/arne-sommer/blog.txt b/challenge-159/arne-sommer/blog.txt new file mode 100644 index 0000000000..4742664056 --- /dev/null +++ b/challenge-159/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/farey-moebius.html diff --git a/challenge-159/arne-sommer/raku/ch-1.raku b/challenge-159/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..16f3d4dcca --- /dev/null +++ b/challenge-159/arne-sommer/raku/ch-1.raku @@ -0,0 +1,22 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $n where $n > 0, :v(:$verbose)); + +my @fs = (0/1, 1/1); + +for 1 .. $n -1 -> $numerator +{ + for $numerator +1 .. $n -> $denominator + { + @fs.push: $numerator/$denominator; + } +} + +if $verbose +{ + say ":Unsorted: { @fs.join(", ") }"; + say ":Unsorted x/y: { @fs.map( *.nude.join("/") ).join(", ") }"; + say ":Sorted x/y: { @fs.sort.map( *.nude.join("/") ).join(", ") }"; +} + +@fs.sort.unique.map( *.nude.join("/") ).join(", ").say; diff --git a/challenge-159/arne-sommer/raku/ch-2.raku b/challenge-159/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..78db0dcae1 --- /dev/null +++ b/challenge-159/arne-sommer/raku/ch-2.raku @@ -0,0 +1,39 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $n where $n > 0, :v(:$verbose)); + +my @prime-factors = factors($n, :include-one); + +say ": Factor count: { @prime-factors.elems } (Factors: { @prime-factors.join(", ")})" if $verbose; + +if @prime-factors.repeated.elems +{ + say 0; +} +else +{ + say @prime-factors.elems %% 2 ?? -1 !! 1; +} + +sub factors ($number is copy, :$include-one) +{ + return (1) if $number == 1; + + if $number.is-prime + { + return :$include-one ?? (1, $number) !! ($number); + } + + my @factors = $include-one ?? 1 !! (); + + for (2 .. $number div 2).grep( *.is-prime ) -> $candidate + { + while $number %% $candidate + { + @factors.push: $candidate; + $number /= $candidate; + } + } + + return @factors; +} diff --git a/challenge-159/arne-sommer/raku/farey-sequence b/challenge-159/arne-sommer/raku/farey-sequence new file mode 100755 index 0000000000..16f3d4dcca --- /dev/null +++ b/challenge-159/arne-sommer/raku/farey-sequence @@ -0,0 +1,22 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $n where $n > 0, :v(:$verbose)); + +my @fs = (0/1, 1/1); + +for 1 .. $n -1 -> $numerator +{ + for $numerator +1 .. $n -> $denominator + { + @fs.push: $numerator/$denominator; + } +} + +if $verbose +{ + say ":Unsorted: { @fs.join(", ") }"; + say ":Unsorted x/y: { @fs.map( *.nude.join("/") ).join(", ") }"; + say ":Sorted x/y: { @fs.sort.map( *.nude.join("/") ).join(", ") }"; +} + +@fs.sort.unique.map( *.nude.join("/") ).join(", ").say; diff --git a/challenge-159/arne-sommer/raku/moebius-number b/challenge-159/arne-sommer/raku/moebius-number new file mode 100755 index 0000000000..78db0dcae1 --- /dev/null +++ b/challenge-159/arne-sommer/raku/moebius-number @@ -0,0 +1,39 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $n where $n > 0, :v(:$verbose)); + +my @prime-factors = factors($n, :include-one); + +say ": Factor count: { @prime-factors.elems } (Factors: { @prime-factors.join(", ")})" if $verbose; + +if @prime-factors.repeated.elems +{ + say 0; +} +else +{ + say @prime-factors.elems %% 2 ?? -1 !! 1; +} + +sub factors ($number is copy, :$include-one) +{ + return (1) if $number == 1; + + if $number.is-prime + { + return :$include-one ?? (1, $number) !! ($number); + } + + my @factors = $include-one ?? 1 !! (); + + for (2 .. $number div 2).grep( *.is-prime ) -> $candidate + { + while $number %% $candidate + { + @factors.push: $candidate; + $number /= $candidate; + } + } + + return @factors; +} |
