use 5.20.0; use List::AllUtils qw/ uniq /; my @lines = <>; chomp for @lines; my $sequence = pop @lines; pop @lines; my %mutation = reverse map { split ' => ' } @lines; my $steps = 0; my @possible = ( $sequence ); my %s = ( $sequence => 0 ); while( not $s{e} ) { use DDP; warn scalar @possible; my $n = shift @possible; warn $n; my @new = mutate($n); for(@new) { next if exists $s{$_}; $s{$_} = $s{$n}+1; push @possible, $_; } @possible = sort { length $a <=> length $b } @possible; } say $s{e}; use experimental 'signatures'; sub mutate($sequence) { my @molecules; while( my( $from, $to ) = each %mutation ) { # warn $from; while( $sequence =~ /\G(.*?)($from)/g ) { push @molecules, $` . $1 . $to . $' } } return @molecules; }