6 my @bots = sort { $b->[3] <=> $a->[3] } map { [ /(-?\d+)/g ] } <>;
7 # my @bots = map { [ /(-?\d+)/g ] } <>;
9 sub overlaps($bot1, $bot2) {
10 abs($bot1->[0] - $bot2->[0])
11 + abs($bot1->[1] - $bot2->[1])
12 + abs($bot1->[2] - $bot2->[2]) <= $bot1->[3] + $bot2->[3];
19 our $min_sub = @$subset if !defined $min_sub || @$subset < $min_sub;
20 if (++$loop % 10000 == 0) {
21 say "walk: best ", scalar @best,
26 my $to_check = @bots - $subset->[-1];
27 return if @$subset + $to_check < @best;
29 for my $i ($subset->[-1] + 1 .. $#bots) {
30 for my $j (@$subset) {
31 next CANDIDATE if !overlaps($bots[$i], $bots[$j]);
33 walk([ @$subset, $i ]);
36 if (@best < @$subset) {
41 # eval { say "walk($_)"; walk([$_]) } for 0 .. $#bots;
44 @best = sort { $bots[$a]->[3] <=> $bots[$b]->[3] } @best;
45 say "Best subset has ", scalar @best, " members";
46 say "Smallest is ", join(',', @{ $bots[$best[0]] });
49 for my $j (1 .. $#best) {
51 if !overlaps($bots[$best[0]], $bots[$best[$j]]);
59 say "Trying diameter $bots[$best[0]]->[3]";
61 last DIM if $bots[$best[0]]->[3] == 0;
62 $shrink = int($bots[$best[0]]->[3]/4);
63 $shrink = 1 if $shrink < 1;
64 $bots[$best[0]]->[3] -= $shrink;
67 for my $dir ([-1, 0, 0], [1, 0, 0], [0, -1, 0], [0, 1, 0], [0, 0, -1], [0, 0, 1]) {
68 say "trying ", join(',', @$dir);
70 $bots[$best[0]]->[$_] += $shrink*$dir->[$_];
72 next DIM if try_overlaps;
75 $bots[$best[0]]->[$_] -= $shrink*$dir->[$_];
78 die "nothing matched. strange";
80 say "end: ", join(',', @{ $bots[$best[0]] });
81 say $bots[$best[0]]->[0]
82 + $bots[$best[0]]->[1]
83 + $bots[$best[0]]->[2];