aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrir <rirans@comcast.net>2022-12-30 12:23:55 -0500
committerrir <rirans@comcast.net>2022-12-30 12:23:55 -0500
commitd0deff326b8ece99181668b2aae456fa75b869bb (patch)
tree0dec8b5b16478e8acc1bb6c7ad555714d25141be
parentef1b6e72f5f8b7b06df4f7f955522b0eb7f554fd (diff)
downloadperlweeklychallenge-club-d0deff326b8ece99181668b2aae456fa75b869bb.tar.gz
perlweeklychallenge-club-d0deff326b8ece99181668b2aae456fa75b869bb.tar.bz2
perlweeklychallenge-club-d0deff326b8ece99181668b2aae456fa75b869bb.zip
197
-rw-r--r--challenge-197/0rir/raku/ch-1.raku49
-rw-r--r--challenge-197/0rir/raku/ch-2.raku71
2 files changed, 120 insertions, 0 deletions
diff --git a/challenge-197/0rir/raku/ch-1.raku b/challenge-197/0rir/raku/ch-1.raku
new file mode 100644
index 0000000000..3d7506e681
--- /dev/null
+++ b/challenge-197/0rir/raku/ch-1.raku
@@ -0,0 +1,49 @@
+#!/usr/bin/env raku
+# :vim ft=raku sw=4 expandtab # 🦋 ∅ ≡ ∩ ≢ ∈ «␤»
+use v6.d;
+use Test;
+
+=begin comment
+197-1 Submitted by: Mohammad S Anwar
+Given a list of integers, @list, move all zeroes, if existing, to the end
+while maintaining the relative order of non-zero elements.
+
+Example 1
+Input: @list = (1, 0, 3, 0, 0, 5)
+Output: (1, 3, 5, 0, 0, 0)
+=end comment
+
+sub round-posi( @a --> Array) {
+ @a.grep(* !~~ 0).Array.append( @a.grep(* ~~ 0))
+}
+
+multi MAIN () {
+ my @Test =
+ (1, 0, 3, 0, 0, 5) => ( 1,3,5,0,0,0),
+ (0, 1, 0, 2, 0) => ( 1,2,0,0,0),
+ (0,4) => (4,0),
+ (1,0) => (1,0),
+ (1,4) => (1,4),
+ (1, 2, 3) => (1,2,3),
+ (1, 0, 3) => (1,3,0),
+ (1, 2, 0) => (1,2,0),
+ (0, 2, 3) => (2,3,0),
+ (1, 0, 0) => (1,0,0),
+ (0, 2, 0) => (2,0,0),
+ (0, 0, 3) => (3,0,0),
+ (0,7) => (7,0),
+ (7,0) => (7,0),
+ (7,) => (7,),
+ (0,) => (0,),
+ () => (),
+ ;
+ plan +@Test;
+ for @Test -> $p {
+ is round-posi( $p.key), $p.value, " $p.key()";
+ }
+ done-testing;
+
+ my @list = (1,0,3,0,0,5);
+ say "\nInput: \@list = @list.raku()\n"
+ ~ "Output: ", round-posi( @list).raku;
+}
diff --git a/challenge-197/0rir/raku/ch-2.raku b/challenge-197/0rir/raku/ch-2.raku
new file mode 100644
index 0000000000..22ed78bd48
--- /dev/null
+++ b/challenge-197/0rir/raku/ch-2.raku
@@ -0,0 +1,71 @@
+#!/usr/bin/env raku
+# :vim ft=raku sw=4 expandtab # 🦋 ∅ ≡ ∩ ≢ ∈ «␤»
+use v6.d;
+use Test;
+
+=begin comment
+197-2: Wiggle Sort Submitted by: Mohammad S Anwar
+Given a list of integers, @list, perform a Wiggle Sort on it, this will make
+a list where the following is true: list[0] < list[1] > list[2] < list[3]….
+
+Example 1
+Input: @list = (1,5,1,1,6,4)
+Output: (1,6,1,5,1,4)
+Example 2
+Input: @list = (1,3,2,2,3,1)
+Output: (2,3,1,3,1,2)
+=end comment
+
+multi wiggle( [] --> Array) { die 'Nothing to wiggle!' }
+multi wiggle( @a is copy --> Array ) {
+ my $b = @a.Bag;
+ die 'Impossible wiggle!' if $b.values.max ≥ ($b.total/2)+1;
+ @a.=sort;
+ my $mid = @a.elems ÷ 2;
+
+ if $mid == $mid.Int {
+ @ = flat [Z] @a[0..^$mid], @a[$mid..@a.end];
+ }else{
+ $mid.=floor;
+ (@ = flat [Z] @a[0..^$mid], @a[1+$mid..@a.end]).push(@a[$mid]);
+ }
+}
+
+my @Die = [], [1,1,1,2], [0,0,0,0,2,2], [-1,-1,-1,-1,-1,2,2];
+
+my @Test =
+ { in => [1,], exp => [1,], },
+ { in => [1,2], exp => [1,2], },
+ { in => [2,1], exp => [1,2], },
+ { in => [-1,2,-3,4], exp => [-3,2,-1,4], },
+ { in => [0,-1,2,-3,4], exp => [-3,2,-1,4,0], },
+ { in => [1,2,3,4], exp => [1,3,2,4], },
+ { in => [1,5,1,1,6,4], exp => [1,4,1,5,1,6], },
+ { in => [1,3,2,2,3,1], exp => [1,2,1,3,2,3,], },
+ { in => [1,1,1,2,2], exp => [1,2,1,2,1], },
+ { in => [1,2, 3, 4,5], exp => [1,4,2,5,3,], },
+ { in => [1,5,1,1,6,4,2], exp => [1,4,1,5,1,6,2], },
+ { in => [1,1,1,1 ,2,2,2], exp => [ 1,2,1,2,1,2,1], },
+ { in => [1...10], exp => [ flat (1…5) Z (6…10)],},
+ { in => [1...1000], exp => [ flat (1…500) Z (501…1000)],},
+ { in => [1...60000], exp => [ flat (1…30000) Z (30001…60000)],},
+ #{ in => [1...100000], exp =>[ flat (1…50000) Z (50001…100000)],},
+ # Flattened array has 100000 elements, but argument lists are limited to 65535
+;
+
+plan +@Test + @Die;
+for @Die -> @a {
+ dies-ok { wiggle( @a) }, " dies on " ~ ( @a[].Str or '[]' );
+}
+for @Test -> %t {
+ is-deeply wiggle(%t<in>), %t<exp>, " -> %t<exp>.gist()";
+}
+
+
+my @list = [1...10];
+say "
+ Input: @list = @list.raku()
+ Output: ", wiggle(@list).raku();
+
+die 'by programmer stupidity' unless wiggle(@list) ~~ [ flat (1…5) Z (6…10)];
+done-testing;