5 use List::Util qw(max);
9 # my ($id, $ore, $clay, $obs_ore, $obs_clay, $geode_ore, $geod_obs)
16 [ $bp[3], $bp[4], 0, 0 ],
17 [ $bp[5], 0, $bp[6], 0 ],
28 my @q = ([ 0, [ 1, 0, 0, 0 ], [ 0, 0, 0, 0 ], 0, 0 ]);
30 for my $rob (0 .. 3) {
31 for my $comp (0 .. 2) {
32 $needed[$comp] = $g->[$rob][$comp]
33 if !defined $needed[$comp]
34 || $g->[$rob][$comp] > $needed[$comp];
40 my ($t, $robs, $inv, $cantbuy, $didntbuy) = @{ shift @q };
43 if ($inv->[3] > $mx) {
52 $ni[$_] += $robs->[$_];
56 for my $bpn (reverse 0 .. 3) {
59 next if $cantbuy & $mask;
60 if ($bpn < 3 && $robs->[$bpn] >= $needed[$bpn]) {
65 next if $didntbuy & $mask;
67 next ROBOT if $bp->[$_] > $inv->[$_];
71 $ni1[$_] -= $bp->[$_];
76 unshift @q, [ $t, \@nr, \@ni1, $cantbuy, 0 ];
79 unshift @q, [ $t, $robs, \@ni, $cantbuy, $didntbuy ]