--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.42;
+
+my %beams;
+($_ = <>) =~ /S/g;
+$beams{pos()-1}++;
+
+my $splits;
+while (<>) {
+ my %newb;
+ for my $b (keys %beams) {
+ if (substr($_, $b, 1) eq '^') {
+ $newb{$b-1}++ if $b > 0;
+ $newb{$b+1}++ if $b < length;
+ $splits++;
+ } else {
+ $newb{$b}++;
+ }
+ }
+ %beams = %newb;
+}
+say $splits;
--- /dev/null
+#!/usr/bin/perl -w
+
+use v5.42;
+use List::Util qw(sum);
+
+my %beams;
+($_ = <>) =~ /S/g;
+$beams{pos()-1}++;
+
+while (<>) {
+ my %newb;
+ for my $b (keys %beams) {
+ if (substr($_, $b, 1) eq '^') {
+ $newb{$b-1} += $beams{$b} if $b > 0;
+ $newb{$b+1} += $beams{$b} if $b < length;
+ } else {
+ $newb{$b} += $beams{$b};
+ }
+ }
+ %beams = %newb;
+}
+say sum values %beams;