After a little coding, I found 2232 solutions. Here is one of them:
$$
\frac2 1 + \frac6 5 + \frac6 2 + \frac3 1 + \frac4 5\\
\hphantom5\\
\frac3 4 + \frac1 4 + \frac3 6 + \frac6 1 + \frac5 2\\
\hphantom 5\\
\frac4 2 + \frac5 1 + \frac4 6 + \frac2 3 + \frac5 3
$$
And here is the python script. The first part is just a class that represents a fraction, with a few helper methods to accommodate addition, equality, flipping it upside-down, and printing the thing to paste into this very answer. Then I make a list of all the domino-fractions.
Finally I loop through every possible combination of flippings and check whether they sum to 30 (there are 29 of these). Then I do basically what I said in my comment: I try to choose five of them that add to 10, and then five more that add to 10, and the remaining five must then also add to 10.
I recommend you paste this into an actual editor before trying to read. Syntax highlighting is such a help.
from math import gcd
from itertools import combinations
class Fraction:
def init(self, num, den):
self.num, self.den = num, den
def shorten(self):
g = gcd(self.num, self.den)
self.num //= g
self.den //= g
def __add__(self, other):
f = Fraction(self.num*other.den + self.den*other.num,
self.den*other.den)
f.shorten()
return f
def flip(self):
return Fraction(self.den, self.num)
def __eq__(self, other):
return self.num*other.den == self.den*other.num
def __str__(self):
return f"\\frac{self.num} {self.den}"
fracs = [
Fraction(3, 4),
Fraction(1, 4),
Fraction(3, 6),
Fraction(1, 2),
Fraction(2, 4),
Fraction(5, 6),
Fraction(2, 6),
Fraction(1, 3),
Fraction(4, 5),
Fraction(1, 5),
Fraction(4, 6),
Fraction(1, 6),
Fraction(2, 3),
Fraction(3, 5),
Fraction(2, 5)]
There are 2**15 different ways to flip the fractions
for i in range(2**15):
# Representing i as binary to decide which fractions to flip this iteration
s = f"{i:015b}"
new_fracs = [g.flip() if s[k] == "1" else g for (k, g) in enumerate(fracs)]
if sum(new_fracs, start=Fraction(0, 1)) == Fraction(30, 1):
# Trying to pick out ten that add to 20, which leaves five that add to 10
for l1 in combinations(new_fracs, 10):
if sum(l1, start=Fraction(0,1)) == Fraction(20,1):
# From the ten, try to pick out five that add to 10
for l2 in combinations(l1, 5):
if sum(l2, start=Fraction(0,1)) == Fraction(10,1):
print(" + ".join([str(g) for g in l2]))
print(" + ".join([str(g) for g in l1 if g not in l2]))
print(" + ".join([str(g) for g in new_fracs if g not in l1]))
print()
This code runs very quickly on my laptop (the bottleneck might actually be the printing of the solutions, for all I know), so it turns out brute force wasn't so hard after all, at least with a little pruning as we go.