aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-04-17 10:15:08 +0100
committerGitHub <noreply@github.com>2020-04-17 10:15:08 +0100
commit7fe7ae4ac69dc22a3f8b339d2d6efcf07599d192 (patch)
treec27c3ace3a34158d033dc86fdac4844d74ceaeaa
parentd4cc9c8a3e9de98fc545aff3fb5982b212b83925 (diff)
parent1f86d5d484d2d95c2efa15982421bf760734213a (diff)
downloadperlweeklychallenge-club-7fe7ae4ac69dc22a3f8b339d2d6efcf07599d192.tar.gz
perlweeklychallenge-club-7fe7ae4ac69dc22a3f8b339d2d6efcf07599d192.tar.bz2
perlweeklychallenge-club-7fe7ae4ac69dc22a3f8b339d2d6efcf07599d192.zip
Merge pull request #1584 from Scimon/master
I can't seem to stop poking at this
-rw-r--r--challenge-056/simon-proctor/raku/ch-2.p6114
1 files changed, 61 insertions, 53 deletions
diff --git a/challenge-056/simon-proctor/raku/ch-2.p6 b/challenge-056/simon-proctor/raku/ch-2.p6
index 5b695eec27..9f997c89cf 100644
--- a/challenge-056/simon-proctor/raku/ch-2.p6
+++ b/challenge-056/simon-proctor/raku/ch-2.p6
@@ -15,44 +15,48 @@ class BTreeRep {...}
role BTree[::T] {
has T $.value is required;
- has BTree[T] $.left;
- has BTree[T] $.right;
+ has BTree @!nodes[2];
method Str( ) {
- $!value ~ ( $!left ?? "({$!left.Str()})" !! "" ) ~ ( $!right ?? "({$!right.Str()})" !! "" );
+ ( $!value , |@.nodes.map( { "({$_})" } ) ).join("");
}
+ method nodes() {
+ @!nodes.grep({defined $_});
+ }
+
+ method children() {
+ @.nodes.elems;
+ }
method gist() {
BTreeRep.new( tree=>self ).gist();
}
method traverse() {
gather {
- if $!left {
- for $!left.traverse -> @t {
- take ($!value, |@t);
- }
- }
- if $!right {
- for $!right.traverse -> @t {
- take ($!value, |@t);
+ if ( self.children ) {
+ for @.nodes -> $n {
+ for $n.traverse -> @t {
+ take ($!value, |@t);
+ }
}
- }
- if ! $!left && ! $!right {
+ } else {
take ( $!value, );
}
}
}
- multi method from-Str('') { }
+ multi method from-Str('') { BTree }
multi method from-Str( ::?CLASS:U: Str $in ) {
my $match = BTreeGrammar.parse( $in );
if ( $match ) {
self.new(
value => $match<tree><value>.Str,
- left => self.from-Str( $match<tree><left> ?? $match<tree><left>.Str !! '' ),
- right => self.from-Str( $match<tree><right> ?? $match<tree><right>.Str !! '' )
+ nodes => [
+ self.from-Str( $match<tree><left> ?? $match<tree><left>.Str !! '' ),
+ self.from-Str( $match<tree><right> ?? $match<tree><right>.Str !! '' )
+ ]
);
} else {
die "Unable to Parse $in";
@@ -62,15 +66,9 @@ role BTree[::T] {
}
class UBTree does BTree[UInt] {
- submethod BUILD ( :$value, :$left = UBTree, :$right = UBTree ) {
- $!value = $value.UInt();
- if ( ! $left && $right ) {
- $!left = $right;
- $!right = UBTree;
- } else {
- $!left = $left;
- $!right = $right;
- }
+ submethod BUILD ( UInt() :$value, :@nodes ) {
+ $!value = $value;
+ @!nodes = @nodes;
}
}
@@ -78,7 +76,7 @@ class BTreeRep {
has @.data;
has UInt $.join-point;
- multi submethod BUILD ( BTree :$tree where { ! $tree.left && ! $tree.right } ) {
+ multi submethod BUILD ( BTree :$tree where { ! $tree.children } ) {
@!data = [$tree.value.Str];
$!join-point = $tree.value.Str.codes div 2;
}
@@ -88,13 +86,13 @@ class BTreeRep {
my ( @ldata, @rdata, $left-pad, $right-pad );
my $mid-string = '┘';
- $left = BTreeRep.new( tree => $tree.left );
+ $left = BTreeRep.new( tree => $tree.nodes[0] );
$left-width = $left.data[0].codes;
@ldata = $left.data;
@ldata.unshift( (" " x $left.join-point) ~ "┌" ~ ("─" x ($left-width - 1 - $left.join-point) ) );
- if ( $tree.right ) {
- my $right = BTreeRep.new( tree => $tree.right );
+ if ( $tree.children == 2 ) {
+ my $right = BTreeRep.new( tree => $tree.nodes[1] );
$mid-string = '┴';
@rdata = $right.data;
$right-width = @rdata[0].codes;
@@ -172,29 +170,39 @@ multi sub MAIN ( UInt $target, *@rest ) {
sub example-tree() {
return UBTree.new(
value => 5,
- left => UBTree.new(
- value => 4,
- left => UBTree.new(
- value => 11,
- left => UBTree.new(
- value => 7,
- ),
- right => UBTree.new(
- value => 2,
- )
- )
- ),
- right => UBTree.new(
- value => 8,
- left => UBTree.new(
- value => 13,
- ),
- right => UBTree.new(
- value => 9,
- left => UBTree.new(
- value => 1
- )
- )
- )
+ nodes => [
+ UBTree.new(
+ value => 4,
+ nodes => [
+ UBTree.new(
+ value => 11,
+ nodes => [
+ UBTree.new(
+ value => 7,
+ ),
+ UBTree.new(
+ value => 2,
+ )
+ ]
+ )
+ ]
+ ),
+ UBTree.new(
+ value => 8,
+ nodes => [
+ UBTree.new(
+ value => 13,
+ ),
+ UBTree.new(
+ value => 9,
+ nodes => [
+ UBTree.new(
+ value => 1
+ )
+ ]
+ )
+ ]
+ )
+ ]
);
}