#!/usr/local/bin/perl # day 2022-03 use strict; use warnings; use v5.32; @ARGV = "input" unless @ARGV; chomp( my $input = do { local $/; <> } ); my @rucksacks = split /\n/, $input; my $part1 = 0; my $part2 = 0; my $elf_count = 0; my $combined = ''; foreach my $rucksack ( @rucksacks ) { my $compartment1 = substr( $rucksack, 0, ( length $rucksack ) / 2 ); my $compartment2 = substr( $rucksack, ( length $rucksack ) / 2 ); foreach my $item ( split //, $compartment1 ) { if ( $compartment2 =~ m/$item/ ) { if ( $item =~ m/[a-z]/ ) { $part1 += ord( $item ) - ord( 'a' ) + 1; } else { $part1 += ord( $item ) - ord( 'A' ) + 27; } last; } } # see https://abigail.github.io/HTML/AdventOfCode/2022/day-03.html $combined .= $rucksack . "\n"; $elf_count++; if ( $elf_count % 3 == 0 ) { my ( $badge ) = $combined =~ m/(.).*\n.*\1.*\n.*\1/; $part2 += ( $badge =~ m/[a-z]/ ) ? ord( $badge ) - ord( 'a' ) + 1 : ord( $badge ) - ord( 'A' ) + 27; $combined = ''; } } say "part 1: ", $part1; say "part 2: ", $part2;