http://qs321.pair.com?node_id=1148846


in reply to Re^4: Tree Structure Challenge
in thread Tree Structure Challenge

I know how to run your code.

Its right there in the code

It doesn't follow the specification: you haven't implemented a static method.

I didn't implement a static method because its just extra indirection -- the spec contains enough indirection on its own, it doesn't benefit from extra confusion

Speaking of which, you say it should return

( [], [ 'Dog', 'Wolf' ] )

That is kind of a surprise compared to your original sample data and sample ooutput ... as it stands my "solution" isn't there yet

Replies are listed 'Best First'.
Re^6: Tree Structure Challenge
by choroba (Cardinal) on Nov 30, 2015 at 00:44 UTC
    That is kind of a surprise
    English is not my first language, so I might be imprecise. But, if you build the two trees as described in "The Task", they look like this:
    T1: Mammal - Canine - Dog - Fox - Wolf T2: Mammal - Canine - Fox

    To get from T1 to T2, you have to remove Dog and Wolf.

    it doesn't benefit from extra confusion
    Well, the tree structure was part of the class originally. I'll add that to the specification.

    Update: I won't. It's not needed in the solution. You should use the documented API, i.e. Parent and get_leaves.

    ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,

      ...Update: I won't. It's not needed in the solution. You should use the documented API, i.e. Parent and get_leaves.

      Good luck :)

      #!/usr/bin/perl -- use strict; use warnings; use Data::Dump qw/ dd /; dd( deef( [ qw/ Cobra /] , [qw/ Fox /] ) ); dd( deef( [ qw/ Dog Fox Wolf /] , [qw/ Fox /] ) ); sub deef { my( $got, $want) = @_; my %have; undef @have{ @$got }; my @add = grep { !exists $have{$_} } @$want; undef %have; undef @have{ @$want }; my @del = grep { !exists $have{$_} } @$got; [deeef( @add )], [deeef( @del )]; } sub deeef { my( @animals ) = @_; my %catcatdog = ( Mammal => { Bovine => ["Cow", "Bison"], Canine => ["Dog", "Fox", "Wolf"], Equine => ["Horse", "Zebra", "Pony"], }, Reptile => { Bird => ["Pigeon", "Canary", "Owl"], Lizard => ["Salamander", "Chameleon"], Snake => ["Python", "Cobra"], }, ); my %dogcatcat; for my $cat ( keys %catcatdog ){ for my $catcat ( keys %{ $catcatdog{ $cat } } ){ for my $dog( @{ $catcatdog{$cat}{$catcat} } ){ push @{ $dogcatcat{$dog} }, $catcat, $cat, ; } } } return map {; [ $_, @{ $dogcatcat{$_} } ] } @animals; } __END__ ( [["Fox", "Canine", "Mammal"]], [["Cobra", "Snake", "Reptile"]], ) ( [], [["Dog", "Canine", "Mammal"], ["Wolf", "Canine", "Mammal"]], )
        (_i_)
        #!/usr/bin/perl -- use strict; use warnings; use Data::Dump qw/ dd /; dd( Zoo->new( qw/ Cobra / ), Zoo->new( qw/ Fox / ) ); dd( Zoo->diff( Zoo->new( qw/ Cobra / ), Zoo->new( qw/ Fox / ) ) ); dd( Zoo->diff( Zoo->new( qw/ Dog Fox Wolf / ), Zoo->new( qw/ Fox / ) ) + ); Zoo->new( 'Jabbawockeez' ); BEGIN { $INC{'Zoo.pm'} = __FILE__; package Zoo; my %catcatdog = ( Mammal => { Bovine => ["Cow", "Bison"], Canine => ["Dog", "Fox", "Wolf"], Equine => ["Horse", "Zebra", "Pony"], }, Reptile => { Bird => ["Pigeon", "Canary", "Owl"], Lizard => ["Salamander", "Chameleon"], Snake => ["Python", "Cobra"], }, ); my %dogcatcat; _dogcatcat(); sub _dogcatcat { for my $cat ( keys %catcatdog ){ for my $catcat ( keys %{ $catcatdog{ $cat } } ){ for my $dog( @{ $catcatdog{$cat}{$catcat} } ){ push @{ $dogcatcat{$dog} }, $catcat, $cat, ; } } } } #~ ( #~ Bison => ["Bovine", "Mammal"], #~ Canary => ["Bird", "Reptile"], #~ Chameleon => ["Lizard", "Reptile"], #~ Cobra => ["Snake", "Reptile"], #~ Cow => ["Bovine", "Mammal"], #~ Dog => ["Canine", "Mammal"], #~ Fox => ["Canine", "Mammal"], #~ Horse => ["Equine", "Mammal"], #~ Owl => ["Bird", "Reptile"], #~ Pigeon => ["Bird", "Reptile"], #~ Pony => ["Equine", "Mammal"], #~ Python => ["Snake", "Reptile"], #~ Salamander => ["Lizard", "Reptile"], #~ Wolf => ["Canine", "Mammal"], #~ Zebra => ["Equine", "Mammal"], #~ );; sub new { my( $class, @muts ) = @_; for my $mut ( @muts ){ die "what is a $mut?" if ! exists $dogcatcat{ $mut }; } return bless \@muts, $class; } sub cat { $dogcatcat{$_[1]}->[0]; } sub catcat { $dogcatcat{$_[1]}->[1]; } sub Parent { my( $class , $mut ) = @_; return $dogcatcat{$mut}->[0]; } sub get_leaves { my( $self ) = @_; return @{ $self }; } sub diff { my( $class, $got, $want) = @_; my %have; undef @have{ @$got }; my @add = grep { !exists $have{$_} } @$want; undef %have; undef @have{ @$want }; my @del = grep { !exists $have{$_} } @$got; #~ \@add, \@del; return [ map {; [ $_, @{ $dogcatcat{$_} } ] } @add ], [ map {; [ $_, @{ $dogcatcat{$_} } ] } @del ], ;; } 1; } __END__ (bless(["Cobra"], "Zoo"), bless(["Fox"], "Zoo")) ( [["Fox", "Canine", "Mammal"]], [["Cobra", "Snake", "Reptile"]], ) ( [], [["Dog", "Canine", "Mammal"], ["Wolf", "Canine", "Mammal"]], ) what is a Jabbawockeez? at - line 57.