From c446579923702a6241b18d5e43676a941aa2bd51 Mon Sep 17 00:00:00 2001 From: Yanick Champoux Date: Sat, 9 Dec 2023 12:44:53 -0500 Subject: [PATCH 1/3] part 1 done, part2 wip --- 2023/09/Part1.pm | 24 ++++++++++++++++++++++++ 2023/09/Part2.pm | 26 ++++++++++++++++++++++++++ 2023/09/benchmark.pl | 43 +++++++++++++++++++++++++++++++++++++++++++ 2023/09/part1.t | 17 +++++++++++++++++ 2023/09/part2.t | 24 ++++++++++++++++++++++++ 2023/09/solutions.yml | 2 ++ 6 files changed, 136 insertions(+) create mode 100644 2023/09/Part1.pm create mode 100644 2023/09/Part2.pm create mode 100644 2023/09/benchmark.pl create mode 100644 2023/09/part1.t create mode 100644 2023/09/part2.t create mode 100644 2023/09/solutions.yml diff --git a/2023/09/Part1.pm b/2023/09/Part1.pm new file mode 100644 index 0000000..88ef8c8 --- /dev/null +++ b/2023/09/Part1.pm @@ -0,0 +1,24 @@ +use 5.38.0; + +package Part1; + +use List::AllUtils qw/ all sum /; + +sub predict(@entries) { + my $sum = 0; + + until( all { !$_ } @entries ) { + $sum += $entries[-1]; + @entries = map { $entries[$_]-$entries[$_-1] } 1..$#entries; + } + + return $sum; +} + +sub solution_1 ($input) { + my @lines = map { [split]} split "\n", $input; + + return sum map { predict(@$_) } @lines; +} + +1; diff --git a/2023/09/Part2.pm b/2023/09/Part2.pm new file mode 100644 index 0000000..fd3b804 --- /dev/null +++ b/2023/09/Part2.pm @@ -0,0 +1,26 @@ +use 5.38.0; + +package Part2; + +use Part1; + +use List::AllUtils qw/ all sum /; + +sub predict(@entries) { + my $sum = 0; + + until( all { !$_ } @entries ) { + $sum = $entries[0]-$sum; + @entries = map { $entries[$_]-$entries[$_-1] } 1..$#entries; + } + + return -$sum; +} + +sub solution_2 ($input) { + my @lines = map { [split]} split "\n", $input; + + return sum map { predict(@$_) } @lines; +} + +1; diff --git a/2023/09/benchmark.pl b/2023/09/benchmark.pl new file mode 100644 index 0000000..36ab17c --- /dev/null +++ b/2023/09/benchmark.pl @@ -0,0 +1,43 @@ +use 5.38.0; + +use Benchmark ':hireswallclock'; +use Path::Tiny; +use JSON qw/ to_json /; +use DateTime; +use File::Serialize; + +use Part1; +use Part2; + +my $day = path('.')->absolute->basename =~ s/^0//r; +my $year = path('.')->absolute->parent->basename; +my $solutions = deserialize_file('solutions.yml'); + +my @parts = ( + { part => 1, sub => \&Part1::solution_1, expected => $solutions->{1} }, + { part => 2, sub => \&Part2::solution_2, expected => $solutions->{2} }, +); + +my $input = path('./input')->slurp; + +for my $part (@parts) { + my $res = Benchmark::countit( + 10, + sub { + $part->{sub}->($input) == $part->{expected} or die; + } + ); + + my $result = { + day => $day, + year => $year, + + #variant => '', + language => 'perl', + part => $part->{part}, + time => $res->cpu_a / $res->iters, + timestamp => DateTime->now->iso8601, + }; + say to_json $result; +} + diff --git a/2023/09/part1.t b/2023/09/part1.t new file mode 100644 index 0000000..7ff4614 --- /dev/null +++ b/2023/09/part1.t @@ -0,0 +1,17 @@ +use 5.38.0; + +use Test2::V0; + +use Path::Tiny; + +use Part1; + +my $input = path('input')->slurp; + +is Part1::predict(qw/0 3 6 9 12 15/) => 18; +is Part1::predict(qw/1 3 6 10 15 21/) => 28; +is Part1::predict(qw/10 13 16 21 30 45/) => 68; + +is Part1::solution_1($input) => 'TODO'; + +done_testing; diff --git a/2023/09/part2.t b/2023/09/part2.t new file mode 100644 index 0000000..ec302b1 --- /dev/null +++ b/2023/09/part2.t @@ -0,0 +1,24 @@ +use 5.38.0; + +use Test2::V0; + +use Path::Tiny; + +use Part2; + +my $input = path('input')->slurp; + +is Part2::predict(qw/0 3 6 9 12 15/) => -3; +is Part2::predict(qw/1 3 6 10 15 21/) => 0; +is Part2::predict(qw/10 13 16 21 30 45/) => 5; + +is Part2::solution_2(< 2; +0 3 6 9 12 15 +1 3 6 10 15 21 +10 13 16 21 30 45 +END + +isnt Part2::solution_2($input) => -59; +is Part2::solution_2($input) => 'TODO'; + +done_testing; diff --git a/2023/09/solutions.yml b/2023/09/solutions.yml new file mode 100644 index 0000000..6b32d69 --- /dev/null +++ b/2023/09/solutions.yml @@ -0,0 +1,2 @@ +1: 1884768153 +2: TODO From 66b259d3a2fe9c6bd2c86d94ba3a666499e88a27 Mon Sep 17 00:00:00 2001 From: Yanick Champoux Date: Sat, 9 Dec 2023 12:58:19 -0500 Subject: [PATCH 2/3] part 2 --- 2023/09/Part2.pm | 10 ++++++++-- 2023/09/benchmark.pl | 1 + 2023/09/part1.t | 2 +- 2023/09/part2.t | 2 +- 2023/09/solutions.yml | 2 +- 2023/benchmark.json | 2 ++ 6 files changed, 14 insertions(+), 5 deletions(-) diff --git a/2023/09/Part2.pm b/2023/09/Part2.pm index fd3b804..0009af7 100644 --- a/2023/09/Part2.pm +++ b/2023/09/Part2.pm @@ -9,12 +9,18 @@ use List::AllUtils qw/ all sum /; sub predict(@entries) { my $sum = 0; + my @first = (); + until( all { !$_ } @entries ) { - $sum = $entries[0]-$sum; + push @first, $entries[0]; @entries = map { $entries[$_]-$entries[$_-1] } 1..$#entries; } - return -$sum; + while(@first) { + $sum = pop( @first ) - $sum; + } + + return $sum; } sub solution_2 ($input) { diff --git a/2023/09/benchmark.pl b/2023/09/benchmark.pl index 36ab17c..3ed103e 100644 --- a/2023/09/benchmark.pl +++ b/2023/09/benchmark.pl @@ -36,6 +36,7 @@ for my $part (@parts) { language => 'perl', part => $part->{part}, time => $res->cpu_a / $res->iters, + persec =>$res->iters/$res->cpu_a , timestamp => DateTime->now->iso8601, }; say to_json $result; diff --git a/2023/09/part1.t b/2023/09/part1.t index 7ff4614..f42e331 100644 --- a/2023/09/part1.t +++ b/2023/09/part1.t @@ -12,6 +12,6 @@ is Part1::predict(qw/0 3 6 9 12 15/) => 18; is Part1::predict(qw/1 3 6 10 15 21/) => 28; is Part1::predict(qw/10 13 16 21 30 45/) => 68; -is Part1::solution_1($input) => 'TODO'; +is Part1::solution_1($input) => 1884768153; done_testing; diff --git a/2023/09/part2.t b/2023/09/part2.t index ec302b1..4d67482 100644 --- a/2023/09/part2.t +++ b/2023/09/part2.t @@ -19,6 +19,6 @@ is Part2::solution_2(< 2; END isnt Part2::solution_2($input) => -59; -is Part2::solution_2($input) => 'TODO'; +is Part2::solution_2($input) => 1031; done_testing; diff --git a/2023/09/solutions.yml b/2023/09/solutions.yml index 6b32d69..6887c46 100644 --- a/2023/09/solutions.yml +++ b/2023/09/solutions.yml @@ -1,2 +1,2 @@ 1: 1884768153 -2: TODO +2: 1031 diff --git a/2023/benchmark.json b/2023/benchmark.json index b264505..aeaa9cd 100644 --- a/2023/benchmark.json +++ b/2023/benchmark.json @@ -16,3 +16,5 @@ {"year":"2023","part":2,"language":"perl","day":"6","time":7.07875059716474e-06,"timestamp":"2023-12-06T15:43:13","persec":141267.867298578} {"language":"perl","persec":85.2380952380952,"year":"2023","timestamp":"2023-12-07T16:08:30","time":0.011731843575419,"part":1,"day":"7"} {"day":"7","part":2,"persec":85.2380952380952,"year":"2023","timestamp":"2023-12-07T16:08:43","time":0.011731843575419,"language":"perl"} +{"persec":113.488372093023,"timestamp":"2023-12-09T17:57:35","language":"perl","year":"2023","time":0.00881147540983607,"day":"9","part":1} +{"persec":109.783631232361,"timestamp":"2023-12-09T17:57:47","language":"perl","time":0.00910882604970008,"day":"9","part":2,"year":"2023"} From 09db491ae8b608ad662d11b74d77150d2aeb5611 Mon Sep 17 00:00:00 2001 From: Yanick Champoux Date: Sat, 9 Dec 2023 12:59:25 -0500 Subject: [PATCH 3/3] preset --- 2023/preset/day/templates/perl/benchmark.pl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/2023/preset/day/templates/perl/benchmark.pl b/2023/preset/day/templates/perl/benchmark.pl index 36ab17c..6154f18 100644 --- a/2023/preset/day/templates/perl/benchmark.pl +++ b/2023/preset/day/templates/perl/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,6 +36,7 @@ for my $part (@parts) { language => 'perl', part => $part->{part}, time => $res->cpu_a / $res->iters, + persec => $res->iters / $res->cpu_a, timestamp => DateTime->now->iso8601, }; say to_json $result;