35 lines
1.2 KiB
Text
35 lines
1.2 KiB
Text
evaluate[HoldForm[op_[l_, r_]]] := op[evaluate[l], evaluate[r]];
|
|
evaluate[x_] := x;
|
|
combine[l_, r_ /; evaluate[r] != 0] := {HoldForm[Plus[l, r]],
|
|
HoldForm[Subtract[l, r]], HoldForm[Times[l, r]],
|
|
HoldForm[Divide[l, r]] };
|
|
combine[l_, r_] := {HoldForm[Plus[l, r]], HoldForm[Subtract[l, r]],
|
|
HoldForm[Times[l, r]]};
|
|
split[items_] :=
|
|
Table[{items[[1 ;; i]], items[[i + 1 ;; Length[items]]]}, {i, 1,
|
|
Length[items] - 1}];
|
|
expressions[{x_}] := {x};
|
|
expressions[items_] :=
|
|
Flatten[Table[
|
|
Flatten[Table[
|
|
combine[l, r], {l, expressions[sp[[1]]]}, {r,
|
|
expressions[sp[[2]]]}], 2], {sp, split[items]}]];
|
|
|
|
(* Must use all atoms in given order. *)
|
|
solveMaintainOrder[goal_, items_] :=
|
|
Select[expressions[items], (evaluate[#] == goal) &];
|
|
(* Must use all atoms, but can permute them. *)
|
|
solveCanPermute[goal_, items_] :=
|
|
Flatten[Table[
|
|
solveMaintainOrder[goal, pitems], {pitems,
|
|
Permutations[items]}]];
|
|
(* Can use any subset of atoms. *)
|
|
solveSubsets[goal_, items_] :=
|
|
Flatten[Table[
|
|
solveCanPermute[goal, is], {is,
|
|
Subsets[items, {1, Length[items]}]}], 2];
|
|
|
|
(* Demonstration to find all the ways to create 1/5 from {2, 3, 4, 5}. *)
|
|
solveMaintainOrder[1/5, Range[2, 5]]
|
|
solveCanPermute[1/5, Range[2, 5]]
|
|
solveSubsets[1/5, Range[2, 5]]
|