Skip to content

Instantly share code, notes, and snippets.

@rskwan
Created July 19, 2016 07:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rskwan/8b2b521d1275dccb4bb3c94a4f466161 to your computer and use it in GitHub Desktop.
Save rskwan/8b2b521d1275dccb4bb3c94a4f466161 to your computer and use it in GitHub Desktop.
Swift Navigation Problem
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