swarm-0.7.0.0: data/scenarios/Challenges/_dna/topchecker.sw
def doN = \n. \f. if (n > 0) {f; doN (n - 1) f} {}; end;
def getBaseForNumber = \n.
if (n == 0) {
"guanine";
} {
if (n == 1) {
"cytosine";
} {
if (n == 2) {
"adenine";
} {
"thymine";
};
};
};
end;
def getNumberForBase = \n.
if (n == "guanine") {
0;
} {
if (n == "cytosine") {
1;
} {
if (n == "adenine") {
2;
} {
if (n == "thymine") {
3;
} {-1};
};
};
};
end;
/** Toggle the lowest bit */
def getComplementNumber = \n.
if (n == 0) {
1;
} {
if (n == 1) {
0;
} {
if (n == 2) {
3;
} {
2;
};
};
};
end;
def waitUntilHere = \remainingCount.
if (remainingCount > 0) {
maybeItemHere <- scan down;
case maybeItemHere (\_.
watch down;
wait 1000;
waitUntilHere remainingCount;
) (\itemHere.
maybeItemAbove <- scan left;
case maybeItemAbove (\_. fail "Expected an item here.") (\itemAbove.
let num = getNumberForBase itemAbove in
if (num >= 0) {
let complementNum = getComplementNumber num in
let complementItem = getBaseForNumber complementNum in
if (complementItem == itemHere) {
move;
waitUntilHere $ remainingCount - 1;
} {
create "pixel (R)";
}
} {
fail "Expected nonnegative item index."
}
);
);
} {
create "pixel (G)";
};
end;
def waitUntilEmpty =
watch down;
wait 1000;
emptyHere <- isempty;
if emptyHere {} {
waitUntilEmpty;
}
end;
def waitForReset =
backup;
waitUntilEmpty;
end;
def go = \startingLoc.
instant $ waitUntilHere 32;
waitForReset;
teleport self startingLoc;
go startingLoc;
end;
loc <- whereami;
go loc;