/* The "infamous puzzle": 11x11=4 22x22=16 33x33=? See http://hakank.org/jgap/equation.conf We represents this as 1 1 1 1 4 2 2 2 2 16 3 3 3 3 ? Note: '**'/2 might blow up after a while. Here are some solutions: Compare with my Picat (CP) approach in equation.pi which has the following solutions The constraint models above has 4 different models/interpretations and finds four different solutions of the puzzle: x1 = 36 x2 = 18 x3 = 64 x4 = 108 of which 18 is the only solution not found with this program. But see below when forcing 18 as a solution. * Using ** (but it might blow up in some runs). Solutions: [program = 4 ** A,res = 64,count = 28] [program = 4 ** B,res = 64,count = 18] [program = 4 ** C,res = 64,count = 14] [program = 4 ** D,res = 64,count = 13] [program = C * (D * 4),res = 36,count = 7] [program = (A * B) ** (D / A) * 4,res = 36.0,count = 6] [program = D ** C * 4,res = 108,count = 6] [program = A ** B * (3 + 1),res = 108,count = 6] [program = D * 4 * D,res = 36,count = 6] [program = 4 * B ** A,res = 108,count = 6] [program = 4 * (B * C),res = 36,count = 6] [program = 4 * (1 * A ** A),res = 108,count = 5] [program = 2 ** (2 * C),res = 64,count = 3] [program = D * 4 * 1 * B,res = 36,count = 3] [program = (2 ** B) ** 2,res = 64,count = 2] [program = 4 ** (1 * C),res = 64,count = 2] [program = D ** 2 * (1 + 3),res = 36,count = 2] [program = 4 ** D / 1,res = 64.0,count = 1] [program = C / (D / 4 ** D),res = 64.0,count = 1] [program = A / (A / 4 ** B),res = 64.0,count = 1] [program = 4 ** C - C + C,res = 64,count = 1] [program = (A + A - ((4 - B) / C / B - 3) * (A - 2)) ** 2,res = 79.012345679012356,count = 1] [program = (D + D) ** 2,res = 36,count = 1] [program = (C + D) ** 2,res = 36,count = 1] [program = (A + C) ** 2,res = 36,count = 1] [program = (2 + 2) ** A,res = 64,count = 1] [program = (1 + 3) ** A,res = 64,count = 1] [program = ((4 / D) ** C) ** B,res = 13.318294975359438,count = 1] [program = (4 ** 1) ** B,res = 64,count = 1] [program = (4 ** 1) ** A,res = 64,count = 1] [program = (2 ** 1) ** (D + D),res = 64,count = 1] [program = (2 ** 1) ** (2 * C),res = 64,count = 1] [program = (4 * 1) ** A,res = 64,count = 1] [program = (1 * 4) ** B,res = 64,count = 1] [program = 4 ** (B / 1),res = 64.0,count = 1] [program = 4 ** B ** 1,res = 64,count = 1] [program = 4 ** (D * 1),res = 64,count = 1] [program = 2 ** (A + C),res = 64,count = 1] [program = 2 ** 2 ** A,res = 256,count = 1] [program = C * D * 4,res = 36,count = 1] [program = 4 * A ** D,res = 108,count = 1] resultMap = [64 = 19,36 = 9,108 = 5,64.0 = 4,256 = 1,79.012345679012356 = 1,36.0 = 1,13.318294975359438 = 1] * Using pow_mod2/2 instead [program = pow_mod2(4,B),res = 64,count = 9] [program = B * (4 * D),res = 36,count = 9] [program = B * (4 * A),res = 36,count = 9] [program = 2 * (B * (D * 2)),res = 36,count = 9] [program = 4 * (A * A / 1),res = 36.0,count = 8] [program = 4 * (A * B),res = 36,count = 8] [program = pow_mod2(4,D),res = 64,count = 7] [program = pow_mod2(4,C),res = 64,count = 7] [program = pow_mod2(4,A),res = 64,count = 6] [program = A * (4 * A),res = 36,count = 6] [program = D * (4 * A),res = 36,count = 5] [program = pow_mod2(4,C) * (1 * 1),res = 64,count = 3] [program = pow_mod2(4,C) * 1,res = 64,count = 3] [program = D * (C * 4),res = 36,count = 3] [program = B * (A * 4 / 1),res = 36.0,count = 3] [program = 4 * (C * (D + D * (pow_mod2(1,4) / 1) - C)),res = 36.0,count = 3] [program = pow_mod2(4,1 * A),res = 64,count = 2] [program = pow_mod2(2,C + C),res = 64,count = 2] [program = 4 * A * D,res = 36,count = 2] [program = C * (pow_mod2(pow_mod2(4,1),A) * (1 / C)),res = 64.0,count = 2] [program = 4 * (D * A),res = 36,count = 2] [program = pow_mod2(pow_mod2(2,2),D),res = 64,count = 1] [program = pow_mod2(pow_mod2(2,2),B),res = 64,count = 1] [program = pow_mod2(A + D - (A - (C - B) - D),2),res = 36,count = 1] [program = pow_mod2(C + C,2),res = 36,count = 1] [program = pow_mod2(B + A,2),res = 36,count = 1] [program = pow_mod2(3 + 1,D),res = 64,count = 1] [program = pow_mod2(D * 2 * 1,2),res = 36,count = 1] [program = pow_mod2(2 * 2,A),res = 64,count = 1] [program = pow_mod2(4,pow_mod2(A,1)),res = 64,count = 1] [program = pow_mod2(2,pow_mod2(2,A)),res = 256,count = 1] [program = pow_mod2(2,A + C),res = 64,count = 1] [program = pow_mod2(4,D) - C + C,res = 64,count = 1] [program = pow_mod2(4,D) - C + B,res = 64,count = 1] [program = pow_mod2(A,1) * (4 * D),res = 36,count = 1] [program = pow_mod2(4,D) * 1,res = 64,count = 1] [program = pow_mod2(4,1) * (A * A / 1),res = 36.0,count = 1] [program = pow_mod2(D,4 - pow_mod2(3,1)) * 4 * pow_mod2(D,A - 1),res = 108,count = 1] [program = D * 4 * C,res = 36,count = 1] [program = D * (pow_mod2(pow_mod2(4,1),A) * (1 / C)),res = 64.0,count = 1] [program = D * (4 * D),res = 36,count = 1] resultMap = [64 = 17,36 = 16,36.0 = 4,64.0 = 2,256 = 1,108 = 1] * Using pow_mod/3 also works: [program = 4 * (A * D),res = 36,count = 8] [program = 4 * (D * C),res = 36,count = 7] [program = (D + B) / (2 / 4 / A),res = 36.0,count = 6] [program = D * 4 * B,res = 36,count = 6] [program = C * (1 + 3) * C,res = 36,count = 6] [program = B * C * 4,res = 36,count = 6] [program = D * (C * 4) / 1,res = 36.0,count = 5] [program = (2 + 2) * (C - (2 - (C + C))),res = 28,count = 4] [program = 4 * (B * D),res = 36,count = 4] [program = pow_mod(D,2 * 4 * B,4 + D) * 4,res = 4,count = 2] [program = C * (1 + 3) * D,res = 36,count = 2] [program = pow_mod(4,D,A * 3 * (D + B)),res = 10,count = 1] [program = 4 * B * D,res = 36,count = 1] resultMap = [36 = 8,36.0 = 2,28 = 1,10 = 1,4 = 1] * Forcing 18 as a solution [program = (B + B) * (C + pow_mod(D,3,3)),res = 18,count = 79] [program = (C + C) * (C + pow_mod(D,3,3)),res = 18,count = 73] [program = (A + D) * (C + pow_mod(D,3,3)),res = 18,count = 51] [program = D * 2 * (C + pow_mod(D,3,3)),res = 18,count = 44] [program = 2 * C * (C + pow_mod(D,3,3)),res = 18,count = 37] [program = (A + B) * (C + pow_mod(D,3,3)),res = 18,count = 35] [program = (B + D) * (C + pow_mod(D,3,3)),res = 18,count = 30] [program = (D + B) * (C + pow_mod(D,3,3)),res = 18,count = 27] [program = (C + pow_mod(D,3,3)) * (D * 2),res = 18,count = 27] [program = C * 2 * (C + pow_mod(D,3,3)),res = 18,count = 24] [program = (C + pow_mod(D,3,3)) * (C * 2),res = 18,count = 18] [program = (A + C) * (C + pow_mod(D,3,3)),res = 18,count = 16] [program = (C + pow_mod(D,3,3)) * (2 * D),res = 18,count = 12] [program = (B + A) * (C + pow_mod(D,3,3)),res = 18,count = 11] [program = (C + pow_mod(D,3,3)) * (D + D),res = 18,count = 5] [program = (C + pow_mod(D,3,3)) * (D + A),res = 18,count = 3] [program = (C + pow_mod(D,3,3)) * (C + C),res = 18,count = 2] [program = (pow_mod(A,1,B * 4) + C) * (C + pow_mod(D,3,3)),res = 18,count = 1] [program = (B * 3 - A + pow_mod(D,3,1)) * (C + pow_mod(D,3,3)),res = 18,count = 1] [program = (D + D) * (C + pow_mod(D,3,3)),res = 18,count = 1] [program = (D + C) * (C + pow_mod(D,3,3)),res = 18,count = 1] [program = (D + A) * (C + pow_mod(D,3,3)),res = 18,count = 1] [program = (C + pow_mod(D,3,3)) * (B * 3 - A + pow_mod(D,3,1)),res = 18,count = 1] [program = (C + pow_mod(D,3,3)) * (B + B),res = 18,count = 1] [program = (C + pow_mod(D,3,3)) * (A + C),res = 18,count = 1] [program = (C + pow_mod(D,3,3)) * (A + B),res = 18,count = 1] [program = (C + pow_mod(D,3,3)) * (2 * C),res = 18,count = 1] [program = (C + pow_mod(D,3,3)) * (1 * (D * 2)),res = 18,count = 1] [program = (C + B) * (C + pow_mod(D,3,3)),res = 18,count = 1] [program = (C + A) * (C + pow_mod(D,3,3)),res = 18,count = 1] resultMap = [18 = 30] Also see: MindYourDecision (Presh Talwalkar) has blogged/youtubed about it: "Viral Puzzle 11 x 11 = 4. The Correct Answer Explained" - https://mindyourdecisions.com/blog/2016/09/21/viral-puzzle-11x11-4-the-correct-answer-explained/ - https://www.youtube.com/watch?v=IQd1oDsHVSc */ data(infamous_equation,Data,Vars,Unknown,Ops,Constants,MaxSize,Params) :- Data = [ [[1,1,1,1],4], [[2,2,2,2],16] % , [[3,3,3,3],18] % force a solution for 18 ], % Ops = [+,-,*,/,**], % will probably blow up % Ops = [+,-,*,/,pow_mod2], Ops = [+,-,*,/,pow_mod], Constants = 1..4, Vars = ['A','B','C','D'], MaxSize = 21, Params = new_map([num_gens=100]), Unknown = [3,3,3,3].