

| A solution contributed by Richard Conlan |
|---|
fun birls(partner1,partner2) = partner1^" birls with "^partner2^", ";
fun pass1or2(partner1, partner2, partner3, partner4, partner5) =
birls(partner1,partner2)^birls(partner1,partner3)^
birls(partner1,partner2)^birls(partner1,partner4)^
birls(partner1,partner2)^birls(partner1,partner5);
fun pass3(partner1, partner2, partner3, partner4, partner5, partner6,
partner7, partner8) =
birls(partner2,partner3)^"while "^birls(partner1,partner4)^
birls(partner1,partner2)^
birls(partner2,partner5)^"while "^birls(partner1,partner6)^
birls(partner1,partner2)^
birls(partner2,partner7)^"while "^birls(partner1,partner8);
fun round(partner1, partner2, partner3, partner4, partner5, partner6,
partner7, partner8) =
pass1or2(partner2, partner1, partner3, partner5, partner7)^
pass1or2(partner1, partner2, partner4, partner6, partner8)^
pass3(partner1, partner2, partner3, partner4, partner5,
partner6, partner7, partner8);
fun stripTheWillow(partner1, partner2, partner3, partner4, partner5,
partner6, partner7, partner8) =
round(partner1, partner2, partner3, partner4, partner5,
partner6, partner7, partner8)^
round(partner3, partner4, partner1, partner2, partner5,
partner6, partner7, partner8)^
round(partner5, partner6, partner1, partner2, partner3,
partner4, partner7, partner8)^
round(partner7, partner8, partner1, partner2, partner3,
partner4, partner5, partner6);
stripTheWillow("Nelson","Winnie","Woody","Mia","Ike","Tina","Charles","Di");
print it;
|
fun birls(a,b) = a^" birls with "^b^".";
(* Test this with... *)
birls("Winnie", "Nelson");
Both the first and the second pass involve five people. These are the birler,
the birlers partner, and three bystanders.
fun pass1or2(birler,partner,bs1,bs2,bs3) =
birls(birler,partner)^birls(birler,bs1)^
birls(birler,partner)^...
To factorize this definition we might define menage to be what three
people do during pass one or two:
fun menage(birler,partner,bs) =
birls(birler,partner)^birls(birler,bs);
fun pass1or2(birler,partner,bs1,bs2,bs3) =
menage(birler,partner,bs1)^
menage(birler,partner,bs2)...
By we can now perform passes one and two:
fun pass1and2(w1,w2,w3,w4,m1,m2,m3,m4)
= pass1or2(w1,m1,m2,m3,m4)^pass1or2(m1,w1,...);
To save tedious typing in testing you might define the constant 8-tuple:
val peeps = ("Winnie","Mia","Tina","Di","Nelson"...
Now test with
pass1and2 peeps;
Pass three is different as we have two pairs doing it simultaneously.
fun dbirl(b1,p1,b2,p2) = b1 ^" birls with " ^ p2 ^ " while " ^
p1 ^" birls with " ^ b2 ^ ".";
A set of three passes can now be put together. To construct the other
sets you may wish to use the rotate function:
fun rotate(w1,w2,w3,w4,m1,m2,m3,m4) = (w2,w3,w4,w1,m2,m3,m4,m1);Note that on some systems only the first line or so of a string will be shown. You can see the whole string by entering
print it;