#!/usr/bin/perl -w
use v5.16;
-use List::Util qw(sum0);
chomp (my $tmpl = <>);
scalar <>;
-my (%r1, %r2, %ins);
+my %rules;
while (<>) {
chomp;
- my ($s1, $s2, $d) = /([A-Z])/g;
- $r1{"$s1$s2"} = "$s1$d";
- $r2{"$s1$s2"} = "$d$s2";
- $ins{"$s1$s2"} = $d;
+ my ($s1, $s2, $d) = /[A-Z]/g;
+ $rules{"$s1$s2"} = [ "$s1$d", "$d$s2", $d ];
}
-my %count;
-my %p;
+my (%pairs, %count);
for my $i (0 .. length($tmpl) - 2) {
- $p{substr($tmpl, $i, 2)}++;
+ $pairs{substr($tmpl, $i, 2)}++;
$count{substr($tmpl, $i, 1)}++;
}
$count{substr($tmpl, -1, 1)}++;
for (1 .. 40) {
- my %p1;
- for my $pair (keys %p) {
- if ($r1{$pair}) {
- $p1{$r1{$pair}} += $p{$pair};
- $p1{$r2{$pair}} += $p{$pair};
- $count{$ins{$pair}} += $p{$pair};
- }
+ my %newp;
+ for my $pair (grep { $rules{$_} } keys %pairs) {
+ my $rule = $rules{$pair};
+ $newp{ $rule->[0] } += $pairs{$pair};
+ $newp{ $rule->[1] } += $pairs{$pair};
+ $count{ $rule->[2] } += $pairs{$pair};
}
- %p = %p1;
+ %pairs = %newp;
}
my @count = sort { $a <=> $b } values %count;
-
say $count[-1] - $count[0];