aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarnesom <arne@bbop.org>2023-04-16 22:04:01 +0200
committerarnesom <arne@bbop.org>2023-04-16 22:04:01 +0200
commitff02bcd5719980acd549089575019b3b6313c864 (patch)
treef975557c8b6a782d2b71d76f762382d78f167dab
parent460563374929fde06af50ad536397bdde377d181 (diff)
downloadperlweeklychallenge-club-ff02bcd5719980acd549089575019b3b6313c864.tar.gz
perlweeklychallenge-club-ff02bcd5719980acd549089575019b3b6313c864.tar.bz2
perlweeklychallenge-club-ff02bcd5719980acd549089575019b3b6313c864.zip
Arne Sommer
-rw-r--r--challenge-212/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-212/arne-sommer/raku/ch-1.raku17
-rwxr-xr-xchallenge-212/arne-sommer/raku/ch-2.raku50
-rwxr-xr-xchallenge-212/arne-sommer/raku/jumping-letters17
-rwxr-xr-xchallenge-212/arne-sommer/raku/rearrange-group50
5 files changed, 135 insertions, 0 deletions
diff --git a/challenge-212/arne-sommer/blog.txt b/challenge-212/arne-sommer/blog.txt
new file mode 100644
index 0000000000..eb15a264ad
--- /dev/null
+++ b/challenge-212/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/letters-groups.html
diff --git a/challenge-212/arne-sommer/raku/ch-1.raku b/challenge-212/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..b142639b06
--- /dev/null
+++ b/challenge-212/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,17 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($word where $word ~~ /^<[a..zA..Z]>+$/, *@jump where @jump.all ~~ UInt && @jump.all < 26 && @jump.elems == $word.chars);
+
+for $word.comb -> $letter
+{
+ my $is-lc = $letter eq any('a' ... 'z');
+ my $jump = @jump.shift;
+ my $new = chr($letter.ord + $jump);
+
+ $new = chr($new.ord - 26) if $is-lc && $new.ord > 'z'.ord;
+ $new = chr($new.ord - 26) if !$is-lc && $new.ord > 'Z'.ord;
+
+ print $new;
+}
+
+say "";
diff --git a/challenge-212/arne-sommer/raku/ch-2.raku b/challenge-212/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..2a4d774f08
--- /dev/null
+++ b/challenge-212/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,50 @@
+#! /usr/bin/env raku
+
+multi MAIN (UInt $size where $size >= 1, *@list where @list.elems >= 2 && @list.all ~~ Int && @list.elems %% $size, :v(:$verbose))
+{
+ say ": size: $size" if $verbose;
+
+ my @sorted = @list>>.Int.sort;
+
+ say ": Sorted source: @sorted[]" if $verbose;
+
+ my @res;
+
+ for 1 .. @list.elems / $size -> $group
+ {
+ my @group = @sorted.shift;
+
+ say ": New group $group starting with @group[0]" if $verbose;
+
+ while @group.elems < $size
+ {
+ my $target = @group.tail + 1;
+ my $index = @sorted.first($target, :k);
+
+ if defined $index
+ {
+ say ": Found target $target at index $index" if $verbose;
+
+ @group.append: @sorted.splice($index,1); # as splice gives a list, and push would gladly add that.
+
+ say ": Group now: @group[] (Rest: @sorted[])" if $verbose;
+ }
+ else
+ {
+ say ": Did not find target $target" if $verbose;
+ say '-1';
+ exit;
+ }
+ }
+
+ @res.push: @group;
+ say ": Added group to result: @group[]" if $verbose;
+ }
+
+ say @res>>.join(",").map({ "($_)" }).join(", ");
+}
+
+multi MAIN (*@slurp, :v(:$verbose))
+{
+ say '-1';
+}
diff --git a/challenge-212/arne-sommer/raku/jumping-letters b/challenge-212/arne-sommer/raku/jumping-letters
new file mode 100755
index 0000000000..b142639b06
--- /dev/null
+++ b/challenge-212/arne-sommer/raku/jumping-letters
@@ -0,0 +1,17 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($word where $word ~~ /^<[a..zA..Z]>+$/, *@jump where @jump.all ~~ UInt && @jump.all < 26 && @jump.elems == $word.chars);
+
+for $word.comb -> $letter
+{
+ my $is-lc = $letter eq any('a' ... 'z');
+ my $jump = @jump.shift;
+ my $new = chr($letter.ord + $jump);
+
+ $new = chr($new.ord - 26) if $is-lc && $new.ord > 'z'.ord;
+ $new = chr($new.ord - 26) if !$is-lc && $new.ord > 'Z'.ord;
+
+ print $new;
+}
+
+say "";
diff --git a/challenge-212/arne-sommer/raku/rearrange-group b/challenge-212/arne-sommer/raku/rearrange-group
new file mode 100755
index 0000000000..2a4d774f08
--- /dev/null
+++ b/challenge-212/arne-sommer/raku/rearrange-group
@@ -0,0 +1,50 @@
+#! /usr/bin/env raku
+
+multi MAIN (UInt $size where $size >= 1, *@list where @list.elems >= 2 && @list.all ~~ Int && @list.elems %% $size, :v(:$verbose))
+{
+ say ": size: $size" if $verbose;
+
+ my @sorted = @list>>.Int.sort;
+
+ say ": Sorted source: @sorted[]" if $verbose;
+
+ my @res;
+
+ for 1 .. @list.elems / $size -> $group
+ {
+ my @group = @sorted.shift;
+
+ say ": New group $group starting with @group[0]" if $verbose;
+
+ while @group.elems < $size
+ {
+ my $target = @group.tail + 1;
+ my $index = @sorted.first($target, :k);
+
+ if defined $index
+ {
+ say ": Found target $target at index $index" if $verbose;
+
+ @group.append: @sorted.splice($index,1); # as splice gives a list, and push would gladly add that.
+
+ say ": Group now: @group[] (Rest: @sorted[])" if $verbose;
+ }
+ else
+ {
+ say ": Did not find target $target" if $verbose;
+ say '-1';
+ exit;
+ }
+ }
+
+ @res.push: @group;
+ say ": Added group to result: @group[]" if $verbose;
+ }
+
+ say @res>>.join(",").map({ "($_)" }).join(", ");
+}
+
+multi MAIN (*@slurp, :v(:$verbose))
+{
+ say '-1';
+}