]> www.fi.muni.cz Git - aoc2020.git/blob - 46.pl
Task 9 Perl Golf-style
[aoc2020.git] / 46.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 my $rounds;
6 ($rounds, $_) = @ARGV;
7
8 my @cups_nums = split //;
9 my @cups_pos;
10 my $i;
11 for (@cups_nums) {
12         $cups_pos[$_] = $i++;
13 }
14
15 my $max = 1_000_000;
16
17 my ($prev, @cups, $one);
18 for (@cups_nums, 10 .. $max) {
19         my $cup = {
20                 num => $_,
21                 prev_num => $prev,
22                 next => undef,
23         };
24         push @cups, $cup;
25         $one = $cup if $cup->{num} == 1;
26         $prev = $cup;
27 }
28
29 $prev = $cups[-1];
30 for my $cup (@cups) {
31         $cup->{prev_num} = $cups[$cups_pos[$cup->{num}-1]]
32                 if $cup->{num} > 1 && $cup->{num} <= 10;
33         $cup->{prev_num} = $cups[-1]
34                 if $cup->{num} == 1;
35         $prev->{next} = $cup;
36         $prev = $cup;
37 }
38
39 # for my $cup (@cups) {
40 #       print $cup->{num}, ": >", $cup->{next}->{num}, " <", $cup->{prev_num}->{num}, "\n";
41 # }
42
43 my $cur = $cups[0];
44
45 while ($rounds--) {
46         my @pickup;
47         my $cup = $cur->{next};
48         my $dest = $cur->{prev_num};
49         my %num_seen;
50         # print "pickup: ";
51         for (1..3) {
52                 push @pickup, $cup;
53                 $num_seen{ $cup->{num} } = 1;
54                 # print $cup->{num}, ' ';
55                 $cup = $cup->{next};
56         }
57         $dest = $dest->{prev_num} while $num_seen{$dest->{num}};
58         # print " dest: ", $dest->{num}, "\n";
59         $cur->{next} = $cup;
60         my $end = $dest->{next};
61         $dest->{next} = $pickup[0];
62         $pickup[-1]->{next} = $end;
63
64         $cur = $cur->{next};
65         # $end = $cur;
66         # do {
67         #       print $end->{num}, ',';
68         #       $end = $end->{next};
69         # } while ($end->{num} != $cur->{num});
70         # print "\n";
71         print "round $rounds\n" if $rounds % 100_000 == 0;
72 }
73
74 print "one -> ", $one->{next}->{num}, '*', $one->{next}->{next}->{num},
75         "=", $one->{next}->{num} * $one->{next}->{next}->{num}, "\n";