In this post we present the solution with Maple to the logical problem of "Gardens Puzzle"
http://www.mathsisfun.com/puzzles/gardens-solution.html
The Puzzle:
Five friends have their gardens next to one another, where they grow three kinds of crops: fruits (apple, pear, nut, cherry), vegetables (carrot, parsley, gourd, onion) and flowers (aster, rose, tulip, lily).
1. They grow 12 different varieties.
2. Everybody grows exactly 4 different varieties
3. Each variety is at least in one garden.
4. Only one variety is in 4 gardens.
5. Only in one garden are all 3 kinds of crops.
6. Only in one garden are all 4 varieties of one kind of crops.
7. Pear is only in the two border gardens.
8. Paul's garden is in the middle with no lily.
9. Aster grower doesn't grow vegetables.
10. Rose growers don't grow parsley.
11. Nuts grower has also gourd and parsley.
12. In the first garden are apples and cherries.
13. Only in two gardens are cherries.
14. Sam has onions and cherries.
15. Luke grows exactly two kinds of fruit.
16. Tulip is only in two gardens.
17. Apple is in a single garden.
18. Only in one garden next to Zick's is parsley.
19. Sam's garden is not on the border.
20. Hank grows neither vegetables nor asters.
21. Paul has exactly three kinds of vegetable.
Who has which garden and what is grown where?
About methods of solution. At first I just wanted to generate all variations and using conditions 1 .. 21 to find all solutions. But even if we use the condition that everybody grows exactly 4 different varieties then the total number variants equals 5!^2*binomial(12,4)^5=427945522455000000
So from the very beginning using some of the conditions 1 .. 21 we maximally reduce the number of possible variants. For example from the conditions 11, 18 and 6 implies that only in one garden are all 4 varieties of flowers. Next we pass through these variants and using conditions 1 .. 21 and finally come to a unique solution:
restart;
Fruits:={apple, pear, nut, cherry}:
Vegetables:={carrot, parsley, gourd, onion}:
Flowers:={aster, rose, tulip, lily}:
Set1:=Flowers:
Garden1:={Set1}:
Set2:=Fruits union Vegetables union Flowers minus {nut,gourd,parsley} minus {apple,cherry,rose}:
Garden2:={seq({nut,gourd,parsley} union {Set2[i]}, i=1..nops(Set2))}:
Set3:=Vegetables union Flowers minus {parsley}:
Garden3:={seq({apple,cherry,pear} union {Set3[i]}, i=1..nops(Set3))}:
Set4:=combinat[choose](Fruits union Vegetables union Flowers minus {onion,cherry} minus {apple,parsley,pear,nut}, 2):
Garden4:={seq({onion,cherry} union Set4[i], i=1..nops(Set4))}:
Set5:=Fruits union Vegetables union Flowers minus {apple, cherry,nut,parsley}:
Garden5:=combinat[choose](Set5, 4):
S:=[]:
for s1 in Garden1 do
for s2 in Garden2 do
for s3 in Garden3 do
for s4 in Garden4 do
for s5 in Garden5 do
s:=[s1,s2,s3,s4,s5]: s_4:=combinat[choose](s,4): m:=0: n:=0: k:=0: p:=0: q:=0:
for i in s do
if `intersect`(i,Fruits)<>{} and `intersect`(i,Vegetables)<>{} and `intersect`(i,Flowers)<>{} then m:=m+1: fi:
if pear in i then n:=n+1: fi:
if tulip in i then k:=k+1: fi:
if aster in i and `intersect`(i,Vegetables)<>{} then p:=p+1: fi:
if i=Fruits or i=Vegetables or i=Flowers then q:=q+1: fi:
od:
if nops(`union`(op(s)))=12 and nops(`union`(seq(`intersect`(op(s_4[j])), j=1..nops(s_4))))=1 and m=1 and n=2 and k=2 and p=0 and q=1 then S:=[op(S),[s1,s2,s3,s4,s5]]: fi:
od: od: od: od: od:
L1:=[seq([[3,Paul],[2,Sam],seq([combinat[permute]([1,4,5])[i,j],[Luke,Zick,Hank][j]],j=1..3)],i=1..6)]:
L2:=[seq([[3,Paul],[4,Sam],seq([combinat[permute]([1,2,5])[i,j],[Luke,Zick,Hank][j]],j=1..3)],i=1..6)]:
L0:=[op(L1),op(L2)]:
L:=[seq(op(combinat[permute](L0[i])),i=1..nops(L0))]:
Sol:=[]:
for l in L do
for s in S do
sol:=[seq([op(l[i]),s[i]], i=1..5)]:
gad1:=op(select(has,sol,parsley)): gad2:=op(select(has,sol,Zick)):
if abs(gad1[1]-gad2[1])=1 and convert([seq(((pear in sol[i][3] implies (sol[i][1]=1 or sol[i][1]=5)) and (sol[i][2]=Paul implies (not lily in sol[i][3])) and (sol[i][1]=1 implies (apple in sol[i][3] and cherry in sol[i][3])) and (sol[i][2]=Sam implies (onion in sol[i][3] and cherry in sol[i][3])) and (sol[i][2]=Luke implies nops(`intersect`(sol[i][3],Fruits))=2) and (sol[i][2]=Hank implies (`intersect`(sol[i][3],Vegetables)={} and not aster in sol[i][3])) and (sol[i][2]=Paul implies nops(`intersect`(sol[i][3],Vegetables))=3)), i=1..5)], `and`) then Sol:=[op(Sol), sol]: fi:
od: od:
for i in Sol do
Matrix(sort(i,(x,y)->x[1]<y[1]));
od;