-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path05b.pl
63 lines (58 loc) · 1.84 KB
/
05b.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
$index = -1;
for (<>) {
chomp;
if (/seeds/) {
@seeds = split / /;
shift @seeds;
for ($i = 0; $i < @seeds; $i += 2) {
push @seed_pairs, [$seeds[$i], $seeds[$i + 1]];
}
}
elsif (/map/) {
$maps[++$index] = [];
}
elsif (/\d/) {
push @{$maps[$index]}, [split / /];
}
}
# Sort mapping arrays
for ($i = 0; $i < @maps; $i++) {
my @complete = ();
$next_start = 0;
for $mapping (sort { $a->[1] <=> $b->[1] } @{$maps[$i]}) {
# Insert a no-op mapping if there's a gap in the mappings.
if ($mapping->[1] != $next_start) {
$start = $mapping->[1];
push @complete, [$next_start, $next_start, $mapping->[1] - $next_start];
}
push @complete, $mapping;
$next_start = $mapping->[1] + $mapping->[2];
}
# Hacky: add a very large no-op mapping to the end of the list.
push @complete, [$next_start, $next_start, 9999999999999];
$maps[$i] = [@complete];
}
# Go through each step of the process from seed to location, transforming each
# range of input values into one or more ranges of output values.
for $step (@maps) {
@new_seed_pairs = ();
for $seed_pair (@seed_pairs) {
($start_seed, $seed_range) = @{$seed_pair};
foreach $mapping (@{$step}) {
($begin_out, $begin_in, $range) = @{$mapping};
if ($start_seed >= $begin_in && $start_seed - $begin_in < $range) {
if ($seed_range <= $range) {
push @new_seed_pairs, [$begin_out - $begin_in + $start_seed, $seed_range];
$seed_range = 0;
} else {
push @new_seed_pairs, [$begin_out - $begin_in + $start_seed, $range];
$seed_range -= $range - ($start_seed - $begin_in);
$start_seed += $range - ($start_seed - $begin_in);
}
}
}
}
@seed_pairs = @new_seed_pairs;
}
@sorted_pairs = sort { $a->[0] <=> $b->[0] } @seed_pairs;
print $sorted_pairs[0]->[0], "\n";