import math
def is_prime(num):
if num <= 1:
return False
if num == 2:
return True
if num % 2 == 0:
return False
for i in range(3, int(math.sqrt(num)) + 1, 2):
if num % i == 0:
return False
return True
def meets_criteria(num):
absolute_value = abs(num)
if is_prime(absolute_value) or absolute_value % 3 == 0:
return True
return False
def spiral_collection(matrix, r, c):
if not matrix or not matrix:
return []
rows, cols = len(matrix), len(matrix)
collected_elements = []
visited = set()
x, y = r, c
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]
direction = 0
step_size = 1
if 0 <= x < rows and 0 <= y < cols and (x, y) not in visited:
element = matrix[x][y]
if meets_criteria(element):
collected_elements.append(element)
visited.add((x, y))
while len(visited) < rows * cols:
for _ in range(2):
for _ in range(step_size):
x += dr[direction]
y += dc[direction]
if 0 <= x < rows and 0 <= y < cols and (x, y) not in visited:
element = matrix[x][y]
if meets_criteria(element):
collected_elements.append(element)
visited.add((x, y))
direction = (direction + 1) % 4
step_size += 1
return sorted(list(set(collected_elements)))
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]
start_row = 1
start_col = 1
result = spiral_collection(matrix, start_row, start_col)
print(result)
aW1wb3J0IG1hdGgKCmRlZiBpc19wcmltZShudW0pOgogICAgaWYgbnVtIDw9IDE6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBpZiBudW0gPT0gMjoKICAgICAgICByZXR1cm4gVHJ1ZQogICAgaWYgbnVtICUgMiA9PSAwOgogICAgICAgIHJldHVybiBGYWxzZQogICAgZm9yIGkgaW4gcmFuZ2UoMywgaW50KG1hdGguc3FydChudW0pKSArIDEsIDIpOgogICAgICAgIGlmIG51bSAlIGkgPT0gMDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gVHJ1ZQoKZGVmIG1lZXRzX2NyaXRlcmlhKG51bSk6CiAgICBhYnNvbHV0ZV92YWx1ZSA9IGFicyhudW0pCiAgICBpZiBpc19wcmltZShhYnNvbHV0ZV92YWx1ZSkgb3IgYWJzb2x1dGVfdmFsdWUgJSAzID09IDA6CiAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKZGVmIHNwaXJhbF9jb2xsZWN0aW9uKG1hdHJpeCwgciwgYyk6CiAgICBpZiBub3QgbWF0cml4IG9yIG5vdCBtYXRyaXg6CiAgICAgICAgcmV0dXJuIFtdCgogICAgcm93cywgY29scyA9IGxlbihtYXRyaXgpLCBsZW4obWF0cml4KQogICAgY29sbGVjdGVkX2VsZW1lbnRzID0gW10KICAgIHZpc2l0ZWQgPSBzZXQoKQoKICAgIHgsIHkgPSByLCBjCiAgICBkciA9IFswLCAxLCAwLCAtMV0KICAgIGRjID0gWzEsIDAsIC0xLCAwXQogICAgZGlyZWN0aW9uID0gMAogICAgc3RlcF9zaXplID0gMQogICAgCiAgICBpZiAwIDw9IHggPCByb3dzIGFuZCAwIDw9IHkgPCBjb2xzIGFuZCAoeCwgeSkgbm90IGluIHZpc2l0ZWQ6CiAgICAgICAgZWxlbWVudCA9IG1hdHJpeFt4XVt5XQogICAgICAgIGlmIG1lZXRzX2NyaXRlcmlhKGVsZW1lbnQpOgogICAgICAgICAgICBjb2xsZWN0ZWRfZWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCiAgICAgICAgdmlzaXRlZC5hZGQoKHgsIHkpKQoKICAgIHdoaWxlIGxlbih2aXNpdGVkKSA8IHJvd3MgKiBjb2xzOgogICAgICAgIGZvciBfIGluIHJhbmdlKDIpOgogICAgICAgICAgICBmb3IgXyBpbiByYW5nZShzdGVwX3NpemUpOgogICAgICAgICAgICAgICAgeCArPSBkcltkaXJlY3Rpb25dCiAgICAgICAgICAgICAgICB5ICs9IGRjW2RpcmVjdGlvbl0KCiAgICAgICAgICAgICAgICBpZiAwIDw9IHggPCByb3dzIGFuZCAwIDw9IHkgPCBjb2xzIGFuZCAoeCwgeSkgbm90IGluIHZpc2l0ZWQ6CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG1hdHJpeFt4XVt5XQogICAgICAgICAgICAgICAgICAgIGlmIG1lZXRzX2NyaXRlcmlhKGVsZW1lbnQpOgogICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfZWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgdmlzaXRlZC5hZGQoKHgsIHkpKQoKICAgICAgICAgICAgZGlyZWN0aW9uID0gKGRpcmVjdGlvbiArIDEpICUgNAogICAgICAgIHN0ZXBfc2l6ZSArPSAxCgogICAgcmV0dXJuIHNvcnRlZChsaXN0KHNldChjb2xsZWN0ZWRfZWxlbWVudHMpKSkKCm1hdHJpeCA9IFsKICAgIFsxLCAyLCAzLCA0XSwKICAgIFs1LCA2LCA3LCA4XSwKICAgIFs5LCAxMCwgMTEsIDEyXSwKICAgIFsxMywgMTQsIDE1LCAxNl0KXQpzdGFydF9yb3cgPSAxCnN0YXJ0X2NvbCA9IDEKCnJlc3VsdCA9IHNwaXJhbF9jb2xsZWN0aW9uKG1hdHJpeCwgc3RhcnRfcm93LCBzdGFydF9jb2wpCnByaW50KHJlc3VsdCk=