diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-07-08 18:13:49 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2020-07-08 18:13:49 +0100 |
| commit | 65a482dbc604132ef11766c0915399815421b4bf (patch) | |
| tree | 64e1fce203143f535aa30a1157b8063a7eb63aa6 /challenge-068/mohammad-anwar | |
| parent | f1b346b4170e685c2c6229e8cb8a5b1d9fe36b2d (diff) | |
| download | perlweeklychallenge-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.raku | 64 | ||||
| -rw-r--r-- | challenge-068/mohammad-anwar/raku/ch-2a.raku | 74 |
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; +} |
