diff options
| author | Markus "Holli" Holzer <holli.holzer@gmail.com> | 2020-05-06 16:44:28 +0200 |
|---|---|---|
| committer | Markus "Holli" Holzer <holli.holzer@gmail.com> | 2020-05-06 16:44:28 +0200 |
| commit | 6a73dd615847cb893ecadd3945454448d21423f0 (patch) | |
| tree | 742563421a00a3aa2146e7731621b952d85381b1 /challenge-059 | |
| parent | 8daa6c1509270a77b6d44aac76718afd5fdddeab (diff) | |
| download | perlweeklychallenge-club-6a73dd615847cb893ecadd3945454448d21423f0.tar.gz perlweeklychallenge-club-6a73dd615847cb893ecadd3945454448d21423f0.tar.bz2 perlweeklychallenge-club-6a73dd615847cb893ecadd3945454448d21423f0.zip | |
Initial
Diffstat (limited to 'challenge-059')
| -rw-r--r-- | challenge-059/markus-holzer/raku/ch-1.p6 | 38 | ||||
| -rw-r--r-- | challenge-059/markus-holzer/raku/ch-2.p6 | 7 | ||||
| -rw-r--r-- | challenge-059/markus-holzer/raku/lib/LinkedList/Simple.pm6 | 110 |
3 files changed, 155 insertions, 0 deletions
diff --git a/challenge-059/markus-holzer/raku/ch-1.p6 b/challenge-059/markus-holzer/raku/ch-1.p6 new file mode 100644 index 0000000000..c84d1ab897 --- /dev/null +++ b/challenge-059/markus-holzer/raku/ch-1.p6 @@ -0,0 +1,38 @@ +use LinkedList::Simple; + +multi sub MAIN( Bool :$t ) +{ + test(); +} + +multi sub MAIN( Int:D :$k, *@n where { .elems > 1 && .all ~~ Int } ) +{ + say LinkedList::Simple + .from( |@n ) + .roughsort( * < $k ) + .flat + .join( '→' ); +} + +sub test +{ + use Test; + + my %tests = + '2-5-6-7-13-14-18' => [ 10, ( 2, 5, 13, 14, 6, 7, 18 ) ], + '2-5-6-7-13-14-18' => [ 10, ( 13, 2, 5, 14, 6, 7, 18 ) ], + '1-2-3-4-11-12-13-14' => [ 10, ( 1, 11, 2, 12, 3, 13, 4, 14 ) ], + '1-1-1-1-2-2-2-2' => [ 2, ( 1, 2, 1, 2, 1, 2, 1, 2 ) ], + '1-2-2-4-3-5' => [ 3, ( 1, 4, 3, 2, 5, 2 ) ] + ; + + my &test = { + ok LinkedList::Simple + .from( $^test.value[1].flat ) + .roughsort( * < $^test.value[0] ) + .flat + .join('-') eq $^test.key, $^test.key } + ; + + .&test for %tests; +} diff --git a/challenge-059/markus-holzer/raku/ch-2.p6 b/challenge-059/markus-holzer/raku/ch-2.p6 new file mode 100644 index 0000000000..35c3074e93 --- /dev/null +++ b/challenge-059/markus-holzer/raku/ch-2.p6 @@ -0,0 +1,7 @@ +sub MAIN( *@n where *.elems > 0 ) +{ + say [+] @n.combinations( 2 ).map: -> ( Int $a, Int $b ) + { + ( $a +^ $b ).base( 2 ).indices( 1 ) + } +}
\ No newline at end of file diff --git a/challenge-059/markus-holzer/raku/lib/LinkedList/Simple.pm6 b/challenge-059/markus-holzer/raku/lib/LinkedList/Simple.pm6 new file mode 100644 index 0000000000..d6aeef33b7 --- /dev/null +++ b/challenge-059/markus-holzer/raku/lib/LinkedList/Simple.pm6 @@ -0,0 +1,110 @@ +role LinkedList::Simple::Node +{ + has $.next is rw; + + method LinkedList + { + LinkedList::Simple.new( :head( self ) ); + } + + multi method append( $new-value ) + { + self.append( $new-value but LinkedList::Simple::Node ) + } + + multi method append( LinkedList::Simple::Node $new-node ) + { + self.next = $new-node + } + + multi method perl() + { + nextsame + } +} + +role LinkedList::Simple does Iterable +{ + has LinkedList::Simple::Node $.head is rw; + + method from( *@nodes ) + { + self.bless( :@nodes ); + } + + multi submethod BUILD( LinkedList::Simple::Node :$head, :@nodes ) + { + $!head = my $node = $head // ( @nodes.shift but LinkedList::Simple::Node ); + $node = $node.append( $_ ) for @nodes; + } + + method sequence() + { + $!head, *.next ... ! *.next.defined + } + + method iterator() + { + self.sequence.iterator; + } + + multi method perl() + { + "LinkedList::Simple.from({ self.sequence.map( *.perl ).join(', ') });" + } + + method roughsort( Code $categorize ) + { + sub dismantle( &categorize ) + { + my $end; + my $start; + my $head-category = &categorize( self.head ); + + gather + { + for self.flat -> $node + { + if ( $head-category == $node.&categorize ) + { + take { :$start, :$end } with $end; + + $head-category .= not; + $start = $node; + } + + $end = $node; + } + + take { :$start, :$end }; + } + } + + sub assemble( $pieces ) + { + my $first-node; + my $last-frag; + + for $pieces.rotor( 2 => -1 ) -> ( $left, $right ) + { + FIRST $first-node = $left<start>; + LAST $last-frag = $right; + + $left<end>.next = $right<start>; + } + + with $first-node + { + self.head = $first-node; + $last-frag<end>.next = Any; + } + + self; + } + + assemble( + dismantle( *.$categorize ) + .sort( not *<start>.$categorize ) ); + + } +} |
