Given 4 integer numbers, the algothrim needs to tell if any combination of ‘+’, ‘-‘, ‘*’, ‘/’ and ‘()’ can calculate number 24.

Below is a brutal force algorithm:

import sys
import pprint


def main(nums):
    nums4 = list(map(int, nums))
    nums_combinations = []
    for n1 in nums4:
        nums3 = nums4[:]
        nums3.remove(n1)
        for n2 in nums3:
            nums2 = nums3[:]
            nums2.remove(n2)
            for n3 in nums2:
                nums1 = nums2[:]
                nums1.remove(n3)
                n4 = nums1[0]
                nums_combinations.append([n1, n2, n3, n4])

    symbols_combinations = []
    symbols = ['+', '-', '*', '/']
    for s1 in symbols:
        for s2 in symbols:
            for s3 in symbols:
                symbols_combinations.append([s1, s2, s3])

    possible_calculations = []
    for n1, n2, n3, n4 in nums_combinations:
        for s1, s2, s3 in symbols_combinations:
            cal_strs = []
            cal_strs.append('{n1}{s1}{n2}{s2}{n3}{s3}{n4}'.format(n1=n1, n2=n2, n3=n3, n4=n4, s1=s1, s2=s2, s3=s3))
            cal_strs.append('({n1}{s1}{n2}){s2}{n3}{s3}{n4}'.format(n1=n1, n2=n2, n3=n3, n4=n4, s1=s1, s2=s2, s3=s3))
            cal_strs.append('{n1}{s1}({n2}{s2}{n3}){s3}{n4}'.format(n1=n1, n2=n2, n3=n3, n4=n4, s1=s1, s2=s2, s3=s3))
            cal_strs.append('{n1}{s1}{n2}{s2}({n3}{s3}{n4})'.format(n1=n1, n2=n2, n3=n3, n4=n4, s1=s1, s2=s2, s3=s3))
            cal_strs.append('({n1}{s1}{n2}{s2}{n3}){s3}{n4}'.format(n1=n1, n2=n2, n3=n3, n4=n4, s1=s1, s2=s2, s3=s3))
            cal_strs.append('{n1}{s1}({n2}{s2}{n3}{s3}{n4})'.format(n1=n1, n2=n2, n3=n3, n4=n4, s1=s1, s2=s2, s3=s3))
            cal_strs.append('({n1}{s1}{n2}{s2}{n3}){s3}{n4}'.format(n1=n1, n2=n2, n3=n3, n4=n4, s1=s1, s2=s2, s3=s3))
            cal_strs.append('{n1}{s1}({n2}{s2}{n3}{s3}{n4})'.format(n1=n1, n2=n2, n3=n3, n4=n4, s1=s1, s2=s2, s3=s3))
            cal_strs.append('({n1}{s1}{n2}){s2}({n3}{s3}{n4})'.format(n1=n1, n2=n2, n3=n3, n4=n4, s1=s1, s2=s2, s3=s3))
            cal_strs.append('(({n1}{s1}{n2}){s2}{n3}){s3}{n4}'.format(n1=n1, n2=n2, n3=n3, n4=n4, s1=s1, s2=s2, s3=s3))
            cal_strs.append('({n1}{s1}({n2}{s2}{n3})){s3}{n4}'.format(n1=n1, n2=n2, n3=n3, n4=n4, s1=s1, s2=s2, s3=s3))
            cal_strs.append('{n1}{s1}(({n2}{s2}{n3}){s3}{n4})'.format(n1=n1, n2=n2, n3=n3, n4=n4, s1=s1, s2=s2, s3=s3))
            cal_strs.append('{n1}{s1}({n2}{s2}({n3}{s3}{n4}))'.format(n1=n1, n2=n2, n3=n3, n4=n4, s1=s1, s2=s2, s3=s3))
            for cal_str in cal_strs:
                try:
                    if 23.999 < eval(cal_str) < 24.001:
                        possible_calculations.append(cal_str)
                except:
                    pass

    pprint.pprint(possible_calculations)

if __name__ == '__main__':

    main(sys.argv[1:5])