fork download
  1. import itertools
  2.  
  3. def test(expression, n):
  4. """Given an expression, returns a tuple of all possible results"""
  5.  
  6. results = []
  7.  
  8. for input_ in itertools.product([0, 1], repeat=n):
  9. for i in range(n):
  10. locals()[chr(ord("A")+i)] = input_[i]
  11.  
  12. results.append(int(eval(expression)))
  13.  
  14. return tuple(results)
  15.  
  16. def solve(n):
  17. assert n <= 26
  18.  
  19. solution_dict = {}
  20.  
  21. for expression in ["0", "1"] + [chr(ord("A")+x) for x in range(n)]:
  22. solution_dict[test(expression, n)] = expression
  23.  
  24. while len(solution_dict) < 2**(2**n):
  25. update_dict = {}
  26.  
  27. for key1 in solution_dict:
  28. expression1 = solution_dict[key1]
  29.  
  30. if len(expression1) > 1:
  31. expression1 = "({})".format(expression1)
  32.  
  33. for key2 in solution_dict:
  34. expression2 = solution_dict[key2]
  35.  
  36. if len(expression2) > 1:
  37. expression2 = "({})".format(expression2)
  38.  
  39. new_expression = "{}<{}".format(expression1, expression2)
  40. results = test(new_expression, n)
  41.  
  42. if results not in solution_dict:
  43. update_dict[results] = new_expression
  44.  
  45. elif len(new_expression) < len(solution_dict[results]):
  46. update_dict[results] = new_expression
  47.  
  48. solution_dict.update(update_dict)
  49.  
  50. for result in sorted(solution_dict):
  51. print(solution_dict[result])
  52.  
  53. solve(n=2)
Success #stdin #stdout 0.07s 8688KB
stdin
Standard input is empty
stdout
0
(A<1)<B
B<A
A
A<B
B
((B<A)<((A<B)<1))<((B<(A<1))<1)
(B<(A<1))<1
B<(A<1)
(B<A)<((A<B)<1)
B<1
(A<B)<1
A<1
(B<A)<1
((A<1)<B)<1
1