From 4524faa21cb3a4bb30ae8ebfd05248586b06d352 Mon Sep 17 00:00:00 2001 From: "Jan \"Yenya\" Kasprzak" Date: Tue, 13 Dec 2022 06:43:04 +0100 Subject: [PATCH] Day 13: eval and too long special-casing --- 2022/25.pl | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2022/26.pl | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100755 2022/25.pl create mode 100755 2022/26.pl 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++; + } +} + + + -- 2.43.5