diff --git a/2017/03/2spiral_memory.py b/2017/03/2spiral_memory.py new file mode 100755 index 0000000..eae461e --- /dev/null +++ b/2017/03/2spiral_memory.py @@ -0,0 +1,167 @@ +#!/home/dusk/.local/share/pipx/venvs/numpy/bin/python3 + +import numpy +if __name__ == '__main__': + target = 277678 + colstep = 1 + rowstep = -1 + square = 1 + pointer = [0, 0] + memory = [[1]] + value = 0 + + def grow_right(array): + new_array = [] + i = 0 + for row in array: + new_row = row + [0] + new_array = new_array + [new_row] + i += 1 + return new_array + + def grow_left(array): + new_array = [] + i = 0 + for row in array: + new_row = [0] + row + new_array = new_array + [new_row] + i += 1 + return new_array + + def grow_down(array): + row_width = len(array[0]) + new_array = array + numpy.zeros(row_width) + return new_array + + def grow_up(array): + row_width = len(array[0]) + new_array = numpy.zeros(row_width) + array + return new_array + + def get_adj(array, row, col, coords): + adj_value = 0 + for coord in coords: + pointer_row = row + pointer_col = col + match coord: + case 0: + pointer_col += 1 + case 1: + pointer_col += 1 + pointer_row += -1 + case 2: + pointer_row += -1 + case 3: + pointer_row += -1 + pointer_col += -1 + case 4: + pointer_col += -1 + case 5: + pointer_col += -1 + pointer_row += 1 + case 6: + pointer_row += 1 + case 7: + pointer_row += 1 + pointer_col += 1 + print(array) + adj_value += array[pointer_row][pointer_col] + adj_value = int(adj_value) + print(adj_value) + return adj_value + + def get_new_value(array, pointer): + adj_values = numpy.zeros(8) + # adjacent square coordinates: + # 3 2 1 + # 4 * 0 + # 5 6 7 + height = len(array) + width = len(array[0]) + row = pointer[0] + col = pointer[1] + is_right = False + is_up = False + is_left = False + is_down = False + if row == 0: + is_up = True + if row == (height - 1): + is_down = True + if col == 0: + is_left = True + if col == (width - 1): + is_right = True + + new_value = 0 + + if not is_right: + new_value += get_adj(array, row, col, [0]) + if not is_up: + new_value += get_adj(array, row, col, [2]) + if not is_left: + new_value += get_adj(array, row, col, [4]) + if not is_down: + new_value += get_adj(array, row, col, [6]) + + if (not is_right) and (not is_up): + new_value += get_adj(array, row, col, [1]) + if (not is_up) and (not is_left): + new_value += get_adj(array, row, col, [3]) + if (not is_left) and (not is_down): + new_value += get_adj(array, row, col, [5]) + if (not is_down) and (not is_right): + new_value += get_adj(array, row, col, [7]) + + if is_right and is_up and is_left and is_down: + new_value += 1 + + new_value = int(new_value) + return new_value + + def increment_step(step): + sign = int(step / abs(step)) # +/- 1 + new_sign = int(-1 * sign) + new_step = int(new_sign * (abs(step) + 1)) + return new_step + + while value <= target: + # colstep + i = 1 + if colstep >= 0: + memory = grow_right(memory) + else: + memory = grow_left(memory) + pointer[1] += 1 + while value <= target and i <= abs(colstep): + square += 1 + # step to next col + if colstep >= 0: + pointer[1] += 1 + else: + pointer[1] += -1 + value = get_new_value(memory, pointer) + memory[pointer[0]][pointer[1]] = value + i += 1 + print(memory) + colstep = increment_step(colstep) + # now for rowstep + i = 1 + if rowstep >= 0: + memory = grow_down(memory) + else: + memory = grow_up(memory) + pointer[0] += 1 + while value <= target and i <= abs(rowstep): + square += 1 + if rowstep >= 0: + pointer[0] += 1 + else: + pointer[0] += -1 + value = get_new_value(memory, pointer) + memory[pointer[0]][pointer[1]] = value + i += 1 + print(memory) + rowstep = increment_step(rowstep) + + print(value)