]> www.fi.muni.cz Git - aoc.git/commitdiff
Day 20: alternative solution wit list of pairs - slower but prettier
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Tue, 20 Dec 2022 09:18:17 +0000 (10:18 +0100)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Tue, 20 Dec 2022 09:18:17 +0000 (10:18 +0100)
2022/39.pl
2022/40.pl

index b60d35f1efe7363c4325220fe11a6b96e71bb282..7f673d79e7f3f0a87a987360dfc87dc66d402708 100755 (executable)
@@ -3,27 +3,24 @@
 use v5.36;
 use strict;
 
-chomp(my @list = <>);
-my @perm = ( 0 .. $#list );
+my $i = 0;
+my @list = map { chomp; [$i++, $_] } <>;
 
 for my $idx (0 .. $#list) {
-       my $move = $list[$idx];
-       my $pos = 0;
-       $pos++ while $perm[$pos] != $idx;
-       splice(@perm, $pos, 1);
-       my $dst = ($pos + $move) % @perm;
-       splice(@perm, $dst, 0, $idx);
+       my $i = 0;
+       $i++ while $list[$i][0] != $idx;
+       my $item = splice @list, $i, 1;
+       my $dest = ($item->[1] + $i) % @list;
+       splice @list, $dest, 0, $item;
 }
 
-my @ordered = map { $list[$perm[$_]] } 0 .. $#list;
-
-my $i = 0;
-$i++ while $ordered[$i] != 0;
+$i = 0;
+$i++ while $list[$i][1] != 0;
 my $sum;
 for (1 .. 3) {
        $i += 1000;
-       $i %= @ordered;
-       $sum += $ordered[$i];
+       $i %= @list;
+       $sum += $list[$i][1];
 }
 
 say $sum;
index b6e9ff429e77485cdecc5346f277930fbbec0697..5451455a5ea0d9105c5e7b3697f79ed6ba48177d 100755 (executable)
@@ -4,30 +4,26 @@ use v5.36;
 use strict;
 
 my $key = 811589153;
-my @list = map { $key * $_ } <>;
-my @perm = ( 0 .. $#list );
+my $i = 0;
+my @list = map { [$i++, $key * $_] } <>;
 
 for (1 .. 10) {
        for my $idx (0 .. $#list) {
-               my $move = $list[$idx];
-               my $pos = 0;
-               $pos++ while $perm[$pos] != $idx;
-               splice(@perm, $pos, 1);
-               my $dst = ($pos + $move) % @perm;
-               splice(@perm, $dst, 0, $idx);
+               my $i = 0;
+               $i++ while $list[$i][0] != $idx;
+               my $item = splice @list, $i, 1;
+               my $dest = ($item->[1] + $i) % @list;
+               splice @list, $dest, 0, $item;
        }
 }
 
-my @ordered = map { $list[$perm[$_]] } 0 .. $#list;
-
-my $i = 0;
-$i++ while $ordered[$i] != 0;
-
+$i = 0;
+$i++ while $list[$i][1] != 0;
 my $sum;
 for (1 .. 3) {
        $i += 1000;
-       $i %= @ordered;
-       $sum += $ordered[$i];
+       $i %= @list;
+       $sum += $list[$i][1];
 }
 
 say $sum;