diff options
| author | mo khan <mo@mokhan.ca> | 2016-08-16 20:38:56 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2016-08-16 20:38:56 -0600 |
| commit | b1b071bbad4ae5655a410bc983ceb1d190d07e66 (patch) | |
| tree | aea2da78bf1059549b41ff868d5047285a327cda | |
| parent | 30c9d52e44a460deb9403387b79896cddaaed861 (diff) | |
weather data kata.
| -rw-r--r-- | spec/fixtures/weather.dat | 33 | ||||
| -rw-r--r-- | spec/kata/weather_data_spec.rb | 62 |
2 files changed, 95 insertions, 0 deletions
diff --git a/spec/fixtures/weather.dat b/spec/fixtures/weather.dat new file mode 100644 index 0000000..53789aa --- /dev/null +++ b/spec/fixtures/weather.dat @@ -0,0 +1,33 @@ + Dy MxT MnT AvT HDDay AvDP 1HrP TPcpn WxType PDir AvSp Dir MxS SkyC MxR MnR AvSLP + + 1 88 59 74 53.8 0.00 F 280 9.6 270 17 1.6 93 23 1004.5 + 2 79 63 71 46.5 0.00 330 8.7 340 23 3.3 70 28 1004.5 + 3 77 55 66 39.6 0.00 350 5.0 350 9 2.8 59 24 1016.8 + 4 77 59 68 51.1 0.00 110 9.1 130 12 8.6 62 40 1021.1 + 5 90 66 78 68.3 0.00 TFH 220 8.3 260 12 6.9 84 55 1014.4 + 6 81 61 71 63.7 0.00 RFH 030 6.2 030 13 9.7 93 60 1012.7 + 7 73 57 65 53.0 0.00 RF 050 9.5 050 17 5.3 90 48 1021.8 + 8 75 54 65 50.0 0.00 FH 160 4.2 150 10 2.6 93 41 1026.3 + 9 86 32* 59 6 61.5 0.00 240 7.6 220 12 6.0 78 46 1018.6 + 10 84 64 74 57.5 0.00 F 210 6.6 050 9 3.4 84 40 1019.0 + 11 91 59 75 66.3 0.00 H 250 7.1 230 12 2.5 93 45 1012.6 + 12 88 73 81 68.7 0.00 RTH 250 8.1 270 21 7.9 94 51 1007.0 + 13 70 59 65 55.0 0.00 H 150 3.0 150 8 10.0 83 59 1012.6 + 14 61 59 60 5 55.9 0.00 RF 060 6.7 080 9 10.0 93 87 1008.6 + 15 64 55 60 5 54.9 0.00 F 040 4.3 200 7 9.6 96 70 1006.1 + 16 79 59 69 56.7 0.00 F 250 7.6 240 21 7.8 87 44 1007.0 + 17 81 57 69 51.7 0.00 T 260 9.1 270 29* 5.2 90 34 1012.5 + 18 82 52 67 52.6 0.00 230 4.0 190 12 5.0 93 34 1021.3 + 19 81 61 71 58.9 0.00 H 250 5.2 230 12 5.3 87 44 1028.5 + 20 84 57 71 58.9 0.00 FH 150 6.3 160 13 3.6 90 43 1032.5 + 21 86 59 73 57.7 0.00 F 240 6.1 250 12 1.0 87 35 1030.7 + 22 90 64 77 61.1 0.00 H 250 6.4 230 9 0.2 78 38 1026.4 + 23 90 68 79 63.1 0.00 H 240 8.3 230 12 0.2 68 42 1021.3 + 24 90 77 84 67.5 0.00 H 350 8.5 010 14 6.9 74 48 1018.2 + 25 90 72 81 61.3 0.00 190 4.9 230 9 5.6 81 29 1019.6 + 26 97* 64 81 70.4 0.00 H 050 5.1 200 12 4.0 107 45 1014.9 + 27 91 72 82 69.7 0.00 RTH 250 12.1 230 17 7.1 90 47 1009.0 + 28 84 68 76 65.6 0.00 RTFH 280 7.6 340 16 7.0 100 51 1011.0 + 29 88 66 77 59.7 0.00 040 5.4 020 9 5.3 84 33 1020.6 + 30 90 45 68 63.6 0.00 H 240 6.0 220 17 4.8 200 41 1022.7 + mo 82.9 60.5 71.7 16 58.8 0.00 6.9 5.3 diff --git a/spec/kata/weather_data_spec.rb b/spec/kata/weather_data_spec.rb new file mode 100644 index 0000000..fdfccf3 --- /dev/null +++ b/spec/kata/weather_data_spec.rb @@ -0,0 +1,62 @@ +require 'spec_helper' +require 'csv' +require 'ostruct' +#In weather.dat you’ll find daily weather data for Morristown, NJ for June 2002. +#Download this text file, then write a program to output the day number (column one) +#with the smallest temperature spread (the maximum temperature is the second column, the minimum the third column). + +class Day + include Comparable + attr_reader :day, :spread + + def initialize(day:, max:, min:) + @day = day + @spread = max - min + end + + def <=>(other) + @spread <=> other.spread + end + + def self.map_from(row) + Day.new(day: row[0], max: row[1].to_f, min: row[2].to_f) + end +end + +class Spread + include Enumerable + + def initialize(filename, mapper) + @file_path = File.join(File.dirname(__FILE__), "../fixtures", filename) + @mapper = mapper + end + + def each + open_file do |file| + file.each_line.with_index do |line, index| + next if index == 0 + next if line.chomp.empty? + yield mapper.map_from(line.split) + end + end + end + + private + + def open_file + file = File.new(file_path) + yield file + ensure + file.close + end + + attr_reader :file_path, :mapper +end + +describe "spread" do + subject { Spread.new('weather.dat', Day) } + + it 'returns the day with the smallest temperature spread' do + expect(subject.min.day).to eql('14') + end +end |
