From: Jan "Yenya" Kasprzak Date: Tue, 10 Dec 2024 06:00:51 +0000 (+0100) Subject: Day 9: array splicing. Quite ugly. X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=commitdiff_plain;h=cdc7d431e6feed62fbb8eaf6610f6d952fd6edab;p=aoc.git Day 9: array splicing. Quite ugly. --- diff --git a/2024/17.pl b/2024/17.pl new file mode 100755 index 0000000..057c733 --- /dev/null +++ b/2024/17.pl @@ -0,0 +1,42 @@ +#!/usr/bin/perl -w + +use v5.40; + +chomp (my $line = <>); +my $i = 0; +my @blk = map { [ $i++, $_ ] } split //, $line; + +my $bno = 0; +my $csum; +sub add_blk($id, $count) { + die "$id" if $id % 2; + $id = $id/2; + $csum += ($bno++ * $id) for (1 .. $count); +} + +my $freesp = 0; +while (@blk) { + if (!$freesp) { + my $b = shift @blk; + add_blk(@$b); + last if !@blk; + $freesp = (shift @blk)->[1]; + } + + my ($eid, $ecnt) = $blk[-1]->@*; + if ($freesp < $ecnt) { + $blk[-1]->[1] -= $freesp; + add_blk($blk[-1]->[0], $freesp); + $freesp = 0; + } else { + last if !@blk; + my $b = pop @blk; + add_blk(@$b); + $freesp -= $b->[1]; + last if !@blk; + pop @blk; + } +} + +say $csum; + diff --git a/2024/18.pl b/2024/18.pl new file mode 100755 index 0000000..fc01063 --- /dev/null +++ b/2024/18.pl @@ -0,0 +1,51 @@ +#!/usr/bin/perl -w + +use v5.40; + +chomp (my $line = <>); +my $i = 0; +my @blk = map { [ $i++, $_ ] } split //, $line; + +my $mfile = $#blk; +my %seen; +while ($mfile) { + my ($id, $count) = $blk[$mfile]->@*; + if ($seen{$id}++) { + $mfile -= 2; + next; + } + + my $freesp = 1; + while ($freesp < $mfile) { + if ($blk[$freesp]->[1] >= $count) { + if ($mfile < $#blk) { + my $free = $blk[$mfile+1]->[1]; + splice @blk, $mfile+1, 1; + if ($mfile) { + $blk[$mfile-1]->[1] += $free + $count; + } + } + splice @blk, $mfile, 1; + my $free = $blk[$freesp]->[1]; + splice @blk, $freesp, 1, [ -1, 0 ], [ $id, $count ], + [ -1, $free - $count ]; + last; + } + $freesp += 2; + } +} + +my $csum = 0; +$i = 0; +my $bno = 0; +while ($i < @blk) { + my ($id, $count) = $blk[$i++]->@*; + $id /= 2; + $csum += ($bno++ * $id) for (1 .. $count); + + last if $i >= @blk; + ($id, $count) = $blk[$i++]->@*; + $bno += $count; +} +say $csum; +