From: Jan "Yenya" Kasprzak <kas@fi.muni.cz>
Date: Wed, 21 Dec 2022 07:20:00 +0000 (+0100)
Subject: Day 21: first ugly eval-based working solution
X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=commitdiff_plain;h=c70806ca2cc711af94959df301c7c66eb687f381;p=aoc.git

Day 21: first ugly eval-based working solution
---

diff --git a/2022/41.pl b/2022/41.pl
new file mode 100755
index 0000000..0603f02
--- /dev/null
+++ b/2022/41.pl
@@ -0,0 +1,31 @@
+#!/usr/bin/perl -w
+
+use v5.36;
+use strict;
+
+my %names;
+my %vals;
+while (<>) {
+	chomp;
+	my ($name, $rest) = split /:/;
+	$names{$name} = $rest;
+	$vals{$name} = 0+$rest if $rest =~ /\A\s*\d+\z/;
+}
+
+while (!defined $vals{root}) {
+	for my $n (keys %names) {
+		next if defined $vals{$n};
+		my $e = $names{$n};
+		my $d = 1;
+		for my $v (keys %vals) {
+			$e =~ s/$v/$vals{$v}/g;
+		}
+		next if $e =~ /[a-z]/;
+		say "eval $e";
+		eval "\$vals{$n} = $e";
+		say "set \$vals{$n} to $vals{$n}" unless $@;
+	}
+	say " ================= ";
+}
+
+say $vals{root};
diff --git a/2022/42.pl b/2022/42.pl
new file mode 100755
index 0000000..3611405
--- /dev/null
+++ b/2022/42.pl
@@ -0,0 +1,81 @@
+#!/usr/bin/perl -w
+
+use v5.36;
+use strict;
+
+undef $SIG{__WARN__};
+my %names;
+my %vals;
+while (<>) {
+	chomp;
+	my ($name, $rest) = split /:/;
+	$names{$name} = $rest;
+	$vals{$name} = 0+$rest if $rest =~ /\A\s*\d+\z/;
+}
+
+delete $vals{humn};
+$names{humn} = 'xx';
+
+while (!defined $vals{root}) {
+	my $added;
+	for my $n (keys %names) {
+		no warnings;
+		next if defined $vals{$n};
+		my $e = $names{$n};
+		my $d = 1;
+		for my $v (keys %vals) {
+			$e =~ s/$v/$vals{$v}/g;
+			$names{$n} = $e;
+		}
+		next if $e =~ /[a-z]/;
+		
+		eval "\$vals{$n} = $e";
+		# say "set \$vals{$n} to $vals{$n}" unless $@;
+		$added = 1;
+	}
+	last if !$added;
+}
+
+for my $n (sort keys %names) {
+	say "$n = ", defined $vals{$n} ? $vals{$n} : $names{$n};
+}
+
+my ($val) = $names{root} =~ /(\d+)/;
+my ($var) = $names{root} =~ /([a-z]+)/;
+while (defined $var) {
+	say "$var = $val, var = $names{$var}";
+	my ($arg1, $op, $arg2) = $names{$var} =~ /(\w+)\s+(\S)\s+(\w+)/;
+	say "-> $arg1 $op $arg2";
+	if ($arg2 =~ /\d/) {
+		$var = $arg1;
+		if ($op eq '/') {
+			$val = $val * $arg2;
+		} elsif ($op eq '*') {
+			$val = $val / $arg2;
+		} elsif ($op eq '+') {
+			$val = $val - $arg2;
+		} elsif ($op eq '-') {
+			$val = $val + $arg2;
+		}
+		say "var $var = $val";
+	} elsif ($arg1 =~ /\d/) {
+		$var = $arg2;
+		if ($op eq '/') {
+			$val = $arg1 / $val;
+		} elsif ($op eq '*') {
+			$val = $val / $arg1;
+		} elsif ($op eq '+') {
+			$val = $val - $arg1;
+		} elsif ($op eq '-') {
+			$val = $arg1 - $val;
+		}
+		say "var $var = $val";
+		if ($var eq 'humn') {
+			$vals{humn} = $val;
+			last;
+		}
+	} else {
+		last;
+	}
+}
+say $vals{humn};