require "test/unit" NOT_A_NUMBER = 1 ALL_GOOD = 0 def update_previous_value_if_one_ahead(i, prev) if prev == nil prev = i.to_i else check_value = prev.to_i + 1 if check_value == i prev = i.to_i end end prev.to_i end def find_missing_number(sequence) arr = sequence.split(' ') unless arr.length return ALL_GOOD end prev = nil arr.each do |i| # Check if not a number if i =~ /\D/ return NOT_A_NUMBER end i = i.to_i # Wouldn't normally recommend this approach. if prev == nil and i == 2 return 1 end prev = update_previous_value_if_one_ahead(i, prev) if i != prev return prev + 1 end end ALL_GOOD end class BLUR_TEST < Test::Unit::TestCase def test_will_return_one_if_not_a_number assert_equal(NOT_A_NUMBER, find_missing_number('a')) end def test_will_return_missing_number assert_equal( 4, find_missing_number("1 2 3 5"), "It must work for missing middle terms") end def test_will_return_missing_number_two assert_equal( 2, find_missing_number("1 3") ) end def test_will_return_0_for_empty_set assert_equal( 0, find_missing_number("") ) end def test_will_return_missing_number_again assert_equal( 1, find_missing_number("2 3 4 5") ) end def test_will_return_1_on_invalid_sequence assert_equal( 1, find_missing_number("2 1 4 3 a") ) end end