diff --git a/2023/.gitignore b/2023/.gitignore new file mode 100644 index 0000000..751553b --- /dev/null +++ b/2023/.gitignore @@ -0,0 +1 @@ +*.bak diff --git a/2023/07/Part1.pm b/2023/07/Part1.pm index 5051721..d72da20 100644 --- a/2023/07/Part1.pm +++ b/2023/07/Part1.pm @@ -3,9 +3,9 @@ use 5.38.0; package Part1; use List::AllUtils qw/ pairmap sum /; -use List::UtilsBy qw/ sort_by /; +use List::UtilsBy qw/ sort_by /; -sub rank_hand(@hand) { +sub rank_hand (@hand) { @hand = split '', shift @hand if @hand == 1; my %group; @@ -28,35 +28,38 @@ sub rank_hand(@hand) { return 1; } -sub handify($str) { +sub handify ($str) { state %map = ( 'T' => 10, 'J' => 11, 'Q' => 12, 'K' => 13, - A => 14 + A => 14 ); - my @cards = map { chr( ord('a') + $_ - 2 )} map { $map{$_} // $_ } split '', $str; + my @cards = + map { chr( ord('a') + $_ - 2 ) } map { $map{$_} // $_ } split '', $str; return \@cards; } -sub parse_input($input) { - my @lines = split "\n", $input; - my @hand_score = pairmap { - [ handify($a), $b] - } map { split " " } @lines; +sub parse_input ($input) { + my @lines = split "\n", $input; + my @hand_score = pairmap { + [ handify($a), $b ] + } + map { split " " } @lines; return @hand_score; } -sub score(@hand) { +sub score (@hand) { join '', rank_hand(@hand), @hand; } sub solution_1 ($input) { - my @hand_score = sort_by { score($_->[0]->@*) } parse_input($input); - my $rank = 0; + my @hand_score = sort_by { score( $_->[0]->@* ) } parse_input($input); + my $rank = 0; + # use DDP; p @hand_score; return sum map { ++$rank * $_->[1] } @hand_score; } diff --git a/2023/07/Part2.pm b/2023/07/Part2.pm index cc89c80..99c8594 100644 --- a/2023/07/Part2.pm +++ b/2023/07/Part2.pm @@ -5,9 +5,9 @@ package Part2; use Part1; use List::AllUtils qw/ pairmap sum max /; -use List::UtilsBy qw/ sort_by /; +use List::UtilsBy qw/ sort_by /; -sub rank_hand(@hand) { +sub rank_hand (@hand) { @hand = split '', shift @hand if @hand == 1; my %group; @@ -17,11 +17,11 @@ sub rank_hand(@hand) { return 7 if 1 >= keys %group; - return 6 if grep { $_+$jokers >= 4 } values %group; + return 6 if grep { $_ + $jokers >= 4 } values %group; my $max = max values %group; - if( $max + $jokers >= 3 ) { + if ( $max + $jokers >= 3 ) { return 5 if keys %group <= 2; return 4; } @@ -33,35 +33,37 @@ sub rank_hand(@hand) { return 1; } -sub handify($str) { +sub handify ($str) { state %map = ( 'T' => 10, 'J' => 1, 'Q' => 12, 'K' => 13, - A => 14 + A => 14 ); - my @cards = map { chr( ord('a') + $_ - 2 )} map { $map{$_} // $_ } split '', $str; + my @cards = + map { chr( ord('a') + $_ - 2 ) } map { $map{$_} // $_ } split '', $str; return \@cards; } -sub parse_input($input) { - my @lines = split "\n", $input; - my @hand_score = pairmap { - [ handify($a), $b] - } map { split " " } @lines; +sub parse_input ($input) { + my @lines = split "\n", $input; + my @hand_score = pairmap { + [ handify($a), $b ] + } + map { split " " } @lines; return @hand_score; } -sub score(@hand) { +sub score (@hand) { join '', rank_hand(@hand), @hand; } sub solution_2 ($input) { - my @hand_score = sort_by { score($_->[0]->@*) } parse_input($input); - my $rank = 0; + my @hand_score = sort_by { score( $_->[0]->@* ) } parse_input($input); + my $rank = 0; return sum map { ++$rank * $_->[1] } @hand_score; } diff --git a/2023/07/benchmark.pl b/2023/07/benchmark.pl index d0ffeee..6154f18 100644 --- a/2023/07/benchmark.pl +++ b/2023/07/benchmark.pl @@ -9,8 +9,8 @@ use File::Serialize; use Part1; use Part2; -my $day = path('.')->absolute->basename =~ s/^0//r; -my $year = path('.')->absolute->parent->basename; +my $day = path('.')->absolute->basename =~ s/^0//r; +my $year = path('.')->absolute->parent->basename; my $solutions = deserialize_file('solutions.yml'); my @parts = ( @@ -36,7 +36,7 @@ for my $part (@parts) { language => 'perl', part => $part->{part}, time => $res->cpu_a / $res->iters, - persec => $res->iters / $res->cpu_a , + persec => $res->iters / $res->cpu_a, timestamp => DateTime->now->iso8601, }; say to_json $result; diff --git a/2023/07/part1.t b/2023/07/part1.t index 3f86a4e..af95d38 100644 --- a/2023/07/part1.t +++ b/2023/07/part1.t @@ -6,22 +6,20 @@ use Path::Tiny; use Part1; -my $input = path('input')->slurp; +my $input = path('input')->slurp; my $example = path('example')->slurp; -is Part1::rank_hand( 'AAAAA') => 7; -is Part1::rank_hand( 'AA8AA') => 6; -is Part1::rank_hand( '23332') => 5; -is Part1::rank_hand( 'TTT98') => 4; -is Part1::rank_hand( '23432') => 3; -is Part1::rank_hand( 'A23A4') => 2; -is Part1::rank_hand( '23456') => 1; +is Part1::rank_hand('AAAAA') => 7; +is Part1::rank_hand('AA8AA') => 6; +is Part1::rank_hand('23332') => 5; +is Part1::rank_hand('TTT98') => 4; +is Part1::rank_hand('23432') => 3; +is Part1::rank_hand('A23A4') => 2; +is Part1::rank_hand('23456') => 1; -is [ Part1::parse_input( '2345A 123') ] => [ -[ [qw/ a b c d m /], 123 ] -]; +is [ Part1::parse_input('2345A 123') ] => [ [ [qw/ a b c d m /], 123 ] ]; is Part1::solution_1($example) => 6440; -is Part1::solution_1($input) => 'TODO'; +is Part1::solution_1($input) => 'TODO'; done_testing; diff --git a/2023/07/part2.t b/2023/07/part2.t index 34c6180..65499be 100644 --- a/2023/07/part2.t +++ b/2023/07/part2.t @@ -6,7 +6,7 @@ use Path::Tiny; use Part2; -my $input = path('input')->slurp; +my $input = path('input')->slurp; my $example = path('example')->slurp; is Part2::solution_2($example) => 5905;