AoC 2023 D8P1: Traversing a Digraph

Day 8 part 1 gives us a directed graph of nodes with links to two (hopefully other) nodes and a set of dance moves to perform through the graph; how many steps to get from AAA to ZZZ at the end of a dance pattern? (A lot more steps if you stray into DDD, EEE, or GGG.)

RL

AAA = (BBB, CCC)
BBB = (DDD, EEE)
CCC = (ZZZ, GGG)
DDD = (DDD, DDD)
EEE = (EEE, EEE)
GGG = (GGG, GGG)
ZZZ = (ZZZ, ZZZ)

All one need do is make a hash of the nodes with their branches, then dance through it.

my %index = ( L => 0, R => 1 );

The dance moves are specified as L or R and for no particular reason I decided to save the branches as arrays instead of hashes, so I prepare to translate dance moves into array indices. Why on earth did I call this %index instead of %dirindex or %dir? Because I had just woken up and it was time to do AoC? Probably.

$_ = <>; chomp;
my @instr = map { $index{$_} } split(//);

<>;

I grab the dance moves, translate them from directions to indices, and toss the following blank line.

my %map;
while (<>) {
my ($node, $l, $r) = /(\w{3})/g;
$map{$node} = [ $l, $r ];
}

Then read in and save all the nodes.

my $count = 0;
my $pos = "AAA";

until ($count % @instr == 0 && $pos eq "ZZZ") {
$pos = $map{$pos}[$instr[$count++ % @instr]];
}

Finally, start at AAA; take steps, counting as I go (and using the modulus of the number of dance moves in the pattern); and stop at ZZZ only if it's the end of this dance pattern.

Full Program

#!/usr/bin/perl

use warnings;
use strict;

my %index = ( L => 0, R => 1 );

$_ = <>; chomp;
my @instr = map { $index{$_} } split(//);

<>;

my %map;
while (<>) {
my ($node, $l, $r) = /(\w{3})/g;
$map{$node} = [ $l, $r ];
}

my $count = 0;
my $pos = "AAA";

until ($count % @instr == 0 && $pos eq "ZZZ") {
$pos = $map{$pos}[$instr[$count++ % @instr]];
}

print "$count steps\n";

Leave a Reply