t Merge branch '2023-08'
This commit is contained in:
commit
be223b6cef
120
2023/08/Part2.pm
120
2023/08/Part2.pm
@ -4,32 +4,124 @@ package Part2;
|
||||
|
||||
use Part1;
|
||||
|
||||
use List::AllUtils qw/all /;
|
||||
use List::AllUtils qw/all first_index none min max product /;
|
||||
use List::UtilsBy qw/ min_by max_by /;
|
||||
use Math::Utils qw/ lcm /;
|
||||
|
||||
sub get_cycle( $current, $directions, $nodes ) {
|
||||
|
||||
my @tracks;
|
||||
my $next_index = 0;
|
||||
|
||||
while() {
|
||||
my $t = join '-', $current,$next_index;
|
||||
my $i = first_index { $_ eq $t } @tracks;
|
||||
if( $i > -1 ) {
|
||||
my $c = 0;
|
||||
# p @tracks;
|
||||
# warn $i, " ",$t;
|
||||
return $i, map {
|
||||
$c++;
|
||||
if(/Z-/) {
|
||||
my $x = $c; $c = 0; $x;
|
||||
}else {
|
||||
()
|
||||
}
|
||||
} splice @tracks, $i;
|
||||
}
|
||||
push @tracks, $t;
|
||||
$current = $nodes->{$current}[ $directions->[ $next_index ] ];
|
||||
$next_index = ( $next_index+1)% @$directions;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
sub find_z($current,$next_index,$directions,$nodes) {
|
||||
|
||||
my $visited = 0;
|
||||
|
||||
while ( ) {
|
||||
$visited++;
|
||||
|
||||
$current =
|
||||
$nodes->{$current}[ $directions->[ $next_index++ % @$directions ] ];
|
||||
|
||||
last if $current =~ /Z$/
|
||||
}
|
||||
|
||||
return $visited, $current, $next_index;
|
||||
}
|
||||
sub speedrun($current,$next_index,$directions,$nodes,$n) {
|
||||
|
||||
$current =
|
||||
$nodes->{$current}[ $directions->[ $next_index++ % @$directions ] ]
|
||||
for 1..$n;
|
||||
|
||||
return $current;
|
||||
}
|
||||
|
||||
sub equation_for($current,$directions,$nodes) {
|
||||
|
||||
my $visited = 0;
|
||||
my $next_index=0;
|
||||
|
||||
while ( ) {
|
||||
$visited++;
|
||||
|
||||
$current =
|
||||
$nodes->{$current}[ $directions->[ $next_index++ % @$directions ] ];
|
||||
|
||||
last if $current =~ /Z$/
|
||||
}
|
||||
|
||||
my $first = $visited;
|
||||
$visited = 0;
|
||||
|
||||
while ( ) {
|
||||
$visited++;
|
||||
|
||||
$current =
|
||||
$nodes->{$current}[ $directions->[ $next_index++ % @$directions ] ];
|
||||
|
||||
last if $current =~ /Z$/
|
||||
}
|
||||
|
||||
my $entry = { b => $first, m => $visited };
|
||||
return $entry;
|
||||
}
|
||||
|
||||
|
||||
sub solution_2 ($input) {
|
||||
my $p = Part1::parse_input($input);
|
||||
my @directions = $p->{directions}->@*;
|
||||
my %nodes = $p->{nodes}->%*;
|
||||
|
||||
my $visited = 0;
|
||||
my $steps = 0;
|
||||
my @paths = grep { /A$/ } keys %nodes;
|
||||
my $next_index = 0;
|
||||
my @current = grep { /A$/ } keys %nodes;
|
||||
|
||||
until ( all { /Z$/ } @current ) {
|
||||
# use DDP; p @current;
|
||||
# my $foo = <>;
|
||||
$visited++;
|
||||
my @equations = map { equation_for($_,\@directions,\%nodes) } @paths;
|
||||
|
||||
@current = map {
|
||||
$nodes{$_}->[ $directions[ $next_index % @directions ] ]
|
||||
} @current;
|
||||
$next_index++;
|
||||
return lcm map { $_->{b} } @equations;
|
||||
|
||||
for(@equations) {
|
||||
$_->{i} = 1;
|
||||
$_->{total} = $_->{b}+$_->{m};
|
||||
}
|
||||
|
||||
return $visited;
|
||||
until( all { $_->{total} == $equations[0]->{total} } @equations ) {
|
||||
my $i = max map { $_->{total} } @equations;
|
||||
|
||||
for(@equations) {
|
||||
while( $_->{total}<$i) {
|
||||
$_->{total}+=$_->{m};
|
||||
}
|
||||
}
|
||||
# use DDP; p @equations;
|
||||
}
|
||||
|
||||
$equations[0]->{total};
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
1;
|
||||
|
@ -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;
|
||||
|
@ -8,10 +8,7 @@ use File::Serialize;
|
||||
use Part2;
|
||||
|
||||
my $input = path('input')->slurp;
|
||||
my $example = path('example')->slurp;
|
||||
my %solutions = deserialize_file('solutions.yml')->%*;
|
||||
|
||||
is Part2::solution_2(<<'END') => 6;
|
||||
my $example = <<END;
|
||||
LR
|
||||
|
||||
11A = (11B, XXX)
|
||||
@ -23,6 +20,24 @@ LR
|
||||
22Z = (22B, 22B)
|
||||
XXX = (XXX, XXX)
|
||||
END
|
||||
my %solutions = deserialize_file('solutions.yml')->%*;
|
||||
|
||||
|
||||
my $parsed = Part1::parse_input($example);
|
||||
#is [Part2::get_cycle('11A',$parsed->{directions},$parsed->{nodes})] => [1,2];
|
||||
##use DDP; my @x = Part2::get_cycle('22A',$parsed->{directions},$parsed->{nodes});p @x;
|
||||
#is [Part2::get_cycle('22A',$parsed->{directions},$parsed->{nodes})] => [1,2,3];
|
||||
|
||||
|
||||
#is Part2::solution_2($example) => 6;
|
||||
|
||||
$parsed = Part1::parse_input($input);
|
||||
|
||||
# my @initial = grep { /A$/ } keys $parsed->{nodes}->%*;
|
||||
# for (@initial ) {
|
||||
# say join " ", Part2::get_cycle($_,$parsed->{directions},$parsed->{nodes});
|
||||
# }
|
||||
|
||||
|
||||
is Part2::solution_2($input) => $solutions{2};
|
||||
|
||||
|
@ -1,2 +1,2 @@
|
||||
1: 19631
|
||||
2: TODO
|
||||
2: 21003205388413
|
||||
|
@ -18,3 +18,6 @@
|
||||
{"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"}
|
||||
{"day":"8","persec":131.374407582938,"language":"perl","part":1,"time":0.00761183261183261,"timestamp":"2023-12-09T19:45:23","year":"2023"}
|
||||
{"day":"8","language":"perl","time":0.0874789915966387,"year":"2023","timestamp":"2023-12-09T20:31:05","persec":11.431316042267,"part":2}
|
||||
|
||||
|
1
2023/cpanfile
Normal file
1
2023/cpanfile
Normal file
@ -0,0 +1 @@
|
||||
requires 'Math::Utils';
|
Loading…
Reference in New Issue
Block a user