aboutsummaryrefslogtreecommitdiff
path: root/challenge-068/mohammad-anwar
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-07-08 18:13:49 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-07-08 18:13:49 +0100
commit65a482dbc604132ef11766c0915399815421b4bf (patch)
tree64e1fce203143f535aa30a1157b8063a7eb63aa6 /challenge-068/mohammad-anwar
parentf1b346b4170e685c2c6229e8cb8a5b1d9fe36b2d (diff)
downloadperlweeklychallenge-club-65a482dbc604132ef11766c0915399815421b4bf.tar.gz
perlweeklychallenge-club-65a482dbc604132ef11766c0915399815421b4bf.tar.bz2
perlweeklychallenge-club-65a482dbc604132ef11766c0915399815421b4bf.zip
- Added Raku solutions to the "Reorder List" task.
Diffstat (limited to 'challenge-068/mohammad-anwar')
-rw-r--r--challenge-068/mohammad-anwar/raku/ch-2.raku64
-rw-r--r--challenge-068/mohammad-anwar/raku/ch-2a.raku74
2 files changed, 138 insertions, 0 deletions
diff --git a/challenge-068/mohammad-anwar/raku/ch-2.raku b/challenge-068/mohammad-anwar/raku/ch-2.raku
new file mode 100644
index 0000000000..25b737ca8a
--- /dev/null
+++ b/challenge-068/mohammad-anwar/raku/ch-2.raku
@@ -0,0 +1,64 @@
+#!/usr/bin/env raku
+
+#
+# Perl Weekly Challenge - 068
+#
+# Task #2: Reorder List
+#
+# https://perlweeklychallenge.org/blog/perl-wee
+#
+
+class Node {
+ has Int $.v;
+ has Node $.c;
+
+ method v() { return $!v }
+ multi method c() { return $!c }
+ multi method c(Node $c) { $!c = $c }
+
+ method show-link() {
+ my $c = $!c;
+ my @v = ($!v);
+
+ while defined $c {
+ @v.push: $c.v;
+ $c = $c.c;
+ }
+
+ return @v.join(' -> ');
+ }
+}
+
+sub MAIN(Str :$linked-list? = '1 -> 2 -> 3 -> 4 -> 5') {
+ reorder-list($linked-list).show-link.say;
+}
+
+sub reorder-list(Str $linked-list is copy) {
+
+ $linked-list ~~ s:g/\s//;
+ my @list = $linked-list.split('->');
+ my $head = Node.new(v => @list.shift.Int);
+ my @link = ($head);
+
+ # prepare singly linked list
+ for @list -> $v {
+ my $node = Node.new(v => $v.Int);
+ @link.tail.c($node);
+ @link.push: $node;
+ }
+
+ # reorder linked list
+ my Int $min = 0;
+ my Int $max = (@list.elems/ 2).Int;
+ my Int $i = 1;
+ for $min .. $max-1 {
+ my $last = @link.pop;
+ @link.splice($i, 0, $last);
+ @link.tail.c(Node);
+ @link[$i - 1].c($last);
+ @link[$i].c(@link[$i + 1]);
+ $i += 2;
+ }
+
+ return $head;
+}
diff --git a/challenge-068/mohammad-anwar/raku/ch-2a.raku b/challenge-068/mohammad-anwar/raku/ch-2a.raku
new file mode 100644
index 0000000000..06c86ac3ea
--- /dev/null
+++ b/challenge-068/mohammad-anwar/raku/ch-2a.raku
@@ -0,0 +1,74 @@
+#!/usr/bin/env raku
+
+#
+# Perl Weekly Challenge - 068
+#
+# Task #2: Reorder List
+#
+# https://perlweeklychallenge.org/blog/perl-wee
+#
+
+class Node {
+ has Int $.v;
+ has Node $.c;
+
+ method v() { return $!v }
+ multi method c() { return $!c }
+ multi method c(Node $c) { $!c = $c }
+
+ method show-link() {
+ my $c = $!c;
+ my @v = ($!v);
+
+ while defined $c {
+ @v.push: $c.v;
+ $c = $c.c;
+ }
+
+ return @v.join(' -> ');
+ }
+}
+
+use Test;
+
+is reorder-list('1 -> 2 -> 3 -> 4').show-link,
+ '1 -> 4 -> 2 -> 3',
+ 'testing 1 -> 2 -> 3 -> 4';
+is reorder-list('1 -> 2 -> 3 -> 4 -> 5').show-link,
+ '1 -> 5 -> 2 -> 4 -> 3',
+ 'testing 1 -> 2 -> 3 -> 4 -> 5';
+is reorder-list('1 -> 2 -> 3 -> 4 -> 5 -> 6').show-link,
+ '1 -> 6 -> 2 -> 5 -> 3 -> 4',
+ 'testing 1 -> 2 -> 3 -> 4 -> 5 -> 6';
+
+done-testing;
+
+sub reorder-list(Str $linked-list is copy) {
+
+ $linked-list ~~ s:g/\s//;
+ my @list = $linked-list.split('->');
+ my $head = Node.new(v => @list.shift.Int);
+ my @link = ($head);
+
+ # prepare singly linked list
+ for @list -> $v {
+ my $node = Node.new(v => $v.Int);
+ @link.tail.c($node);
+ @link.push: $node;
+ }
+
+ # reorder linked list
+ my Int $min = 0;
+ my Int $max = (@list.elems/ 2).Int;
+ my Int $i = 1;
+ for $min .. $max-1 {
+ my $last = @link.pop;
+ @link.splice($i, 0, $last);
+ @link.tail.c(Node);
+ @link[$i - 1].c($last);
+ @link[$i].c(@link[$i + 1]);
+ $i += 2;
+ }
+
+ return $head;
+}