From ecfe2e6f3ab3e4a4e7d7d19f6869996937b0697d Mon Sep 17 00:00:00 2001 From: Raphael Roberts Date: Mon, 21 Oct 2019 11:44:17 -0500 Subject: [PATCH] Added a diagonal iterator --- .gitignore | 1 + prim_wallpaper/pickers/__init__.py | 0 prim_wallpaper/pickers/diagonal.py | 56 ++++++++++++++++++++++++++++++ test.py | 3 ++ 4 files changed, 60 insertions(+) create mode 100644 prim_wallpaper/pickers/__init__.py create mode 100644 prim_wallpaper/pickers/diagonal.py create mode 100644 test.py diff --git a/.gitignore b/.gitignore index ff0c96f..7b5b841 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .dir-locals.el __pycache__ *.png +*.csv diff --git a/prim_wallpaper/pickers/__init__.py b/prim_wallpaper/pickers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/prim_wallpaper/pickers/diagonal.py b/prim_wallpaper/pickers/diagonal.py new file mode 100644 index 0000000..872e19f --- /dev/null +++ b/prim_wallpaper/pickers/diagonal.py @@ -0,0 +1,56 @@ +from math import sqrt + + +def get_row_num(i): + return int((sqrt(8 * i + 1) - 1) / 2) + + +def get_last_whole_i(row): + return (row * (row + 1)) // 2 + + +class DiagonalCounter: + def __init__(self, table_size): + self.table_size = table_size + + def diagonal(self, i): + row = get_row_num(i) + last_whole_i = get_last_whole_i(row) + if row < self.table_size: + y = i - last_whole_i + x = row - y + return x, y + else: + x, y = self.diagonal(self.table_size ** 2 - (1 + i)) + return self.table_size - x - 1, self.table_size - y - 1 + + def diagonal_reversed(self, i): + y, x = self.diagonal(i) + return x, y + + def diagonal_then_reversed(self, i): + row = get_row_num(i) + if row > self.table_size: + row += 1 + if row % 2 != 0: + return self.diagonal(i) + else: + return self.diagonal_reversed(i) + + +if __name__ == "__main__": + import csv + + d = DiagonalCounter(6) + for func in (d.diagonal, d.diagonal_reversed, d.diagonal_then_reversed): + output = list( + list(-1 for i in range(d.table_size)) for j in range(d.table_size) + ) + indices = map(func, range(d.table_size ** 2)) + for i, index in enumerate(indices): + x, y = index + output[y][x] = i + + with open(func.__name__ + ".csv", "w", newline="") as file: + writer = csv.writer(file) + writer.writerows(output) diff --git a/test.py b/test.py new file mode 100644 index 0000000..9c54431 --- /dev/null +++ b/test.py @@ -0,0 +1,3 @@ +from prim_wallpaper.make_wallpaper import make_wallpaper + +i = make_wallpaper(3, 5, 6)