From a1012b9953048fbd0ab246b90745d34191592aaf Mon Sep 17 00:00:00 2001 From: arnesom Date: Sat, 4 Nov 2023 20:24:34 +0100 Subject: Arne Sommer --- challenge-241/arne-sommer/blog.txt | 1 + challenge-241/arne-sommer/raku/arithmetic-triplets | 29 +++++++++++++++++++ challenge-241/arne-sommer/raku/ch-1.raku | 29 +++++++++++++++++++ challenge-241/arne-sommer/raku/ch-2.raku | 33 ++++++++++++++++++++++ challenge-241/arne-sommer/raku/prime-order | 33 ++++++++++++++++++++++ 5 files changed, 125 insertions(+) create mode 100644 challenge-241/arne-sommer/blog.txt create mode 100755 challenge-241/arne-sommer/raku/arithmetic-triplets create mode 100755 challenge-241/arne-sommer/raku/ch-1.raku create mode 100755 challenge-241/arne-sommer/raku/ch-2.raku create mode 100755 challenge-241/arne-sommer/raku/prime-order diff --git a/challenge-241/arne-sommer/blog.txt b/challenge-241/arne-sommer/blog.txt new file mode 100644 index 0000000000..e134c67cdc --- /dev/null +++ b/challenge-241/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/arithmetic-prime.html diff --git a/challenge-241/arne-sommer/raku/arithmetic-triplets b/challenge-241/arne-sommer/raku/arithmetic-triplets new file mode 100755 index 0000000000..9f4d5056fc --- /dev/null +++ b/challenge-241/arne-sommer/raku/arithmetic-triplets @@ -0,0 +1,29 @@ +#! /usr/bin/env raku + +unit sub MAIN ($diff where $diff ~~ UInt && $diff > 0, + *@nums where @nums.elems > 2 && all(@nums) ~~ Int && ( [<] @nums ), + :v(:$verbose)); + +my $end = @nums.end; +my $triplets = 0; + +for 0 .. $end -2 -> $i +{ + for $i+1 .. $end -1 -> $j + { + for $j+1 .. $end -> $k + { + if $diff == @nums[$j] - @nums[$i] == @nums[$k] - @nums[$j] + { + $triplets++; + say ":Indices: $i,$j,$k -> values: @nums[$i],@nums[$j],@nums[$k] [triplet]" if $verbose; + } + elsif $verbose + { + say ":Indices: $i,$j,$k -> values: @nums[$i],@nums[$j],@nums[$k]"; + } + } + } +} + +say $triplets; diff --git a/challenge-241/arne-sommer/raku/ch-1.raku b/challenge-241/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..9f4d5056fc --- /dev/null +++ b/challenge-241/arne-sommer/raku/ch-1.raku @@ -0,0 +1,29 @@ +#! /usr/bin/env raku + +unit sub MAIN ($diff where $diff ~~ UInt && $diff > 0, + *@nums where @nums.elems > 2 && all(@nums) ~~ Int && ( [<] @nums ), + :v(:$verbose)); + +my $end = @nums.end; +my $triplets = 0; + +for 0 .. $end -2 -> $i +{ + for $i+1 .. $end -1 -> $j + { + for $j+1 .. $end -> $k + { + if $diff == @nums[$j] - @nums[$i] == @nums[$k] - @nums[$j] + { + $triplets++; + say ":Indices: $i,$j,$k -> values: @nums[$i],@nums[$j],@nums[$k] [triplet]" if $verbose; + } + elsif $verbose + { + say ":Indices: $i,$j,$k -> values: @nums[$i],@nums[$j],@nums[$k]"; + } + } + } +} + +say $triplets; diff --git a/challenge-241/arne-sommer/raku/ch-2.raku b/challenge-241/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..5c742c8030 --- /dev/null +++ b/challenge-241/arne-sommer/raku/ch-2.raku @@ -0,0 +1,33 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@int where all(@int) ~~ UInt && all(@int) > 0 && @int.elems == @int.unique.elems > 2, :v(:$verbose)); + +my %factor-count; + +for @int -> $int +{ + my @factors = factors($int); + %factor-count{$int} = @factors.elems; + say ":Int $int -> factors: { @factors.join(",") } -> count: { @factors.elems }" if $verbose; +} + +say @int.sort({ %factor-count{$^a} <=> %factor-count{$^b} || $^b <=> $^a }); + +sub factors ($number is copy) +{ + return (1) if $number == 1; + return ($number) if $number.is-prime; + + my @factors; + + for (2 .. $number div 2).grep( *.is-prime) -> $candidate + { + while $number %% $candidate + { + @factors.push: $candidate; + $number /= $candidate; + } + } + + return @factors; +} diff --git a/challenge-241/arne-sommer/raku/prime-order b/challenge-241/arne-sommer/raku/prime-order new file mode 100755 index 0000000000..5c742c8030 --- /dev/null +++ b/challenge-241/arne-sommer/raku/prime-order @@ -0,0 +1,33 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@int where all(@int) ~~ UInt && all(@int) > 0 && @int.elems == @int.unique.elems > 2, :v(:$verbose)); + +my %factor-count; + +for @int -> $int +{ + my @factors = factors($int); + %factor-count{$int} = @factors.elems; + say ":Int $int -> factors: { @factors.join(",") } -> count: { @factors.elems }" if $verbose; +} + +say @int.sort({ %factor-count{$^a} <=> %factor-count{$^b} || $^b <=> $^a }); + +sub factors ($number is copy) +{ + return (1) if $number == 1; + return ($number) if $number.is-prime; + + my @factors; + + for (2 .. $number div 2).grep( *.is-prime) -> $candidate + { + while $number %% $candidate + { + @factors.push: $candidate; + $number /= $candidate; + } + } + + return @factors; +} -- cgit