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:
A | day11/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);