def get_pixel_at(pixel_grid, i, j):
'''
Returns the pixel in pixel_grid at row i and column j (zero-indexed).
Returns 0 if i or j is out of bounds for the given pixel_grid.
'''
if i>=0 and j>=0:
if i<len(pixel_grid) and j<len(pixel_grid[i]):
return pixel_grid[i][j]
else:
return 0
else:
return 0
def average_of_surrounding(pixel_grid, i, j):
'''
Returns the unweighted average of the values of the pixel at row i
and column j and the eight pixels surrounding it.
'''
pixel_sum = 0
for r in [i-1, i, i+1]:
for c in [j-1, j, j+1]:
pixel_sum=pixel_sum+get_pixel_at(pixel_grid, r, c)
# pixel_sum should be an integer. We intend for this to be
# truncating integer division.
return pixel_sum / 9
def blur(pixel_grid):
'''
Given pixel_grid (a grid of pixels), returns a new grid of pixels
that is the result of blurring pixel_grid. In the output grid,
each pixel is the average of that pixel and its eight neighbors in
the input grid.
'''
new_grid=pixel_grid
for r in range(0, len(pixel_grid)):
for c in range(0, len(pixel_grid[r])):
new_grid[r][c]=average_of_surrounding(pixel_grid, r, c)
return new_grid
def test_average_of_surrounding():
test_grid = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print blur(test_grid)
test_average_of_surrounding()
ZGVmIGdldF9waXhlbF9hdChwaXhlbF9ncmlkLCBpLCBqKToKICAgICcnJwogICAgUmV0dXJucyB0aGUgcGl4ZWwgaW4gcGl4ZWxfZ3JpZCBhdCByb3cgaSBhbmQgY29sdW1uIGogKHplcm8taW5kZXhlZCkuCiAgICBSZXR1cm5zIDAgaWYgaSBvciBqIGlzIG91dCBvZiBib3VuZHMgZm9yIHRoZSBnaXZlbiBwaXhlbF9ncmlkLgogICAgJycnCiAgICBpZiBpPj0wIGFuZCBqPj0wOiAKICAgIAlpZiBpPGxlbihwaXhlbF9ncmlkKSBhbmQgajxsZW4ocGl4ZWxfZ3JpZFtpXSk6CiAgICAgICAgCXJldHVybiBwaXhlbF9ncmlkW2ldW2pdCiAgICAgICAgZWxzZTogCiAgICAgICAgCXJldHVybiAwCiAgICBlbHNlOgogICAgICAgIHJldHVybiAwCgpkZWYgYXZlcmFnZV9vZl9zdXJyb3VuZGluZyhwaXhlbF9ncmlkLCBpLCBqKToKICAgICcnJwogICAgUmV0dXJucyB0aGUgdW53ZWlnaHRlZCBhdmVyYWdlIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIHBpeGVsIGF0IHJvdyBpIAogICAgYW5kIGNvbHVtbiBqIGFuZCB0aGUgZWlnaHQgcGl4ZWxzIHN1cnJvdW5kaW5nIGl0LgogICAgJycnCiAgICBwaXhlbF9zdW0gPSAwCiAgICBmb3IgciBpbiBbaS0xLCBpLCBpKzFdOgogICAgICAgIGZvciBjIGluIFtqLTEsIGosIGorMV06CiAgICAgICAgICAgIHBpeGVsX3N1bT1waXhlbF9zdW0rZ2V0X3BpeGVsX2F0KHBpeGVsX2dyaWQsIHIsIGMpCiAgICAjIHBpeGVsX3N1bSBzaG91bGQgYmUgYW4gaW50ZWdlci4gV2UgaW50ZW5kIGZvciB0aGlzIHRvIGJlIAogICAgIyB0cnVuY2F0aW5nIGludGVnZXIgZGl2aXNpb24uICAKICAgIHJldHVybiBwaXhlbF9zdW0gLyA5CiAgICAKZGVmIGJsdXIocGl4ZWxfZ3JpZCk6CiAgICAnJycKICAgIEdpdmVuIHBpeGVsX2dyaWQgKGEgZ3JpZCBvZiBwaXhlbHMpLCByZXR1cm5zIGEgbmV3IGdyaWQgb2YgcGl4ZWxzCiAgICB0aGF0IGlzIHRoZSByZXN1bHQgb2YgYmx1cnJpbmcgcGl4ZWxfZ3JpZC4gSW4gdGhlIG91dHB1dCBncmlkLCAKICAgIGVhY2ggcGl4ZWwgaXMgdGhlIGF2ZXJhZ2Ugb2YgdGhhdCBwaXhlbCBhbmQgaXRzIGVpZ2h0IG5laWdoYm9ycyBpbgogICAgdGhlIGlucHV0IGdyaWQuIAogICAgJycnCgogICAgbmV3X2dyaWQ9cGl4ZWxfZ3JpZAogICAgZm9yIHIgaW4gcmFuZ2UoMCwgbGVuKHBpeGVsX2dyaWQpKToKICAgICAgICBmb3IgYyBpbiByYW5nZSgwLCBsZW4ocGl4ZWxfZ3JpZFtyXSkpOgogICAgICAgICAgICBuZXdfZ3JpZFtyXVtjXT1hdmVyYWdlX29mX3N1cnJvdW5kaW5nKHBpeGVsX2dyaWQsIHIsIGMpCiAgICByZXR1cm4gbmV3X2dyaWQKICAgIApkZWYgdGVzdF9hdmVyYWdlX29mX3N1cnJvdW5kaW5nKCk6CiAgICB0ZXN0X2dyaWQgPSBbCiAgICAgICAgWzEsIDIsIDNdLAogICAgICAgIFs0LCA1LCA2XSwKICAgICAgICBbNywgOCwgOV0KICAgIF0KCQogICAgcHJpbnQgYmx1cih0ZXN0X2dyaWQpCnRlc3RfYXZlcmFnZV9vZl9zdXJyb3VuZGluZygp