From: Jan "Yenya" Kasprzak Date: Tue, 13 Dec 2022 05:43:04 +0000 (+0100) Subject: Day 13: eval and too long special-casing X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=commitdiff_plain;h=4524faa21cb3a4bb30ae8ebfd05248586b06d352;p=aoc.git Day 13: eval and too long special-casing --- diff --git a/2022/25.pl b/2022/25.pl new file mode 100755 index 0000000..f68c61f --- /dev/null +++ b/2022/25.pl @@ -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 index 0000000..acbc7f7 --- /dev/null +++ b/2022/26.pl @@ -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++; + } +} + + +