Created
July 19, 2016 07:19
-
-
Save rskwan/8b2b521d1275dccb4bb3c94a4f466161 to your computer and use it in GitHub Desktop.
Swift Navigation Problem
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import math | |
import sys | |
import unittest | |
def fibfeed(N): | |
"""Computes the first N Fibonacci numbers F(n), where | |
F(0) = 0 | |
F(1) = 1 | |
F(n) = F(n-1) + F(n-2) | |
and prints the appropriate string for each one. N can take | |
values from 0 to the maximum integer, and raises an | |
exception otherwise. | |
""" | |
if not isinstance(N, int): | |
raise ValueError("N must be an integer.") | |
if N < 0: | |
raise ValueError("N must be at least 0.") | |
# 0 is always printed. | |
print 0 | |
# curr_f is the COUNT-th Fibonacci number | |
count = 1 | |
prev_f, curr_f = 0, 1 | |
while count < N: | |
print str_to_print(curr_f) | |
prev_f, curr_f = curr_f, prev_f + curr_f | |
count += 1 | |
print str_to_print(curr_f) | |
def str_to_print(f): | |
"""Returns the string that should be printed for an | |
integer f, according to the assignment spec.""" | |
if not isinstance(f, int): | |
raise ValueError("f must be an integer.") | |
if f == 0: | |
return str(f) | |
elif f % 3 == 0: | |
# when f % 15 == 0, this branch will always be reached | |
if f % 5 == 0: | |
return "FizzBuzz" | |
# f can only be prime here if f == 3 | |
elif f == 3: | |
return "BuzzFizz" | |
return "Buzz" | |
elif f % 5 == 0: | |
# f can only be prime here if f == 5 | |
if f == 5: | |
return "BuzzFizz" | |
return "Fizz" | |
elif is_prime(f): | |
return "BuzzFizz" | |
else: | |
return str(f) | |
def is_prime(n): | |
"""Returns True if n is prime and False otherwise, | |
with n an integer.""" | |
if not isinstance(n, int): | |
raise ValueError("n must be an integer.") | |
if n <= 1: | |
return False | |
for k in range(2, int(math.sqrt(n)) + 1): | |
if n % k == 0: | |
return False | |
return True | |
class TestFibFeed(unittest.TestCase): | |
def setUp(self): | |
# expected outpupt up to F(20); | |
# F(20) is the first divisible by 15 | |
self.expected20 = [ | |
"0", | |
"1", | |
"1", | |
"BuzzFizz", | |
"BuzzFizz", | |
"BuzzFizz", | |
"8", | |
"BuzzFizz", | |
"Buzz", | |
"34", | |
"Fizz", | |
"BuzzFizz", | |
"Buzz", | |
"BuzzFizz", | |
"377", | |
"Fizz", | |
"Buzz", | |
"BuzzFizz", | |
"2584", | |
"4181", | |
"FizzBuzz" | |
] | |
def test_is_prime(self): | |
with self.assertRaises(ValueError): | |
is_prime("hello") | |
is_prime(True) | |
is_prime(2.7) | |
self.assertFalse(is_prime(0)) | |
self.assertFalse(is_prime(1)) | |
self.assertTrue(is_prime(2)) | |
self.assertTrue(is_prime(3)) | |
self.assertFalse(is_prime(4)) | |
self.assertTrue(is_prime(5)) | |
self.assertFalse(is_prime(6)) | |
self.assertTrue(is_prime(7)) | |
self.assertFalse(is_prime(8)) | |
self.assertFalse(is_prime(9)) | |
self.assertFalse(is_prime(10)) | |
self.assertTrue(is_prime(11)) | |
self.assertFalse(is_prime(12)) | |
self.assertTrue(is_prime(13)) | |
self.assertFalse(is_prime(14)) | |
self.assertFalse(is_prime(15)) | |
def test_str_bad_input(self): | |
with self.assertRaises(ValueError): | |
str_to_print("hello") | |
str_to_print(True) | |
str_to_print(2.7) | |
def test_str_3(self): | |
for k in range(2, 100 / 3): | |
if k % 5 != 0: | |
self.assertEqual(str_to_print(k * 3), "Buzz") | |
def test_str_5(self): | |
for k in range(2, 100 / 5): | |
if k % 3 != 0: | |
self.assertEqual(str_to_print(k * 5), "Fizz") | |
def test_str_15(self): | |
for k in range(1, 100 / 15): | |
self.assertEqual(str_to_print(k * 15), "FizzBuzz") | |
def test_str_prime(self): | |
self.assertEqual(str_to_print(2), "BuzzFizz") | |
self.assertEqual(str_to_print(3), "BuzzFizz") | |
self.assertEqual(str_to_print(5), "BuzzFizz") | |
self.assertEqual(str_to_print(7), "BuzzFizz") | |
self.assertEqual(str_to_print(11), "BuzzFizz") | |
self.assertEqual(str_to_print(13), "BuzzFizz") | |
self.assertEqual(str_to_print(43), "BuzzFizz") | |
self.assertEqual(str_to_print(97), "BuzzFizz") | |
def test_str_no_fit(self): | |
self.assertEqual(str_to_print(0), "0") | |
self.assertEqual(str_to_print(1), "1") | |
self.assertEqual(str_to_print(4), "4") | |
self.assertEqual(str_to_print(8), "8") | |
self.assertEqual(str_to_print(14), "14") | |
def test_fibfeed_3(self): | |
expected = '\n'.join(self.expected20[:4]) | |
fibfeed(3) | |
output = sys.stdout.getvalue().strip() | |
self.assertEquals(output, expected) | |
def test_fibfeed_20(self): | |
expected = '\n'.join(self.expected20) | |
fibfeed(20) | |
output = sys.stdout.getvalue().strip() | |
self.assertEquals(output, expected) | |
if __name__ == "__main__": | |
unittest.main(module=__name__, buffer=True, exit=False) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment