swarm-0.5.0.0: data/scenarios/Testing/1535-ping/_1535-in-range/solution.sw
def doN = \n. \f. if (n > 0) {f; doN (n - 1) f} {}; end;
def goToBuddy = \loc.
// log $ format loc;
let longitudinalDist = snd loc in
absFwd <- if (longitudinalDist < 0) {
turn back;
return $ -longitudinalDist;
} {
return longitudinalDist;
};
doN absFwd move;
if (longitudinalDist < 0) {
turn back;
} {};
let lateralDist = fst loc in
absSide <- if (lateralDist < 0) {
turn left;
return $ -lateralDist;
} {
turn right;
return lateralDist;
};
doN absSide move;
end;
def checkNeedToMove = \f. \loc.
wait 3;
if (loc == (0, 0)) {
return ()
} {
goToBuddy loc;
f;
}
end;
def pingLoop = \buddy.
maybeLoc <- ping buddy;
case maybeLoc return $ checkNeedToMove $ pingLoop buddy;
end;
def giveToBuddy = \buddy.
give buddy "map piece";
pingLoop buddy;
end;
def go =
move;
maybeBuddy <- meet;
case maybeBuddy return giveToBuddy;
grab;
end;
go;