use strict; use warnings; my $points = 0; my (%cardWins, %cardNums); while (<>) { chomp; $_ =~ s/Card +(\d+): //; my ($winning, $mine) = split(/ [|] /); my %winning = map {$_ => 1} split(/ +/, $winning); my @mine = split(/ +/, $mine); $cardWins{$1} = \%winning; $cardNums{$1} = \@mine; my $score = 0; for (@mine) { $score = ($score ? $score * 2 : 1) if exists $winning{$_}; } $points += $score; } print $points, "\n"; my @cards = keys %cardWins; foreach my $card (@cards) { my $wins = 0; for (@{$cardNums{$card}}) { $wins++ if exists $cardWins{$card}->{$_}; } for (($card+1)..($card+$wins)) { push @cards, $_ if exists $cardWins{$_}; } } print scalar @cards, "\n";