--- /dev/null
+#!/usr/bin/perl -w
+
+use strict;
+
+my %graph;
+my $count = 0;
+
+while (<>) {
+ my ($bag, $rest) = /\A(.*) bags? contain (.*)./;
+ if ($rest eq 'no other bags') {
+ # $graph{$bag} = []; # ale neprojevi se
+ } else {
+ for my $contain (split /, /, $rest) {
+ my ($count, $color) = ($contain =~ /\A(\d+) (.*) bag/);
+ print "\t$count\t$color.\n";
+ push @{ $graph{$color} }, $bag;
+ }
+ }
+}
+
+my %seen = ('shiny gold' => 1);
+my @todo = 'shiny gold';
+
+while (my $color = shift @todo) {
+ for my $next (@{ $graph{$color} }) {
+ next if $seen{ $next };
+ unshift @todo, $next;
+ $seen{ $next } = 1;
+ }
+}
+
+print "Seen ", keys(%seen)-1, " nodes\n";
--- /dev/null
+#!/usr/bin/perl -w
+
+use strict;
+
+my %graph;
+my $count = 0;
+
+while (<>) {
+ my ($bag, $rest) = /\A(.*) bags? contain (.*)./;
+ if ($rest eq 'no other bags') {
+ $graph{$bag} = []; # ale neprojevi se
+ } else {
+ for my $contain (split /, /, $rest) {
+ my ($count, $color) = ($contain =~ /\A(\d+) (.*) bag/);
+ push @{ $graph{$bag} }, [ $color => $count ];
+ }
+ }
+}
+
+my %seen = ('shiny gold' => 1);
+my %total;
+
+sub walk {
+ my ($color) = @_;
+
+ return $total{$color}
+ if defined $total{$color};
+
+ $total{$color} = 1;
+ for my $next (@{ $graph{$color} }) {
+ my ($ncol, $ncount) = @$next;
+ $total{$color} += $ncount*walk($ncol);
+ }
+
+ return $total{$color};
+}
+
+print "Result is ", walk('shiny gold') - 1, "\n";