#!/usr/local/bin/perl # day 2022-02 use strict; use warnings; use v5.32; @ARGV = "input" unless @ARGV; chomp( my $input = do { local $/; <> } ); my %defeats = ( rock => 'scissors', scissors => 'paper', paper => 'rock', ); my %translate = ( A => 'rock', B => 'paper', C => 'scissors', X => 'rock', Y => 'paper', Z => 'scissors', ); my %translate2 = ( X => 'lost', Y => 'draw', Z => 'won', ); my %score = ( rock => 1, paper => 2, scissors => 3, lost => 0, draw => 3, won => 6, ); my @rounds = split /\n/, $input; my $part1_score = 0; my $part2_score = 0; foreach my $round ( @rounds ) { my ( $opponent, $me ) = split /\s/, $round; $part1_score += $score{ $translate{ $me } }; if ( $translate{ $me } eq $translate{ $opponent } ) { $part1_score += $score{ draw }; } elsif ( $defeats{ $translate{ $me } } eq $translate{ $opponent } ) { $part1_score += $score{ won }; } $part2_score += $score{ $translate2{ $me } }; if ( $me eq 'X' ) { # must lose $part2_score += $score{ $defeats{ $translate{ $opponent } } }; } elsif ( $me eq 'Y' ) { # draw $part2_score += $score{ $translate{ $opponent } }; } else { # win my @matching_keys = grep { $defeats{ $_ } eq $translate{ $opponent} } keys %defeats; $part2_score += $score{ $matching_keys[0] }; } } say "part 1: ", $part1_score; say "part 2: ", $part2_score;