diff options
| author | Simon Proctor <simon.proctor@zoopla.co.uk> | 2020-07-06 15:33:20 +0100 |
|---|---|---|
| committer | Simon Proctor <simon.proctor@zoopla.co.uk> | 2020-07-06 15:33:20 +0100 |
| commit | f71027dad9957bfb304cd32794052b76944f90fd (patch) | |
| tree | a039edb7fe485d665abccef0f5559863df6dad7b /challenge-068 | |
| parent | 12955fd0811be31d2de6d1194d3c9ba5dd276e5d (diff) | |
| download | perlweeklychallenge-club-f71027dad9957bfb304cd32794052b76944f90fd.tar.gz perlweeklychallenge-club-f71027dad9957bfb304cd32794052b76944f90fd.tar.bz2 perlweeklychallenge-club-f71027dad9957bfb304cd32794052b76944f90fd.zip | |
Linked lists are fun?
Diffstat (limited to 'challenge-068')
| -rw-r--r-- | challenge-068/simon-proctor/raku/ch-2.raku | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/challenge-068/simon-proctor/raku/ch-2.raku b/challenge-068/simon-proctor/raku/ch-2.raku new file mode 100644 index 0000000000..226b5c2121 --- /dev/null +++ b/challenge-068/simon-proctor/raku/ch-2.raku @@ -0,0 +1,74 @@ +#!/usr/bin/env raku + +class ListNode { + has $.value; + has ListNode $!next; + + method is-last() { + ! $!next.defined; + } + + method next() { + $!next; + } + + method add-next( ListNode $next ) { + $!next = $next; + } + + method move-node( ListNode $start, ListNode $node ) { + my $prev = $start; + my $next = $!next; + my $node-next = $node.next; + while $prev.next !~~ $node { $prev = $prev.next } + $!next = $node; + $node.add-next( $next ); + $prev.add-next( $node-next ); + } + + method gist() { + if self.is-last { + "$.value"; + } else { + "{$.value} -> {$!next.gist}"; + } + } + + method from-iterator( ListNode:U : @values ) { + my ( $start-node, $node ); + + for @values -> $value { + if ! $start-node.defined { + $start-node = ListNode.new( :$value ); + $node = $start-node; + } else { + my $next-node = ListNode.new( :$value ); + $node.add-next( $next-node ); + $node = $next-node; + } + } + return $start-node; + } + + method last-node() { + my $node = self; + while ! $node.is-last { $node = $node.next(); } + return $node; + } +} + +sub MAIN( *@values where *.elems >= 1 ) { + my $start-node = ListNode.from-iterator( @values ); + say "Input : {$start-node.gist}"; + my $end-node = $start-node.last-node; + my $current-node = $start-node; + while ! $current-node.is-last { + my $next-node = $current-node.next; + if ! $next-node.is-last { + $current-node.move-node( $start-node, $end-node ); + $end-node = $current-node.last-node; + } + $current-node = $next-node; + } + say "Output : {$start-node.gist}"; +} |
