day 11
This commit is contained in:
parent
919f966ec3
commit
f998add903
49
2024/11/Part1.pm
Normal file
49
2024/11/Part1.pm
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
use lib '../../perl-lib';
|
||||||
|
|
||||||
|
use 5.36.0;
|
||||||
|
|
||||||
|
package Part1;
|
||||||
|
|
||||||
|
use List::AllUtils qw/ sum /;
|
||||||
|
|
||||||
|
use Moo;
|
||||||
|
|
||||||
|
extends 'AoC::Puzzle';
|
||||||
|
|
||||||
|
has '+input' => default => sub ($self) {
|
||||||
|
[ split ' ', $self->path_file->slurp ];
|
||||||
|
};
|
||||||
|
|
||||||
|
has nbr_iterations => is => 'ro', default => 25;
|
||||||
|
|
||||||
|
sub evolve ( $self, $stone ) {
|
||||||
|
return (1) if $stone == 0;
|
||||||
|
return ( $stone * 2024 ) if length($stone) % 2;
|
||||||
|
|
||||||
|
my $x = $stone % 10**( length($stone) / 2 );
|
||||||
|
my $y = int( $stone / 10**( length($stone) / 2 ) );
|
||||||
|
return ( $y, $x );
|
||||||
|
}
|
||||||
|
|
||||||
|
sub print_line ( $self, @stones ) {
|
||||||
|
say join " ", @stones;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub solve ($self) {
|
||||||
|
my @stones = $self->input->@*;
|
||||||
|
|
||||||
|
my %stones;
|
||||||
|
$stones{$_}++ for @stones;
|
||||||
|
|
||||||
|
for ( 1 .. $self->nbr_iterations ) {
|
||||||
|
my %new_stones;
|
||||||
|
for my $stone ( keys %stones ) {
|
||||||
|
$new_stones{$_} += $stones{$stone} for $self->evolve($stone);
|
||||||
|
}
|
||||||
|
%stones = %new_stones;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sum values %stones;
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
13
2024/11/Part2.pm
Normal file
13
2024/11/Part2.pm
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
use lib '.';
|
||||||
|
|
||||||
|
use 5.36.0;
|
||||||
|
|
||||||
|
package Part2;
|
||||||
|
|
||||||
|
use Moo;
|
||||||
|
|
||||||
|
extends 'Part1';
|
||||||
|
|
||||||
|
has '+nbr_iterations' => default => 75;
|
||||||
|
|
||||||
|
1;
|
16
2024/11/benchmark.pl
Executable file
16
2024/11/benchmark.pl
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
use 5.36.0;
|
||||||
|
|
||||||
|
use Benchmark qw/ timethis timeit /;
|
||||||
|
|
||||||
|
use lib qw~ . ~;
|
||||||
|
|
||||||
|
use Part1;
|
||||||
|
use Part2;
|
||||||
|
|
||||||
|
use Path::Tiny;
|
||||||
|
use File::Serialize;
|
||||||
|
my $res;
|
||||||
|
$res = timethis(0, sub { Part1->new(file=>'input')->solve }, 'part 1');
|
||||||
|
$res = timethis(0, sub { Part2->new(file=>'input')->solve }, 'part 2');
|
21
2024/11/test.t
Normal file
21
2024/11/test.t
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
use lib qw~ . ~;
|
||||||
|
|
||||||
|
use Part1;
|
||||||
|
use Part2;
|
||||||
|
|
||||||
|
use Test2::V0;
|
||||||
|
use Path::Tiny;
|
||||||
|
use File::Serialize;
|
||||||
|
|
||||||
|
my $solutions = deserialize_file './solutions.yml';
|
||||||
|
|
||||||
|
subtest 'part 1' => sub {
|
||||||
|
is( Part1->new(input=>[125,17])->solve() => 55312 );
|
||||||
|
is( Part1->new(file=>'input')->solve() => $solutions->{part1} );
|
||||||
|
};
|
||||||
|
|
||||||
|
subtest 'part 2' => sub {
|
||||||
|
is( Part2->new(file=>'input')->solve() => $solutions->{part2});
|
||||||
|
};
|
||||||
|
|
||||||
|
done_testing();
|
Loading…
Reference in New Issue
Block a user