Advertisement
Guest User

AoC day 4, Perl

a guest
Dec 4th, 2020
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.43 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. use List::AllUtils qw(all);
  7.  
  8. # Hash table of anonymous validating subs
  9. my %validate = (
  10.     'byr' => sub { $_ = shift; return ($_ >= 1920 && $_ <= 2002)            },
  11.     'iyr' => sub { $_ = shift; return ($_ >= 2010 && $_ <= 2020)            },
  12.     'eyr' => sub { $_ = shift; return ($_ >= 2020 && $_ <= 2030)            },
  13.  
  14.     'hcl' => sub { $_ = shift; return (m/^#[[:xdigit:]]{6}$/)               },
  15.     'ecl' => sub { $_ = shift; return (m#^(amb|blu|brn|gry|grn|hzl|oth)$#)  },
  16.     'pid' => sub { $_ = shift; return (m#^[[:digit:]]{9}$#)                 },
  17.  
  18.     'hgt' => sub {
  19.                 $_ = shift;
  20.  
  21.                 if (m#^([[:digit:]]+)(cm|in)$#) {
  22.                     return (($2 eq 'cm') ? ($1 >= 150 && $1 <= 193)
  23.                                          : ($1 >= 59  && $1 <= 76));
  24.                 } else {
  25.                     return (0);
  26.                 }
  27.              },
  28.  
  29.     'cid' => sub { return (1) },
  30. );
  31.  
  32. #
  33. # Mainline
  34. #
  35. my $part1 = 0;
  36. my $part2 = 0;
  37.  
  38. while (!eof) {
  39.     my %id = ( 'cid' => 1 );     # pretend everyone has a cid
  40.  
  41.     # Read entry:
  42.     while (<>) {
  43.         last if (m#^\s*$#);
  44.         %id = (%id, map { split /:/ } split /\s+/);
  45.     }
  46.  
  47.     # Check entry:
  48.     if (keys( %id ) == 8) {
  49.         $part1++;
  50.         $part2++ if (all { &{$validate{$_}}( $id{$_} ) } keys(%id));
  51.     }
  52. }
  53.  
  54. print "Part 1: $part1\n";
  55. print "Part 2: $part2\n";
  56.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement