diff --git a/bridges2005-47.pdf b/bridges2005-47.pdf new file mode 100644 index 0000000..5b3b358 Binary files /dev/null and b/bridges2005-47.pdf differ diff --git a/euclidean.py b/euclidean.py new file mode 100644 index 0000000..797fa57 --- /dev/null +++ b/euclidean.py @@ -0,0 +1,43 @@ +def distribute(pattern, remainder): + if len(remainder) <= 1: + # if remainder is 1 join into pattern + # if no remainder just return pattern + return ["".join(pattern + remainder)] + + while remainder: + for i in range(0, len(pattern)): + if remainder: + pattern[i] += remainder.pop() + + return pattern + + + +def split(pattern): + """ split pattern by moving smaller sequences to remainder """ + min_len = min([len(j) for j in pattern]) + max_len = max([len(j) for j in pattern]) + remainder = [] + + if max_len != min_len: + while len(pattern[-1]) == min_len: + remainder.append(pattern.pop()) + # else means all sequences are of the same size so no remainder + + return pattern, remainder + + + +def euclidean_rythm(k, n): + """ k hits in measure of length n """ + + hits = list('X' * k) + silences = list('.' * (n - k)) + + while True: + hits = distribute(hits, silences) + + if len(hits) == 1: + return hits.pop() + else: + hits, silences = split(hits) diff --git a/test_euclidean.py b/test_euclidean.py new file mode 100644 index 0000000..4b53918 --- /dev/null +++ b/test_euclidean.py @@ -0,0 +1,5 @@ +from euclidean import euclidean_rythm + +def test_euclidean_rythm(): + assert euclidean_rythm(k=3, n=12) == 'X...X...X...' + assert euclidean_rythm(k=5, n=13) == 'X..X.X..X.X..'