Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use strict;
- use warnings;
- use List::AllUtils qw(all);
- # Hash table of anonymous validating subs
- my %validate = (
- 'byr' => sub { $_ = shift; return ($_ >= 1920 && $_ <= 2002) },
- 'iyr' => sub { $_ = shift; return ($_ >= 2010 && $_ <= 2020) },
- 'eyr' => sub { $_ = shift; return ($_ >= 2020 && $_ <= 2030) },
- 'hcl' => sub { $_ = shift; return (m/^#[[:xdigit:]]{6}$/) },
- 'ecl' => sub { $_ = shift; return (m#^(amb|blu|brn|gry|grn|hzl|oth)$#) },
- 'pid' => sub { $_ = shift; return (m#^[[:digit:]]{9}$#) },
- 'hgt' => sub {
- $_ = shift;
- if (m#^([[:digit:]]+)(cm|in)$#) {
- return (($2 eq 'cm') ? ($1 >= 150 && $1 <= 193)
- : ($1 >= 59 && $1 <= 76));
- } else {
- return (0);
- }
- },
- 'cid' => sub { return (1) },
- );
- #
- # Mainline
- #
- my $part1 = 0;
- my $part2 = 0;
- while (!eof) {
- my %id = ( 'cid' => 1 ); # pretend everyone has a cid
- # Read entry:
- while (<>) {
- last if (m#^\s*$#);
- %id = (%id, map { split /:/ } split /\s+/);
- }
- # Check entry:
- if (keys( %id ) == 8) {
- $part1++;
- $part2++ if (all { &{$validate{$_}}( $id{$_} ) } keys(%id));
- }
- }
- print "Part 1: $part1\n";
- print "Part 2: $part2\n";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement