diff --git a/exercises/pascals-triangle/example.py b/exercises/pascals-triangle/example.py index 15b2e04f3a..676791e640 100644 --- a/exercises/pascals-triangle/example.py +++ b/exercises/pascals-triangle/example.py @@ -1,14 +1,12 @@ -def triangle(nth): - return [row(i) for i in range(nth + 1)] - - -def is_triangle(t): - new_t = triangle(len(t) - 1) - return t == new_t - - -def row(nth): - r = [1] - for i in range(1, nth + 1): - r.append(int(r[-1] * (nth - i + 1) / i)) - return " ".join([str(i) for i in r]) +def rows(row_count): + if row_count < 0: + return None + elif row_count == 0: + return [] + r = [] + for i in range(row_count): + rn = [1] + for j in range(i): + rn.append(sum(r[-1][j:j+2])) + r.append(rn) + return r diff --git a/exercises/pascals-triangle/pascals_triangle.py b/exercises/pascals-triangle/pascals_triangle.py index 7123ba7554..c1d878ce01 100644 --- a/exercises/pascals-triangle/pascals_triangle.py +++ b/exercises/pascals-triangle/pascals_triangle.py @@ -1,10 +1,2 @@ -def triangle(row_count): - pass - - -def is_triangle(triangle_rows_list): - pass - - -def row(row_count): +def rows(row_count): pass diff --git a/exercises/pascals-triangle/pascals_triangle_test.py b/exercises/pascals-triangle/pascals_triangle_test.py index c52ea441f1..c2c5068145 100644 --- a/exercises/pascals-triangle/pascals_triangle_test.py +++ b/exercises/pascals-triangle/pascals_triangle_test.py @@ -1,37 +1,51 @@ import unittest -from pascals_triangle import triangle, row, is_triangle +from pascals_triangle import rows + + +# Tests adapted from `problem-specifications//canonical-data.json` @ v1.2.0 + +TRIANGLE = [ + [1], + [1, 1], + [1, 2, 1], + [1, 3, 3, 1], + [1, 4, 6, 4, 1], + [1, 5, 10, 10, 5, 1], + [1, 6, 15, 20, 15, 6, 1], + [1, 7, 21, 35, 35, 21, 7, 1], + [1, 8, 28, 56, 70, 56, 28, 8, 1], + [1, 9, 36, 84, 126, 126, 84, 36, 9, 1] +] class PascalsTriangleTest(unittest.TestCase): - def test_triangle1(self): - ans = ['1', '1 1', '1 2 1', '1 3 3 1', '1 4 6 4 1'] - self.assertEqual(triangle(4), ans) - - def test_triangle2(self): - ans = ['1', '1 1', '1 2 1', '1 3 3 1', '1 4 6 4 1', '1 5 10 10 5 1', - '1 6 15 20 15 6 1'] - self.assertEqual(triangle(6), ans) - - def test_is_triangle_true(self): - inp = ['1', '1 1', '1 2 1', '1 3 3 1', '1 4 6 4 1', '1 5 10 10 5 1'] - self.assertIs(is_triangle(inp), True) - - def test_is_triangle_false(self): - inp = ['1', '1 1', '1 2 1', '1 4 4 1'] - self.assertIs(is_triangle(inp), False) - - def test_row1(self): - ans = '1' - self.assertEqual(row(0), ans) - - def test_row2(self): - ans = '1 2 1' - self.assertEqual(row(2), ans) - - def test_row3(self): - ans = '1 7 21 35 35 21 7 1' - self.assertEqual(row(7), ans) + def test_zero_rows(self): + self.assertEqual(rows(0), []) + + def test_single_row(self): + self.assertEqual(rows(1), TRIANGLE[:1]) + + def test_two_rows(self): + self.assertEqual(rows(2), TRIANGLE[:2]) + + def test_three_rows(self): + self.assertEqual(rows(3), TRIANGLE[:3]) + + def test_four_rows(self): + self.assertEqual(rows(4), TRIANGLE[:4]) + + def test_five_rows(self): + self.assertEqual(rows(5), TRIANGLE[:5]) + + def test_six_rows(self): + self.assertEqual(rows(6), TRIANGLE[:6]) + + def test_ten_rows(self): + self.assertEqual(rows(10), TRIANGLE[:10]) + + def test_negative_rows(self): + self.assertEqual(rows(-1), None) if __name__ == '__main__':