]> www.fi.muni.cz Git - aoc.git/blob - 2017/32.pl
The rest of Year 2017
[aoc.git] / 2017 / 32.pl
1 #!/usr/bin/perl
2
3 use v5.30;
4 use strict;
5
6 my $row = join('', 'a' .. 'p');
7 # my $row = join('', 'a' .. 'e');
8
9 chomp (my $dance = <>);
10 my @dance = split /,/, $dance;
11
12 sub do_dance {
13         for my $move (@dance) {
14                 chomp $move;
15                 if ($move =~ /s(\d+)/) {
16                         $row =~ s/(.*)(.{$1})/\2\1/;
17                 } elsif ($move =~ /x(\d+)\/(\d+)/) {
18                         my ($a, $b) = (substr($row, $1, 1), substr($row, $2, 1));
19                         substr($row, $1, 1) = $b;
20                         substr($row, $2, 1) = $a;
21                 } elsif ($move =~ /p(\w)\/(\w)/) {
22                         eval "\$row =~ y/$1$2/$2$1/";
23                 }
24         }
25 }
26
27 my %seen;
28 my $i = 0;
29 while (1) {
30         if ($seen{$row}) {
31                 last;
32         } else {
33                 $seen{$row} = $i;
34         }
35         do_dance();
36         $i++;
37 }
38
39 my $period = $i - $seen{$row};
40 say "period $period from $seen{$row} to $i";
41
42 my $count = 1_000_000_000 - $seen{$row};
43 $count %= $period;
44 do_dance() while $count--;
45
46 say $row;
47