Python
import sys
import unittest
class ThreePlusOne:
def __init__(self):
pass
def getArray(self, number):
return self.__calculateValues(number)
def __calculateValues(self, number):
current_value = number
calculated_values = []
calculated_values.append(current_value)
while current_value != 1:
if (current_value % 2) == 0:
current_value = current_value / 2
else:
current_value = current_value * 3 + 1
calculated_values.append(current_value)
return calculated_values
def getLength(self, number):
return len(self.__calculateValues(number))
def getMaxLengthWithRange(self, start_number, end_number):
max_length = 0
for current_number in range(start_number, end_number):
length = self.getLength(current_number)
if length > max_length:
max_length = length
return max_length
def displayResult(self, start_number, end_number):
max_length = self.getMaxLengthWithRange(start_number, end_number)
print '%d %d %d' % (start_number, end_number, max_length)
class ThreePlusOneTest(unittest.TestCase):
def setUp(self):
pass
def testCheckValue(self):
correct_values = [22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
t = ThreePlusOne()
make_values = t.getArray(22)
self.assertEqual(make_values, correct_values)
def testCheckSize(self):
correct_value = 16
t = ThreePlusOne()
make_value = t.getLength(22)
self.assertEqual(make_value, correct_value)
def testCheckRange(self):
t = ThreePlusOne()
result = t.getMaxLengthWithRange(1, 10)
self.assertEqual(result, 20)
result = t.getMaxLengthWithRange(100, 200)
self.assertEqual(result, 125)
result = t.getMaxLengthWithRange(201, 210)
self.assertEqual(result, 89)
result = t.getMaxLengthWithRange(900, 1000)
self.assertEqual(result, 174)
def testDisplay(self):
t = ThreePlusOne()
t.displayResult(1, 10)
t.displayResult(100, 200)
t.displayResult(201, 210)
t.displayResult(900, 1000)
if __name__ == '__main__':
unittest.main()
Ruby
require 'test/unit'
class ThreePlusOne
attr_reader :recent_results, :recent_number
attr_writer :recent_results, :recent_number
def getArray(number)
self.calculate(number)
return self.recent_results
end
def getLength(number)
self.calculate(number)
return self.recent_results.length
end
def getMaxLengthWithRange(start_number, end_number)
max_length = 0
for i in start_number..end_number
current_length = self.getLength(i)
max_length = [max_length, current_length].max
end
return max_length
end
def calculate(number)
@recent_number = number
@recent_results = []
current_value = number
@recent_results.push(current_value)
while current_value != 1
if current_value % 2 == 0 : current_value = current_value / 2
else current_value = current_value * 3 + 1
end
@recent_results.push(current_value)
end
return @recent_results
end
end
class TestThreePlusOne < Test::Unit::TestCase
def test_case
t = ThreePlusOne.new()
assert_equal(t.getArray(22), [22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1])
assert_equal(t.getLength(22), 16)
assert_equal(t.getMaxLengthWithRange(1, 10), 20)
assert_equal(t.getMaxLengthWithRange(100, 200), 125)
assert_equal(t.getMaxLengthWithRange(201, 210), 89)
assert_equal(t.getMaxLengthWithRange(900, 1000), 174)
end
end