eqn = b/a + FromDigits[{f, g, h}]/FromDigits[{c, d, e}] == 1;
Since the sum of the terms is 1
and each term is positive, then each term must be less than 1
, i.e., a > b && c > f
. You can gain some efficiency by prefiltering the list of Permutations
with this simpler criteria.
$HistoryLength = 0;
ClearSystemCache[]
Without prefiltering
(soln = Thread[{a, b, c, d, e, f, g, h} -> #] & /@
Select[Permutations@
Range@8, #2/#1 +
FromDigits@{#6, #7, #8}/FromDigits@{#3, #4, #5} & @@ # ==
1 &]) // AbsoluteTiming
(* {0.201104, {{a -> 3, b -> 1, c -> 6, d -> 7, e -> 8, f -> 4, g -> 5,
h -> 2}, {a -> 3, b -> 1, c -> 7, d -> 8, e -> 6, f -> 5, g -> 2,
h -> 4}, {a -> 4, b -> 2, c -> 3, d -> 5, e -> 6, f -> 1, g -> 7,
h -> 8}, {a -> 4, b -> 2, c -> 7, d -> 1, e -> 6, f -> 3, g -> 5,
h -> 8}, {a -> 4, b -> 3, c -> 6, d -> 2, e -> 8, f -> 1, g -> 5,
h -> 7}, {a -> 8, b -> 4, c -> 3, d -> 5, e -> 2, f -> 1, g -> 7,
h -> 6}, {a -> 8, b -> 4, c -> 7, d -> 1, e -> 2, f -> 3, g -> 5,
h -> 6}, {a -> 8, b -> 6, c -> 5, d -> 7, e -> 2, f -> 1, g -> 4, h -> 3}}} *)
Verifying the solutions
And @@ (eqn /. soln)
(* True *)
ClearSystemCache[]
Using prefiltering
(soln2 = Thread[{a, b, c, d, e, f, g, h} -> #] & /@
Select[Select[
Permutations@
Range@8, #1 > #2 && #3 > #6 & @@ # &], #2/#1 +
FromDigits@{#6, #7, #8}/FromDigits@{#3, #4, #5} & @@ # ==
1 &]) // AbsoluteTiming
(* {0.138858, {{a -> 3, b -> 1, c -> 6, d -> 7, e -> 8, f -> 4, g -> 5,
h -> 2}, {a -> 3, b -> 1, c -> 7, d -> 8, e -> 6, f -> 5, g -> 2,
h -> 4}, {a -> 4, b -> 2, c -> 3, d -> 5, e -> 6, f -> 1, g -> 7,
h -> 8}, {a -> 4, b -> 2, c -> 7, d -> 1, e -> 6, f -> 3, g -> 5,
h -> 8}, {a -> 4, b -> 3, c -> 6, d -> 2, e -> 8, f -> 1, g -> 5,
h -> 7}, {a -> 8, b -> 4, c -> 3, d -> 5, e -> 2, f -> 1, g -> 7,
h -> 6}, {a -> 8, b -> 4, c -> 7, d -> 1, e -> 2, f -> 3, g -> 5,
h -> 6}, {a -> 8, b -> 6, c -> 5, d -> 7, e -> 2, f -> 1, g -> 4, h -> 3}}} *)
The results are identical
soln === soln2
(* True *)