swarm-0.7.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;
match loc \lateralDist. \longitudinalDist.
absFwd <- if (longitudinalDist < 0) {
turn back;
pure $ -longitudinalDist;
} {
pure longitudinalDist;
};
doN absFwd move;
if (longitudinalDist < 0) {
turn back;
} {};
absSide <- if (lateralDist < 0) {
turn left;
pure $ -lateralDist;
} {
turn right;
pure lateralDist;
};
doN absSide move;
end;
def checkNeedToMove = \f. \loc.
wait 3;
if (loc == (0, 0)) {
pure ()
} {
goToBuddy loc;
f;
}
end;
def pingLoop = \buddy.
maybeLoc <- ping buddy;
case maybeLoc pure $ checkNeedToMove $ pingLoop buddy;
end;
def giveToBuddy = \buddy.
give buddy "map piece";
pingLoop buddy;
end;
def go =
move;
maybeBuddy <- meet;
case maybeBuddy pure giveToBuddy;
grab;
end;
go;