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 ],
21 $sum += $bp[0] * $res;
27 my @q = ([ 0, [ 1, 0, 0, 0 ], [ 0, 0, 0, 0 ], 0, 0 ]);
29 for my $rob (0 .. 3) {
30 for my $comp (0 .. 2) {
31 $needed[$comp] = $g->[$rob][$comp]
32 if !defined $needed[$comp]
33 || $g->[$rob][$comp] > $needed[$comp];
39 my ($t, $robs, $inv, $cantbuy, $didntbuy) = @{ shift @q };
42 if ($inv->[3] > $mx) {
51 $ni[$_] += $robs->[$_];
55 for my $bpn (reverse 0 .. 3) {
58 next if $cantbuy & $mask;
59 if ($bpn < 3 && $robs->[$bpn] >= $needed[$bpn]) {
64 next if $didntbuy & $mask;
66 next ROBOT if $bp->[$_] > $inv->[$_];
70 $ni1[$_] -= $bp->[$_];
75 unshift @q, [ $t, \@nr, \@ni1, $cantbuy, 0 ];
78 unshift @q, [ $t, $robs, \@ni, $cantbuy, $didntbuy ]