]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 13: eval and too long special-casing
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Tue, 13 Dec 2022 05:43:04 +0000 (06:43 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Tue, 13 Dec 2022 05:43:04 +0000 (06:43 +0100)
2022/25.pl [new file with mode: 0755]
2022/26.pl [new file with mode: 0755]

diff --git a/2022/25.pl b/2022/25.pl
new file mode 100755 (executable)
index 0000000..f68c61f
--- /dev/null
@@ -0,0 +1,50 @@
+#!/usr/bin/perl -w
+
+use v5.36;
+use strict;
+use experimental 'multidimensional';
+
+local $/ = "\n\n";
+
+my $sum;
+while (<>) {
+       my ($l, $r) = map { eval $_ } split /\n/;
+
+       $sum += $. if compare($l,$r) == 1;
+
+}
+say $sum;
+
+sub compare($l, $r) {
+       my $i = 0;
+       my $rv = 0;
+       while (1) {
+               my $lv = $l->[$i];
+               my $rv = $r->[$i];
+
+               my $comp;
+               if (!defined $lv && defined $rv) {
+                       return 1;
+               } elsif (defined $lv && !defined $rv) {
+                       return -1;
+               } elsif (!defined $lv && !defined $rv) {
+                       return undef;
+               } elsif (ref $lv && ref $rv) {
+                       $comp = compare($lv, $rv);
+               } elsif (ref $lv && !ref $rv) {
+                       $comp = compare($lv, [$rv]);
+               } elsif (!ref $lv && ref $rv) {
+                       $comp = compare([$lv], $rv);
+               } elsif (!ref $lv && !ref $rv) {
+                       $comp = $rv <=> $lv if $lv != $rv;
+               } else {
+                       die "$lv $rv";
+               }
+                       
+               return $comp if defined $comp;
+               $i++;
+       }
+}
+                       
+
+       
diff --git a/2022/26.pl b/2022/26.pl
new file mode 100755 (executable)
index 0000000..acbc7f7
--- /dev/null
@@ -0,0 +1,50 @@
+#!/usr/bin/perl -w
+
+use v5.36;
+use strict;
+use experimental 'multidimensional';
+
+my @lists = map { bless $_, 'Sep' } [[2]], [[6]];
+push @lists, map { eval $_ } grep { length } <>;
+@lists = sort { compare($b, $a) } @lists;
+
+my $m = 1;
+for my $i (0 .. $#lists) {
+       $m *= $i+1 if ref $lists[$i] eq 'Sep';
+}
+
+say $m;
+
+sub compare($l, $r) {
+       my $i = 0;
+       my $rv = 0;
+       while (1) {
+               my $lv = $l->[$i];
+               my $rv = $r->[$i];
+
+               my $comp;
+               if (!defined $lv && defined $rv) {
+                       return 1;
+               } elsif (defined $lv && !defined $rv) {
+                       return -1;
+               } elsif (!defined $lv && !defined $rv) {
+                       return 0;
+               } elsif (ref $lv && ref $rv) {
+                       $comp = compare($lv, $rv);
+               } elsif (ref $lv && !ref $rv) {
+                       $comp = compare($lv, [$rv]);
+               } elsif (!ref $lv && ref $rv) {
+                       $comp = compare([$lv], $rv);
+               } elsif (!ref $lv && !ref $rv) {
+                       $comp = $rv <=> $lv if $lv != $rv;
+               } else {
+                       die "$lv $rv";
+               }
+                       
+               return $comp if defined $comp;
+               $i++;
+       }
+}
+                       
+
+