use 5.20.0; use Path::Tiny; use Algorithm::Combinatorics qw/ combinations /; use List::AllUtils qw/ sum max /; use 5.20.0; use experimental 'postderef'; my @weapons = ( #Weapons: Cost Damage Armor [ qw/ Dagger 8 4 0 / ], [ qw/ Shortsword 10 5 0/ ], [ qw/ Warhammer 25 6 0/ ], [ qw/ Longsword 40 7 0/ ], [ qw/ Greataxe 74 8 0/ ], ); my @armors = ( #Armor: Cost Damage Armor [ qw/ Leather 13 0 1/ ], [ qw/ Chainmail 31 0 2/ ], [ qw/ Splintmail 53 0 3/ ], [ qw/ Bandedmail 75 0 4/ ], [ qw/ Platemail 102 0 5/ ], ); my @rings = ( #Rings: Cost Damage Armor [ qw/ Damage+1 25 1 0/ ], [ qw/ Damage+2 50 2 0/ ], [ qw/ Damage+3 100 3 0/ ], [ qw/ Defense+1 20 0 1/ ], [ qw/ Defense+2 40 0 2/ ], [ qw/ Defense+3 80 0 3/ ], ); my @boss = map { /(\d+)/ } path('input.txt')->lines; use DDP; p @boss; my $min_price = 1E9; for my $weapon ( @weapons ) { for my $armor ( [], @armors ) { for my $rings( [[]], ( map { [ $_ ] } @rings ), combinations( \@rings, 2 ) ) { my $price = sum map { $_->[1] } $weapon, $armor, $rings->@*; next if $price > $min_price; my @stats = ( 100, map { my $i = $_; sum map { $_->[$i] } $weapon, $armor, $rings->@* } 2,3 ); $min_price = $price if win_fight( \@stats, [ @boss ] ); } } } say $min_price; use experimental 'signatures'; sub win_fight( $me, $opponent ) { p @_; my $damage = max 1, $me->[1] - $opponent->[2]; $opponent->[0] -= $damage; return 1 if $opponent->[0] <= 0; return not win_fight( reverse @_ ); }