aboutsummaryrefslogtreecommitdiff
path: root/challenge-059
diff options
context:
space:
mode:
authorMarkus "Holli" Holzer <holli.holzer@gmail.com>2020-05-06 16:44:28 +0200
committerMarkus "Holli" Holzer <holli.holzer@gmail.com>2020-05-06 16:44:28 +0200
commit6a73dd615847cb893ecadd3945454448d21423f0 (patch)
tree742563421a00a3aa2146e7731621b952d85381b1 /challenge-059
parent8daa6c1509270a77b6d44aac76718afd5fdddeab (diff)
downloadperlweeklychallenge-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.p638
-rw-r--r--challenge-059/markus-holzer/raku/ch-2.p67
-rw-r--r--challenge-059/markus-holzer/raku/lib/LinkedList/Simple.pm6110
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 ) );
+
+ }
+}