]> www.fi.muni.cz Git - aoc.git/blob - 2022/26.pl
Day 13: eval and too long special-casing
[aoc.git] / 2022 / 26.pl
1 #!/usr/bin/perl -w
2
3 use v5.36;
4 use strict;
5 use experimental 'multidimensional';
6
7 my @lists = map { bless $_, 'Sep' } [[2]], [[6]];
8 push @lists, map { eval $_ } grep { length } <>;
9 @lists = sort { compare($b, $a) } @lists;
10
11 my $m = 1;
12 for my $i (0 .. $#lists) {
13         $m *= $i+1 if ref $lists[$i] eq 'Sep';
14 }
15
16 say $m;
17
18 sub compare($l, $r) {
19         my $i = 0;
20         my $rv = 0;
21         while (1) {
22                 my $lv = $l->[$i];
23                 my $rv = $r->[$i];
24
25                 my $comp;
26                 if (!defined $lv && defined $rv) {
27                         return 1;
28                 } elsif (defined $lv && !defined $rv) {
29                         return -1;
30                 } elsif (!defined $lv && !defined $rv) {
31                         return 0;
32                 } elsif (ref $lv && ref $rv) {
33                         $comp = compare($lv, $rv);
34                 } elsif (ref $lv && !ref $rv) {
35                         $comp = compare($lv, [$rv]);
36                 } elsif (!ref $lv && ref $rv) {
37                         $comp = compare([$lv], $rv);
38                 } elsif (!ref $lv && !ref $rv) {
39                         $comp = $rv <=> $lv if $lv != $rv;
40                 } else {
41                         die "$lv $rv";
42                 }
43                         
44                 return $comp if defined $comp;
45                 $i++;
46         }
47 }
48                         
49
50