Guest User

Untitled

a guest
Oct 22nd, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.95 KB | None | 0 0
  1. # You are the "computer expert" of a local Athletic Association (C.A.A.). Many teams of runners come to compete. Each time you get a string of all race results of every team who has run. For example here is a string showing the individual results of a team of 5:
  2.  
  3. # "01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17"
  4.  
  5. # Each part of the string is of the form: h|m|s where h, m, s are positive or null integer (represented as strings) with one or two digits. There are no traps in this format.
  6.  
  7. # To compare the results of the teams you are asked for giving three statistics; range, average and median.
  8.  
  9. # Range : difference between the lowest and highest values. In {4, 6, 9, 3, 7} the lowest value is 3, and the highest is 9, so the range is 9 − 3 = 6.
  10.  
  11. # Mean or Average : To calculate mean, add together all of the numbers in a set and then divide the sum by the total count of numbers.
  12.  
  13. # Median : In statistics, the median is the number separating the higher half of a data sample from the lower half. The median of a finite list of numbers can be found by arranging all the observations from lowest value to highest value and picking the middle one (e.g., the median of {3, 3, 5, 9, 11} is 5) when there is an odd number of observations. If there is an even number of observations, then there is no single middle value; the median is then defined to be the mean of the two middle values (the median of {3, 5, 6, 9} is (5 + 6) / 2 = 5.5).
  14.  
  15. # Your task is to return a string giving these 3 values. For the example given above, the string result will be
  16.  
  17. # "Range: 00|47|18 Average: 01|35|15 Median: 01|32|34"
  18.  
  19. # of the form:
  20.  
  21. # "Range: hh|mm|ss Average: hh|mm|ss Median: hh|mm|ss"
  22.  
  23. # where hh, mm, ss are integers (represented by strings) with each 2 digits.
  24.  
  25. # Remarks:
  26.  
  27. # if a result in seconds is ab.xy... it will be given truncated as ab.
  28. # if the given string is "" you will return ""
  29.  
  30. require 'minitest/autorun'
  31.  
  32. def results(string)
  33. return '' if string.nil? || string.empty?
  34.  
  35. score_ary = parse_score_string(string).sort!
  36. len = score_ary.length
  37.  
  38. # get stats truncated to nearest string
  39. stats = { range: score_ary.max - score_ary.min,
  40. average: score_ary.inject(&:+)/len,
  41. median: (score_ary[(len-1)/2] + score_ary[(len/2)])/2 }
  42.  
  43. [:range, :average, :median].map { |stat| "#{stat.to_s.capitalize}: #{sec_to_str(stats[stat])}" }.join(' ')
  44. end
  45.  
  46. def parse_score_string(str)
  47. str.split(/,/).map { |stat| str_to_sec(stat) }
  48. end
  49.  
  50. def str_to_sec(str)
  51. ary_to_s str.split('|').map(&:to_i)
  52. end
  53.  
  54. def ary_to_s(hms)
  55. 3600* hms[0] + 60*hms[1] + hms[2]
  56. end
  57.  
  58. def sec_to_str(sec)
  59. "%02d|%02d|%02d" % [sec / 3600, sec % 3600 / 60 , sec % 60]
  60. end
  61.  
  62. class RaceStatsTest < MiniTest::Test
  63. def test_short_strings
  64. assert_equal(results(''), '')
  65. assert_equal(results('01|15|59, 1|47|6, 01|17|20, 1|32|34, 2|3|17'), 'Range: 00|47|18 Average: 01|35|15 Median: 01|32|34')
  66. assert_equal(results('02|15|59, 2|47|16, 02|17|20, 2|32|34, 2|17|17, 2|22|00, 2|31|41'), 'Range: 00|31|17 Average: 02|26|18 Median: 02|22|00')
  67. end
  68. end
Add Comment
Please, Sign In to add comment