aoc2022

Advent of Code 2022 solutions in Perl.
git clone git://git.samirparikh.com/aoc2022
Log | Files | Refs | README

commit 170a104bdcd9131bc9ca1778b308257ea1be3f7e
parent 5893765b96d79dcd5ada1c5c3cf58ce30e9351be
Author: Samir Parikh <noreply@samirparikh.com>
Date:   Sun,  1 Jan 2023 16:54:26 +0000

start to work on part 1 of day11

Diffstat:
Aday11/day11.pl | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 102 insertions(+), 0 deletions(-)

diff --git a/day11/day11.pl b/day11/day11.pl @@ -0,0 +1,102 @@ +#!/usr/local/bin/perl +# day 2022-11 + +use strict; +use warnings; +use v5.32; +#use Data::Dumper; +#$Data::Dumper::Indent = 1; +use Log::Log4perl (); +use Log::Log4perl::Level (); + +Log::Log4perl->easy_init(Log::Log4perl::Level::to_priority( 'DEBUG' )); +my $logger = Log::Log4perl->get_logger(); + +@ARGV = "input" unless @ARGV; +$/ = ''; # set to paragraph mode. Each monkey is treated as one record +my @input = <>; + +my $ITEMS = "items"; +my $OPERATION = "Operation"; +my $TEST = "Test"; +my $TRUE = "true"; +my $FALSE = "false"; +my $ROUNDS = 1; + +sub init_monkeys { + my @input = @_; + my @monkeys; + foreach my $monkey ( @input ) { + my %monkey; + foreach my $attribute ( split /\n/, $monkey ) { + next if ( $attribute =~ m/Monkey/ ); + my ( $key, $value ) = split /:/ => $attribute; + if ( $key =~ m/$ITEMS/ ) { + $value =~ s/\s//g; + $monkey{ $ITEMS } = [ split /,/ => $value ]; + } elsif ( $key =~ m/$OPERATION/ ) { + my %operation; + my ( $operation, $operand ) = $value =~ m/(\+|\*) (.+)/; + $monkey{ $OPERATION } = { "operation" => $operation, + "operand" => $operand, + }; + } elsif ( $key =~ m/$TEST/ ) { + ( $monkey{ $TEST } ) = $value =~ m/(\d+)/; + } elsif ( $key =~ m/$TRUE/ ) { + ( $monkey{ $TRUE } ) = $value =~ m/(\d+)/; + } elsif ( $key =~ m/$FALSE/ ) { + ( $monkey{ $FALSE } ) = $value =~ m/(\d+)/; + } else { + die "Could not parse attribute $attribute"; + } + } + push @monkeys => \%monkey; + } + return @monkeys; +} + +my @monkeys1 = init_monkeys( @input ); +#foreach my $monkey ( @monkeys1 ) { +# say "@{ $monkey->{$ITEMS} }"; +#} + +foreach my $round ( 1 .. $ROUNDS ) { + my $num = 0; # extra + foreach my $monkey ( @monkeys1 ) { + $logger->debug( "Monkey $num:" ); + while ( @{ $monkey->{ $ITEMS } } ) { + my $item = shift @{ $monkey->{ $ITEMS } }; + $logger->debug( " Monkey inspects an item with a worry level of $item." ); +# say "operation is ", $monkey->{ $OPERATION }{ operation }; +# say "operand is ", $monkey->{ $OPERATION }{ operand }; + my $expression = join " ", + $item, + $monkey->{ $OPERATION }{ operation }, + $monkey->{ $OPERATION }{ operand } eq 'old' ? $item : + $monkey->{ $OPERATION }{ operand }; + #say $expression; + #my $result = eval $expression; + #say "$expression = $result"; + $item = eval $expression; + $logger->debug( " Worry level is now $item." ); + $item = int( $item / 3 ); + $logger->debug(" Monkey gets bored with item. Worry level is divided by 3 to $item."); + } + $num++; # extra + } +} +#say Dumper \@monkeys1; +# +# +#my $operation = '+'; +#my $arg1 = 2; +#my $arg2 = 5; +# +#my $expression = join " ", $arg1, $operation, $arg2; +##my $expression = '$arg1 $operation $arg2'; +#say $expression; +# +#my $result = eval $expression; +#say $result; +# +#say int (10/3);