From aa24badfe0a5dadbc982525d6c00f8bfb201533a Mon Sep 17 00:00:00 2001 From: Arne Sommer Date: Fri, 1 Nov 2024 21:06:40 +0100 Subject: Arne Sommer --- challenge-293/arne-sommer/blog.txt | 1 + challenge-293/arne-sommer/raku/boomerang | 27 ++++++++++++++++++++++++++ challenge-293/arne-sommer/raku/ch-1.raku | 20 +++++++++++++++++++ challenge-293/arne-sommer/raku/ch-2.raku | 27 ++++++++++++++++++++++++++ challenge-293/arne-sommer/raku/similar-dominos | 20 +++++++++++++++++++ 5 files changed, 95 insertions(+) create mode 100644 challenge-293/arne-sommer/blog.txt create mode 100755 challenge-293/arne-sommer/raku/boomerang create mode 100755 challenge-293/arne-sommer/raku/ch-1.raku create mode 100755 challenge-293/arne-sommer/raku/ch-2.raku create mode 100755 challenge-293/arne-sommer/raku/similar-dominos diff --git a/challenge-293/arne-sommer/blog.txt b/challenge-293/arne-sommer/blog.txt new file mode 100644 index 0000000000..3426b194fb --- /dev/null +++ b/challenge-293/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/boomerang-similar.html diff --git a/challenge-293/arne-sommer/raku/boomerang b/challenge-293/arne-sommer/raku/boomerang new file mode 100755 index 0000000000..ee0b5319a5 --- /dev/null +++ b/challenge-293/arne-sommer/raku/boomerang @@ -0,0 +1,27 @@ +#! /usr/bin/env raku + +subset POINT where { /^ \d+ \, \s? \d+ $/ }; + +unit sub MAIN (POINT $point1, POINT $point2, POINT $point3, :v(:$verbose)); + +my @point1 = $point1.split(/\,\s?/); +my @point2 = $point2.split(/\,\s?/); +my @point3 = $point3.split(/\,\s?/); + +say ": Points: [{ @point1.join(",") }], [{ @point2.join(",") }], [{ @point3.join(",") }]" if $verbose; + +my @vector12 = ( @point2[0] - @point1[0], @point2[1] - @point1[1] ); +my @vector13 = ( @point3[0] - @point1[0], @point3[1] - @point1[1] ); + +say ": Vectors: [{ @vector12.join(",") }], [{ @vector13.join(",") }]" if $verbose; + +if (@vector12[0] == @vector13[0] == 0 || @vector12[1] == @vector13[1] == 0) +{ + say ": Both vectors are on one of the axis, and thus equal)" if $verbose; + say False; + exit; +} + +say ": Delta x: { @vector12[0] / @vector13[0] } { ( @vector12[0] / @vector13[0] == @vector12[1] / @vector13[1] ) ?? "==" !! "<>" } Delta y: { @vector12[1] / @vector13[1] }" if $verbose; + +say ! (@vector12[0] / @vector13[0] == @vector12[1] / @vector13[1]); diff --git a/challenge-293/arne-sommer/raku/ch-1.raku b/challenge-293/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..6d8f9dd94f --- /dev/null +++ b/challenge-293/arne-sommer/raku/ch-1.raku @@ -0,0 +1,20 @@ +#! /usr/bin/env raku + +unit sub MAIN ($dominoes, :s(:$six), :v(:$verbose)); + +subset DOMINOES6 where { /^ <[0 .. 6]> ** 2 $/ }; +subset DOMINOES9 where { /^ <[0 .. 9]> ** 2 $/ }; + +say ": Legal values: 0 .. { $six ?? "6" !! "9" }" if $verbose; + +my @dominoes = $dominoes.words.map({ $_ > $_.flip ?? $_.flip !! $_}); + +say ": Dominoes (normalised): @dominoes[]" if $verbose; + +die "Illegal value(s) in the input; digits 0-{ $six ?? "6" !! "9" } only" unless all(@dominoes) ~~ ( $six ?? DOMINOES6 !! DOMINOES9 ); + +my $bag = @dominoes.Bag.grep( *.value > 1); + +say ": Bag (of duplicates): { $bag.raku }" if $verbose; + +say $bag>>.value.sum; diff --git a/challenge-293/arne-sommer/raku/ch-2.raku b/challenge-293/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..ee0b5319a5 --- /dev/null +++ b/challenge-293/arne-sommer/raku/ch-2.raku @@ -0,0 +1,27 @@ +#! /usr/bin/env raku + +subset POINT where { /^ \d+ \, \s? \d+ $/ }; + +unit sub MAIN (POINT $point1, POINT $point2, POINT $point3, :v(:$verbose)); + +my @point1 = $point1.split(/\,\s?/); +my @point2 = $point2.split(/\,\s?/); +my @point3 = $point3.split(/\,\s?/); + +say ": Points: [{ @point1.join(",") }], [{ @point2.join(",") }], [{ @point3.join(",") }]" if $verbose; + +my @vector12 = ( @point2[0] - @point1[0], @point2[1] - @point1[1] ); +my @vector13 = ( @point3[0] - @point1[0], @point3[1] - @point1[1] ); + +say ": Vectors: [{ @vector12.join(",") }], [{ @vector13.join(",") }]" if $verbose; + +if (@vector12[0] == @vector13[0] == 0 || @vector12[1] == @vector13[1] == 0) +{ + say ": Both vectors are on one of the axis, and thus equal)" if $verbose; + say False; + exit; +} + +say ": Delta x: { @vector12[0] / @vector13[0] } { ( @vector12[0] / @vector13[0] == @vector12[1] / @vector13[1] ) ?? "==" !! "<>" } Delta y: { @vector12[1] / @vector13[1] }" if $verbose; + +say ! (@vector12[0] / @vector13[0] == @vector12[1] / @vector13[1]); diff --git a/challenge-293/arne-sommer/raku/similar-dominos b/challenge-293/arne-sommer/raku/similar-dominos new file mode 100755 index 0000000000..6d8f9dd94f --- /dev/null +++ b/challenge-293/arne-sommer/raku/similar-dominos @@ -0,0 +1,20 @@ +#! /usr/bin/env raku + +unit sub MAIN ($dominoes, :s(:$six), :v(:$verbose)); + +subset DOMINOES6 where { /^ <[0 .. 6]> ** 2 $/ }; +subset DOMINOES9 where { /^ <[0 .. 9]> ** 2 $/ }; + +say ": Legal values: 0 .. { $six ?? "6" !! "9" }" if $verbose; + +my @dominoes = $dominoes.words.map({ $_ > $_.flip ?? $_.flip !! $_}); + +say ": Dominoes (normalised): @dominoes[]" if $verbose; + +die "Illegal value(s) in the input; digits 0-{ $six ?? "6" !! "9" } only" unless all(@dominoes) ~~ ( $six ?? DOMINOES6 !! DOMINOES9 ); + +my $bag = @dominoes.Bag.grep( *.value > 1); + +say ": Bag (of duplicates): { $bag.raku }" if $verbose; + +say $bag>>.value.sum; -- cgit From 4ab4ed913afac1651b20692cf4a9d3a58805487f Mon Sep 17 00:00:00 2001 From: Arne Sommer Date: Sat, 9 Nov 2024 17:15:38 +0100 Subject: Arne Sommer --- challenge-294/arne-sommer/blog.txt | 1 + challenge-294/arne-sommer/raku/ch-1.raku | 24 +++++++++++++++ challenge-294/arne-sommer/raku/ch-2.raku | 36 ++++++++++++++++++++++ .../arne-sommer/raku/consecutive-sequence | 24 +++++++++++++++ challenge-294/arne-sommer/raku/next-permutation | 34 ++++++++++++++++++++ .../arne-sommer/raku/next-permutation-sort | 36 ++++++++++++++++++++++ 6 files changed, 155 insertions(+) create mode 100644 challenge-294/arne-sommer/blog.txt create mode 100755 challenge-294/arne-sommer/raku/ch-1.raku create mode 100755 challenge-294/arne-sommer/raku/ch-2.raku create mode 100755 challenge-294/arne-sommer/raku/consecutive-sequence create mode 100755 challenge-294/arne-sommer/raku/next-permutation create mode 100755 challenge-294/arne-sommer/raku/next-permutation-sort diff --git a/challenge-294/arne-sommer/blog.txt b/challenge-294/arne-sommer/blog.txt new file mode 100644 index 0000000000..2811ec517a --- /dev/null +++ b/challenge-294/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/next-consecutive.html diff --git a/challenge-294/arne-sommer/raku/ch-1.raku b/challenge-294/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..91cef091b7 --- /dev/null +++ b/challenge-294/arne-sommer/raku/ch-1.raku @@ -0,0 +1,24 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@ints where all(@ints) ~~ Int && @ints.elems > 0, :v(:$verbose)); + +my @sorted = @ints.sort; +my @unique = @sorted.unique; + +say ": Sorted: @sorted[]" if $verbose; +say ": Unique: @unique[]" if $verbose; + +my $current = @unique.shift; +my $count = 1; +my $max = 1; + +for @unique -> $next +{ + $count++ if $current +1 == $next; + + $max = $count if $count > $max; + + $current = $next; +} + +say $max == 1 ?? -1 !! $max; diff --git a/challenge-294/arne-sommer/raku/ch-2.raku b/challenge-294/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..24356f8d8d --- /dev/null +++ b/challenge-294/arne-sommer/raku/ch-2.raku @@ -0,0 +1,36 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@ints where all(@ints) ~~ Int && @ints.elems > 1, + :f(:$fast-fail), + :v(:$verbose)); + +my @a = @ints>>.Int; + +if $fast-fail && [>=] @a { say -1; exit } + +my $end = @a.end; + +for $end ... 1 -> $i +{ + for $i -1 ... 0 -> $j + { + if @a[$i] > @a[$j] + { + say ": index:$i -> @a[$i], index:$j -> @a[$j] (swap)" if $verbose; + my $n = @a[$i]; + @a[$i] = @a[$j]; + @a[$j] = $n; + + @a[$j+1 .. *] = @a[$j+1 .. *].sort if $i > $j +1; + + say "({ @a.join(", ") })"; + exit; + } + elsif $verbose + { + say ": index:$i -> @a[$i], index:$j -> @a[$j] (skip)" if $verbose; + } + } +} + +say "-1"; diff --git a/challenge-294/arne-sommer/raku/consecutive-sequence b/challenge-294/arne-sommer/raku/consecutive-sequence new file mode 100755 index 0000000000..91cef091b7 --- /dev/null +++ b/challenge-294/arne-sommer/raku/consecutive-sequence @@ -0,0 +1,24 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@ints where all(@ints) ~~ Int && @ints.elems > 0, :v(:$verbose)); + +my @sorted = @ints.sort; +my @unique = @sorted.unique; + +say ": Sorted: @sorted[]" if $verbose; +say ": Unique: @unique[]" if $verbose; + +my $current = @unique.shift; +my $count = 1; +my $max = 1; + +for @unique -> $next +{ + $count++ if $current +1 == $next; + + $max = $count if $count > $max; + + $current = $next; +} + +say $max == 1 ?? -1 !! $max; diff --git a/challenge-294/arne-sommer/raku/next-permutation b/challenge-294/arne-sommer/raku/next-permutation new file mode 100755 index 0000000000..8f6066d663 --- /dev/null +++ b/challenge-294/arne-sommer/raku/next-permutation @@ -0,0 +1,34 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@ints where all(@ints) ~~ Int && @ints.elems > 1, + :f(:$fast-fail), + :v(:$verbose)); + +my @a = @ints>>.Int; + +if $fast-fail && [>=] @a { say -1; exit } + +my $end = @a.end; + +for $end ... 1 -> $i +{ + for $i -1 ... 0 -> $j + { + if @a[$i] > @a[$j] + { + say ": index:$i -> @a[$i], index:$j -> @a[$j] (swap)" if $verbose; + my $n = @a[$i]; + @a[$i] = @a[$j]; + @a[$j] = $n; + + say "({ @a.join(", ") })"; + exit; + } + elsif $verbose + { + say ": index:$i -> @a[$i], index:$j -> @a[$j] (skip)" if $verbose; + } + } +} + +say "-1"; diff --git a/challenge-294/arne-sommer/raku/next-permutation-sort b/challenge-294/arne-sommer/raku/next-permutation-sort new file mode 100755 index 0000000000..24356f8d8d --- /dev/null +++ b/challenge-294/arne-sommer/raku/next-permutation-sort @@ -0,0 +1,36 @@ +#! /usr/bin/env raku + +unit sub MAIN (*@ints where all(@ints) ~~ Int && @ints.elems > 1, + :f(:$fast-fail), + :v(:$verbose)); + +my @a = @ints>>.Int; + +if $fast-fail && [>=] @a { say -1; exit } + +my $end = @a.end; + +for $end ... 1 -> $i +{ + for $i -1 ... 0 -> $j + { + if @a[$i] > @a[$j] + { + say ": index:$i -> @a[$i], index:$j -> @a[$j] (swap)" if $verbose; + my $n = @a[$i]; + @a[$i] = @a[$j]; + @a[$j] = $n; + + @a[$j+1 .. *] = @a[$j+1 .. *].sort if $i > $j +1; + + say "({ @a.join(", ") })"; + exit; + } + elsif $verbose + { + say ": index:$i -> @a[$i], index:$j -> @a[$j] (skip)" if $verbose; + } + } +} + +say "-1"; -- cgit