]> www.fi.muni.cz Git - aoc.git/blobdiff - 2016/40.pl
The rest of Year 2016
[aoc.git] / 2016 / 40.pl
diff --git a/2016/40.pl b/2016/40.pl
new file mode 100755 (executable)
index 0000000..1ab3474
--- /dev/null
@@ -0,0 +1,39 @@
+#!/usr/bin/perl -w
+
+use strict;
+use v5.30;
+
+my @ints = ([ 0, (1 << 32)-1 ]);
+INT:
+while (<>) {
+       chomp;
+       say join(' ', map { $_->[0] . '-' . $_->[1] } @ints);
+       my ($lo, $hi) = split /-/;
+       say "blacklisting $lo-$hi";
+       my $i = 0;
+       while ($i < @ints) {
+               my $int = $ints[$i];
+               if ($int->[0] < $lo && $int->[1] > $hi) {
+                       splice @ints, $i, 1, [ $int->[0], $lo-1 ], [ $hi+1, $int->[1] ];
+                       next INT;
+               } elsif ($int->[0] < $lo && $int->[1] >= $lo && $int->[1] <= $hi) {
+                       splice @ints, $i, 1, [ $int->[0], $lo-1 ];
+                       $i++;
+               } elsif ($int->[0] >= $lo && $int->[1] <= $hi) {
+                       splice @ints, $i, 1;
+               } elsif ($int->[0] >= $lo && $int->[0] <= $hi && $int->[1] > $hi) {
+                       splice @ints, $i, 1, [ $hi+1, $int->[1] ];
+                       next INT;
+               } elsif ($int->[0] > $hi) {
+                       next INT;
+               } else {
+                       $i++;
+               }
+       }
+}
+
+my $sum;
+for my $i (@ints) {
+       $sum += $i->[1]-$i->[0]+1;
+}
+say $sum;