Commit b1b071b
Changed files (2)
spec
fixtures
kata
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
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