fork download
  1. from math import floor, ceil, modf
  2.  
  3. target =
  4. max_k = 10.0
  5.  
  6. def compute_avg(list):
  7. if len(list) == 0:
  8. return 0
  9. sum = reduce(lambda i, j: i + j, list)
  10. return round(float(sum) / len(list), 2)
  11.  
  12. def generate_list(target, n, m):
  13. result = [target + 1 for i in range(0, n)]
  14. map(lambda x: result.append(target), range(0, m))
  15.  
  16. return result
  17.  
  18. def round_approximation(n, m):
  19. (decn, intn) = modf(n)
  20. (decm, intm) = modf(m)
  21.  
  22. return (int(ceil(n)), int(floor(m))) if decn > decm else (int(floor(n)), int(ceil(m)))
  23.  
  24. def inverse_avg(target, n, m):
  25. res = generate_list(target, n, m)
  26. avg = compute_avg(res)
  27.  
  28. return (avg, res)
  29.  
  30. def sort_attempts(x, y):
  31. dx = abs(target - x['average'])
  32. dy = abs(target - y['average'])
  33.  
  34. if dx > dy:
  35. return 1
  36. elif dx == dy:
  37. return 0
  38. else:
  39. return -1
  40.  
  41. (decimal, integer) = modf(target)
  42. decimal = round(decimal, 2)
  43. k = 1
  44.  
  45. while k < 100:
  46. x = decimal * k
  47. if x == int(x):
  48. break
  49. k += 1
  50.  
  51. (n, m) = (int(x), int(ceil(k-x)))
  52. if k > max_k:
  53. """
  54. n/k = n'/10
  55. m/k = m'/10
  56.  
  57. n' = 10n/k
  58. m' = 10m/k
  59. """
  60. attempts = []
  61.  
  62. for i in range(1, 10):
  63. (t_n, t_m) = ((i*n)/(n+m), (i*m)/(n+m))
  64. (t_n, t_m) = round_approximation(t_n, t_m)
  65.  
  66. (avg, elements) = inverse_avg(int(target), t_n, t_m)
  67. attempts.append({'average': avg, 'n': t_n, 'm': t_m})
  68.  
  69. attempts.sort(sort_attempts)
  70. winner = attempts[0]
  71.  
  72. print inverse_avg(int(target), winner['n'], winner['m'])
  73. else:
  74. print inverse_avg(int(target), n, m)
Runtime error #stdin #stdout 0.08s 10864KB
stdin
Standard input is empty
stdout
Standard output is empty