Using LINQ to solve puzzles
The diagram below provided by Luke shows a mobile. It consists in a bunch of weights (A-M) hanging from a system of bars. Each weight has an integer value between 1 and 13, and the goal is to figure out what each weight must be for the the diagram below to balance correctly as shown:
|
|
+--+--+--+--+--+--+--+
| |
| |
+--+--+--+--+--+ |
| L M |
| |
+--+--+--+--+--+--+ +--+--+--+--+--+
H | I | J K |
| | |
+--+--+--+--+--+ | +--+--+--+--+--+
E F | G |
| |
+--+--+--+--+--+ +--+--+--+--+--+--+
A B C D
The puzzle can be solved relatively easily using a LINQ query:
var solveForWeights =
from a in Enumerable.Range(1, 13)
join b in Enumerable.Range(1, 13) on 4 * a equals b
from c in Enumerable.Range(1, 13)
join d in Enumerable.Range(1, 13) on 5 * c equals d
from e in Enumerable.Range(1, 13)
join f in Enumerable.Range(1, 13) on 3 * e equals 2 * f
join g in Enumerable.Range(1, 13) on 2 * (c + d) equals 3 * g
from h in Enumerable.Range(1, 13)
join i in Enumerable.Range(1, 13) on 3 * h - 2 * (e + f) equals 3 * i
from j in Enumerable.Range(1, 13)
join k in Enumerable.Range(1, 13) on 3 * (a + b) + 2 * j - 2 * (g + c + d) equals k
from l in Enumerable.Range(1, 13)
join m in Enumerable.Range(1, 13) on (h + i + e + f) - l equals 4 * m
where (4 * (l + m + h + i + e + f) == 3 * (j + k + g + a + b + c + d))
select new { a, b, c, d, e, f, g, h, i, j, k, l, m,
Total = a + b + c + d + e + f + g + h + i + j + k + l + m };
solveForWeights.ToList().ForEach(result => Console.WriteLine(result));
This is an interesting approach and an innovative use of LINQ! See the details in Luke's post.
Cross-posted from http://linqinaction.net