]> www.fi.muni.cz Git - aoc2020.git/commitdiff
day 7
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Mon, 7 Dec 2020 06:09:18 +0000 (07:09 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Mon, 7 Dec 2020 06:09:18 +0000 (07:09 +0100)
13.pl [new file with mode: 0755]
14.pl [new file with mode: 0755]

diff --git a/13.pl b/13.pl
new file mode 100755 (executable)
index 0000000..93739e0
--- /dev/null
+++ b/13.pl
@@ -0,0 +1,32 @@
+#!/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";
diff --git a/14.pl b/14.pl
new file mode 100755 (executable)
index 0000000..ab8f8b4
--- /dev/null
+++ b/14.pl
@@ -0,0 +1,38 @@
+#!/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";