/* 24 game https://en.wikipedia.org/wiki/24_(puzzle) """ The 24 puzzle is an arithmetical puzzle in which the objective is to find a way to manipulate four integers so that the end result is 24. For example, for the numbers 4, 7, 8, 8, a possible solution is (7−(8÷8))×4=24 Note that all four numbers must be used exactly once. ... Additional operations, such as square root and factorial, allow more possible solutions to the game. For instance, a set of 1,1,1,1 would be impossible to solve with only the five basic operations. However, with the use of factorials, it is possible to get 24 as (1+1+1+1)!=24 """ * [4, 7, 8, 8] = 24 (the example above), num_gens=100 [program = C * (B + A - D),res = 24,count = 17] [program = D * B - C * A,res = 24,count = 14] [program = (B + A - D) * C,res = 24,count = 12] * [4,4,4,4] = 24, num_gens=100 [program = A + (B * C + D),res = 24,count = 56] [program = D * A + (C + B),res = 24,count = 54] [program = B * C + D + A,res = 24,count = 41] [program = C + B + D * A,res = 24,count = 39] [program = B * C + (D + A),res = 24,count = 14] [program = D + A + B * C,res = 24,count = 1] * For [1,1,1,1] = 24 including factorial factorial_restricted(D + A + C + factorial_restricted(B)) * [1,2,3,4] = 24 [program = D * (B * (C * A)),res = 24,count = 90] [program = B * D * (C * A),res = 24,count = 53] [program = C * (D * (B * A)),res = 24,count = 50] [program = B * D * (C / A),res = 24.0,count = 49] [program = A * C * (B * D),res = 24,count = 49] [program = B * (C * A) * D,res = 24,count = 38] [program = (B + D) * (C + A),res = 24,count = 19] [program = D * A * (C * B),res = 24,count = 8] [program = (C + A) * (D + B),res = 24,count = 6] [program = C * A * (B * D),res = 24,count = 5] [program = pow_mod2(D,A) * B * C,res = 24,count = 3] [program = pow_mod2(C,A) * (B * D),res = 24,count = 2] [program = (D + B) * (C + A),res = 24,count = 2] [program = C * A * (D * B),res = 24,count = 2] [program = pow_mod2(factorial_restricted(D),A) / (C - B),res = 24.0,count = 1] [program = pow_mod2(B - A,C) * factorial_restricted(D),res = 24,count = 1] [program = C / A * (B * D),res = 24.0,count = 1] [program = factorial_restricted(D) * A * (C - B),res = 24,count = 1] [program = D * (B * A) * C,res = 24,count = 1] [program = D * C * (B / A),res = 24.0,count = 1] [program = D * B * (C / A),res = 24.0,count = 1] [program = C * D * (B * A),res = 24,count = 1] * [1,2,3,4,5] = 24, num_gens=1000 [program = A * B * (E + (C + D)),res = 24,count = 917] [program = B * A * (E + (C + D)),res = 24,count = 893] [program = D * B * (E + (A - C)),res = 24,count = 818] [program = B * D * (E + (A - C)),res = 24,count = 493] [program = (E + (C + D)) * (A * B),res = 24,count = 485] [program = B * (C * A + E + D),res = 24,count = 383] [program = (E + (C + D)) * (B * A),res = 24,count = 260] [program = (E + C) * (D + (A - B)),res = 24,count = 154] [program = (E + (A - C)) * (D * B),res = 24,count = 62] [program = (E + (A - C)) * (B * D),res = 24,count = 58] [program = (C * A + E + D) * B,res = 24,count = 46] [program = (A + (D - B)) * (C + E),res = 24,count = 45] [program = (D + (A - B)) * (C + E),res = 24,count = 44] [program = (E + (C + D)) * (B / A),res = 24.0,count = 26] [program = (E + (C + D)) / (A / B),res = 24.0,count = 24] [program = B / A * (E + (C + D)),res = 24.0,count = 14] [program = (C + E) * (D + (A - B)),res = 24,count = 11] [program = (A + D / B) * (C + E),res = 24.0,count = 2] [program = C * E + A + D * B,res = 24,count = 1] [program = C * E + A + B * D,res = 24,count = 1] [program = A + E + C * (B + D),res = 24,count = 1] [program = (A + E) * B + D * C,res = 24,count = 1] [program = B * D + (C * E + A),res = 24,count = 1] [program = (E + (C - B)) * (D / A),res = 24.0,count = 1] [program = (D + (A - B)) * (E + C),res = 24,count = 1] [program = (E - B - A) * C * D,res = 24,count = 1] * [1,2,3,4,5,6] = 24 [program = (C + D) * (E - A) - (F - B),res = 24,count = 876] [program = E - A + (C * F + D - B),res = 24,count = 714] [program = C * F + D - B + (E - A),res = 24,count = 690] [program = B - F + (C + D) * (E - A),res = 24,count = 556] [program = (C + D) * (E - A) + (B - F),res = 24,count = 497] [program = C * F + D - B - (A - E),res = 24,count = 2] Cf symbolic_regression_number_puzzle4.pi And the more algorithmic approach: 24_game.pi */ data(twenty_four_game,Data,Vars,Unknown,Ops,Constants,MaxSize,Params) :- Numbers = [4,7,8,8], % Numbers = [1,1,1,1], % Numbers = [4,4,4,4], % Numbers = [1,2,3,4], % Numbers = [1,2,3,4,5], % Numbers = [1,2,3,4,5,6], Target = 24, Data = [[Numbers, Target] ], println(data=Data), Ops = [+,-,*,/], % Ops = [+,-,*,/,pow_mod2,sqrt], % Ops = [+,-,*,/,pow_mod2,sqrt,factorial_restricted], Constants = [], % No constants is used since we only use the integers in Numbers. Unknown = Numbers, alpha(Alpha), Vars = [ Alpha[I] : I in 1..Numbers.len], % Vars = ['A','B','C','D'], MaxSize = 6, Params = new_map([init_size=1000, num_gens=100, unique_vars_all=true % remove_similar=true, % very experimental % random_seed=1 ]).