diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e660f74 --- /dev/null +++ b/.gitignore @@ -0,0 +1,141 @@ +# Created by .ignore support plugin (hsz.mobi) +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + diff --git a/flatonacci.py b/flatonacci.py index 0b04123..d47451c 100644 --- a/flatonacci.py +++ b/flatonacci.py @@ -25,4 +25,18 @@ def flatonacci(signature: list, n: int) -> list: # happy coding - pass + assert isinstance(signature, list) and len(signature) == 3, " signature should be a list and has at least 3 numbers" + assert (n >= 0) + + if n == 0: + return list() + + copy_signature = signature.copy() + for _ in range(n - len(signature)): + new_element = sum([ + copy_signature[-x] + for x in range(1, 4) + ]) + copy_signature.extend([new_element]) + + return copy_signature diff --git a/test.py b/test.py new file mode 100644 index 0000000..e4063fc --- /dev/null +++ b/test.py @@ -0,0 +1,38 @@ +import unittest +from unittest import TestCase + +from flatonacci import flatonacci + + +class FlatonacciTest(TestCase): + + def test_flatonacci_returns_empty_list_when_n_is_zero(self): + signature = [1, 1, 1] + n = 0 + result = flatonacci(signature=signature, n=n) + self.assertListEqual( + list1=list(), + list2=result, + ) + + def test_flatonacci_returns_correct_list_when_n_is_8(self): + signature = [1, 1, 1] + n = 8 + result = flatonacci(signature=signature, n=n) + self.assertListEqual( + list1=[1, 1, 1, 3, 5, 9, 17, 31], + list2=result, + ) + + def test_flatonacci_returns_correct_list_when_n_is_9(self): + signature = [0, 0, 1] + n = 9 + result = flatonacci(signature=signature, n=n) + self.assertListEqual( + list1=[0, 0, 1, 1, 2, 4, 7, 13, 24], + list2=result, + ) + + +if __name__ == '__main__': + unittest.main()