swarm-0.4: data/scenarios/Challenges/_bridge-building/solution.sw
def doN = \n. \f. if (n > 0) {f; doN (n - 1) f} {}; end;
def intersperse = \n. \f2. \f1. if (n > 0) {
f1;
if (n > 1) {
f2;
} {};
intersperse (n - 1) f2 f1;
} {};
end;
// Grab the empty water tank and crucible
move;
// get the map
grab;
// get the peat
doN 8 move;
doN 10 (move; drill forward);
turn right;
doN 2 move;
turn right;
doN 21 move;
turn right;
doN 2 move;
// get the water tank
grab;
// get the clay
turn left;
doN 3 move;
intersperse 8 move grab;
make "crucible";
turn right;
doN 14 move;
turn right;
doN 4 move;
turn left;
// Start working on the lava
move;
drill forward;
turn back;
doN 2 move;
turn left;
doN 30 move;
drill forward;
turn back;
doN 30 move;
turn right;
doN 2 move;
drill forward;
turn right;
move;
turn left;
drill forward;
turn back;
doN 2 move;
turn left;
doN 30 move;
drill forward;
turn back;
doN 31 move;
turn right;
doN 3 move;
drill forward;
drill right;
turn back;
doN 3 move;
turn left;
doN 32 move;
drill forward;
turn back;
doN 32 move;
turn right;
doN 4 move;
drill forward;
drill right;
turn back;
doN 4 move;
turn left;
doN 33 move;
drill forward;
turn back;
doN 33 move;
turn right;
doN 5 move;
// Since there are two recipes that take in lava
// one will (according to the seed) fill the crucible,
// and the next will tranform into obsidian.
drill forward;
drill forward;
turn back;
doN 5 move;
turn left;
doN 34 move;
def meltRoundTrip = \hDist.
drill forward;
// dump out the pail
make "empty water tank";
turn back;
doN hDist move;
turn right;
doN 2 move;
drill forward;
turn back;
doN 2 move;
turn left;
doN (hDist + 1) move;
end;
meltRoundTrip 28;
meltRoundTrip 29;
meltRoundTrip 30;
meltRoundTrip 31;
meltRoundTrip 32;
meltRoundTrip 33;
drill forward;
// dump out the pail
make "empty water tank";
doN 7 move;
turn left;
doN 5 move;
turn left;
doN 8 move;
turn right;
doN 6 move;
// Get 3 iron ores
doN 3 (drill forward);
// Make 6 iron plates
doN 3 (make "iron plate");
turn back;
doN 6 move;
turn left;
doN 8 move;
turn right;
doN 5 move;
turn right;
doN 43 move;
// Harvest hemp for rope
def uTurn = \d.
turn d;
move;
turn d;
end;
def harvestHempField =
turn left;
intersperse 5 move harvest;
uTurn right;
intersperse 5 move harvest;
uTurn left;
intersperse 5 move harvest;
uTurn right;
intersperse 5 move harvest;
uTurn left;
intersperse 5 move harvest;
uTurn right;
intersperse 5 move harvest;
uTurn left;
intersperse 5 move harvest;
uTurn right;
intersperse 5 move harvest;
uTurn left;
intersperse 5 move harvest;
end;
def repositionToHempCorner =
turn left;
doN 8 move;
turn left;
doN 4 move;
turn left;
end;
// Default growth stage time is 100-200. There are two growth stages.
intersperse 3 (repositionToHempCorner; wait 400) harvestHempField;
doN 2 (make "rope");
make "rubble skip";
// Go to the quarry
turn left;
doN 4 move;
turn right;
doN 3 move;
drill forward;
def causewayTrek = \dist.
turn back;
doN dist move;
drill forward;
turn back;
doN dist move;
drill forward;
end;
causewayTrek 18;
causewayTrek 19;
causewayTrek 20;
causewayTrek 21;
def secondCauseway = \dist.
turn back;
doN 24 move;
turn right;
doN dist move;
drill forward;
turn back;
doN dist move;
turn left;
doN 24 move;
drill forward;
end;
secondCauseway 4;
secondCauseway 5;
secondCauseway 6;
secondCauseway 7;
def thirdCausewayHalf = \dist.
turn back;
doN 24 move;
turn right;
doN 11 move;
turn left;
move;
turn right;
doN dist move;
drill forward;
end;
def thirdCauseway = \dist.
thirdCausewayHalf dist;
turn back;
doN dist move;
turn left;
move;
turn right;
doN 11 move;
turn left;
doN 24 move;
drill forward;
end;
thirdCauseway 1;
thirdCauseway 2;
thirdCauseway 3;
thirdCauseway 4;
thirdCauseway 5;
thirdCausewayHalf 6;
// Navigate through the mountain peaks
doN 5 move;
turn left;
doN 2 move;
turn right;
doN 4 move;
turn right;
move;
// Make the rope
make "rope";
// Install the rope
drill forward;
// Abseil down the cliff
doN 2 move;
turn left;
doN 7 move;
turn left;
move;
turn right;
move;
turn left;
move;
turn right;
doN 5 move;
turn right;
doN 2 move;
// Make the rope
make "rope";
// Install the rope
drill forward;
// Abseil down the cliff
doN 2 move;
turn left;
doN 4 move;
turn right;
move;
// Get the machete
grab;
turn back;
move;
turn left;
doN 4 move;
turn right;
doN 4 move;
turn left;
doN 5 move;
turn left;
move;
turn right;
move;
turn left;
move;
turn right;
doN 7 move;
turn right;
doN 3 move;
turn left;
doN 5 move;
turn left;
doN 2 move;
turn right;
doN 9 move;
turn left;
move;
turn right;
doN 10 move;
// harvest the palm tree
turn right;
move;
p <- harvest;
turn back;
move;
turn right;
doN 2 move;
turn left;
doN 17 move;
turn left;
def sowSeed = \p.
place p;
_p <- harvest;
move;
end;
// Harvest palm trees,
// traverse bog,
// grab flower.
def sowAndHarvestRow = \item. \length. \waitTime.
doN length $ sowSeed item;
turn back;
doN length move;
turn back;
wait waitTime;
doN length (grab; move;);
end;
doN 9 move;
sowAndHarvestRow p 5 400;
// Head toward the bog
doN 16 move;
turn right;
doN 3 move;
// Make coconuts and flimsy boards
doN 6 (make "coconut"; make "flimsy board");
doN 2 (drill forward; move;);
turn left;
doN 4 (drill forward; move;);
move;
def navigateToFlower =
turn right;
doN 2 move;
turn left;
doN 4 move;
turn right;
move;
turn left;
doN 2 move;
turn left;
doN 2 move;
turn right;
doN 2 move;
turn right;
doN 2 move;
turn left;
doN 3 move;
turn right;
move;
turn left;
doN 2 move;
turn left;
move;
grab;
end;
flower <- navigateToFlower;
def exitBog =
turn back;
move;
turn right;
doN 2 move;
turn right;
move;
turn left;
doN 3 move;
turn right;
doN 2 move;
turn left;
doN 2 move;
turn left;
doN 2 move;
turn right;
doN 2 move;
turn right;
doN 2 move;
turn left;
doN 4 move;
turn right;
move;
turn left;
doN 5 move;
turn right;
doN 3 move;
end;
exitBog;
turn left;
// Flower growth stage is 50 (two stages)
sowAndHarvestRow flower 7 100;
doN 23 move;
turn right;
doN 13 move;
turn right;
// Head toward the jungle
doN 16 move;
doN 8 (drill forward; move);
doN 2 move;
turn left;
scan forward;
turn right;
move;
turn left;
// Plant flower ring
intersperse 4 (turn left) (doN 2 (place flower; move));
turn back;
move;
turn right;
move;
wait 20;
plate <- grab;
turn back;
move;
turn right;
doN 26 move;
turn left;
doN 17 move;
turn left;
doN 11 move;
turn right;
doN 7 move;
turn right;
doN 2 move;
place plate;