# Assumptions:
# 1) Each row has the same number of columns (the input is always rectangular; a square is a special case).
# 2) The input is a 2D matrix; single-row or single-column matrices are allowed.
# Note: Multiple test cases run at the end of the file.
def clockwiseMatrix(input):
output = []
# Go over top row
while len(input) > 0 and len(input[0]) > 0:
# iterating over top row
top_row_arr = input.pop(0)
output.extend(top_row_arr)
# in case list all items in array were iterated on, end loop
if len(input) == 0 or len(input[0]) == 0:
break
# iterating over last column reversed
for row in input:
last_col = row.pop(-1)
output.append(last_col)
# in case list all items in array were iterated on, end loop
if len(input) == 0 or len(input[0]) == 0:
break
# iterating over bottom row
botton_row_arr = input.pop(-1)
botton_row_arr = botton_row_arr[::-1]
output.extend(botton_row_arr)
# in case list all items in array were iterated on, end loop
if len(input) == 0 or len(input[0]) == 0:
break
# iterating over first column reversed
for row_idx in range(len(input) -1, -1, -1):
first_col = input[row_idx].pop(0)
output.append(first_col)
# in case list all items in array were iterated on, end loop
if len(input) == 0 or len(input[0]) == 0:
break
return output
test_1 = [[2, 3, 4, 8],
[5, 7, 9, 12],
[1, 0, 6, 10]]
test_2 = [[1, 2, 3, 4, 5],
[14, 15, 16, 17, 6],
[13, 20, 19, 18, 7],
[12, 11, 10, 9, 8],
]
test_3 = [[1, 2, 3, 4, 5],
[16, 17, 18, 19, 6],
[15, 24, 25, 20, 7],
[14, 23, 22, 21, 8],
[13, 12, 11, 10, 9],
]
test_4 = [[1, 2, 3, 4, 5]]
test_5 = [[1],
[2],
[3],
[4],
[5],
[6],
[7]]
test_8 = [['g', 'r', 'e', 'a', 't'],
['s', 's', '!', '!', ' '],
['e', 'c', 'c', 'u', 's']
]
print('test_1 (example provided) -', clockwiseMatrix(test_1)) # Expected [2, 3, 4, 8, 12, 10, 6, 0, 1, 5, 7, 9]
print('test_2 (rectangle) -', clockwiseMatrix(test_2)) # Expected [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
print('test_3 (Big Square) -', clockwiseMatrix(test_3)) # Expected [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
print('test_4 (single row) -', clockwiseMatrix(test_4)) # Expected [1, 2, 3, 4, 5]
print('test_5 (single column) -', clockwiseMatrix(test_5)) # Expected [1, 2, 3, 4, 5, 6, 7]
print('test_6 (single emptry_arr) -', clockwiseMatrix([])) # Expected []
print('test_7 (single emptry_arrays) -', clockwiseMatrix([[],[]])) # Expected []
print('test_8 (non int values) -', clockwiseMatrix(test_8)) # Expected []
IyBBc3N1bXB0aW9uczoKIyAxKSBFYWNoIHJvdyBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIGNvbHVtbnMgKHRoZSBpbnB1dCBpcyBhbHdheXMgcmVjdGFuZ3VsYXI7IGEgc3F1YXJlIGlzIGEgc3BlY2lhbCBjYXNlKS4KIyAyKSBUaGUgaW5wdXQgaXMgYSAyRCBtYXRyaXg7IHNpbmdsZS1yb3cgb3Igc2luZ2xlLWNvbHVtbiBtYXRyaWNlcyBhcmUgYWxsb3dlZC4KCiMgTm90ZTogTXVsdGlwbGUgdGVzdCBjYXNlcyBydW4gYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KCmRlZiBjbG9ja3dpc2VNYXRyaXgoaW5wdXQpOgogICAgb3V0cHV0ID0gW10KICAgICMgR28gb3ZlciB0b3Agcm93CiAgICB3aGlsZSBsZW4oaW5wdXQpID4gMCBhbmQgbGVuKGlucHV0WzBdKSA+IDA6CiAgICAgICAgIyBpdGVyYXRpbmcgb3ZlciB0b3Agcm93CiAgICAgICAgdG9wX3Jvd19hcnIgPSBpbnB1dC5wb3AoMCkKICAgICAgICBvdXRwdXQuZXh0ZW5kKHRvcF9yb3dfYXJyKQogICAgICAgIAogICAgICAgICMgaW4gY2FzZSBsaXN0IGFsbCBpdGVtcyBpbiBhcnJheSB3ZXJlIGl0ZXJhdGVkIG9uLCBlbmQgbG9vcAogICAgICAgIGlmIGxlbihpbnB1dCkgPT0gMCBvciBsZW4oaW5wdXRbMF0pID09IDA6CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgCiAgICAgICAgIyBpdGVyYXRpbmcgb3ZlciBsYXN0IGNvbHVtbiByZXZlcnNlZAogICAgICAgIGZvciByb3cgaW4gaW5wdXQ6CiAgICAgICAgICAgIGxhc3RfY29sID0gcm93LnBvcCgtMSkKICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChsYXN0X2NvbCkKICAgICAgICAgICAgCiAgICAgICAgIyBpbiBjYXNlIGxpc3QgYWxsIGl0ZW1zIGluIGFycmF5IHdlcmUgaXRlcmF0ZWQgb24sIGVuZCBsb29wCiAgICAgICAgaWYgbGVuKGlucHV0KSA9PSAwIG9yIGxlbihpbnB1dFswXSkgPT0gMDoKICAgICAgICAgICAgYnJlYWsgICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgIyBpdGVyYXRpbmcgb3ZlciBib3R0b20gcm93CiAgICAgICAgYm90dG9uX3Jvd19hcnIgPSBpbnB1dC5wb3AoLTEpCiAgICAgICAgYm90dG9uX3Jvd19hcnIgPSBib3R0b25fcm93X2Fycls6Oi0xXQogICAgICAgIG91dHB1dC5leHRlbmQoYm90dG9uX3Jvd19hcnIpCiAgICAgICAgCiAgICAgICAgIyBpbiBjYXNlIGxpc3QgYWxsIGl0ZW1zIGluIGFycmF5IHdlcmUgaXRlcmF0ZWQgb24sIGVuZCBsb29wCiAgICAgICAgaWYgbGVuKGlucHV0KSA9PSAwIG9yIGxlbihpbnB1dFswXSkgPT0gMDoKICAgICAgICAgICAgYnJlYWsgICAgICAgIAogICAgICAgIAogICAgICAgICMgaXRlcmF0aW5nIG92ZXIgZmlyc3QgY29sdW1uIHJldmVyc2VkCiAgICAgICAgZm9yIHJvd19pZHggaW4gcmFuZ2UobGVuKGlucHV0KSAtMSwgLTEsIC0xKToKICAgICAgICAgICAgZmlyc3RfY29sID0gaW5wdXRbcm93X2lkeF0ucG9wKDApCiAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoZmlyc3RfY29sKQogICAgICAgICAgICAKICAgICAgICAjIGluIGNhc2UgbGlzdCBhbGwgaXRlbXMgaW4gYXJyYXkgd2VyZSBpdGVyYXRlZCBvbiwgZW5kIGxvb3AKICAgICAgICBpZiBsZW4oaW5wdXQpID09IDAgb3IgbGVuKGlucHV0WzBdKSA9PSAwOgogICAgICAgICAgICBicmVhayAgICAgICAgICAgIAogICAgICAgICAgICAKICAgIHJldHVybiBvdXRwdXQKCnRlc3RfMSA9IFtbMiwgMywgNCwgOF0sCls1LCA3LCA5LCAxMl0sClsxLCAwLCA2LCAxMF1dCgp0ZXN0XzIgPSBbWzEsIDIsIDMsIDQsIDVdLApbMTQsIDE1LCAxNiwgMTcsIDZdLApbMTMsIDIwLCAxOSwgMTgsIDddLApbMTIsIDExLCAxMCwgOSwgOF0sCl0KCnRlc3RfMyA9IFtbMSwgMiwgMywgNCwgNV0sClsxNiwgMTcsIDE4LCAxOSwgNl0sClsxNSwgMjQsIDI1LCAyMCwgN10sClsxNCwgMjMsIDIyLCAyMSwgOF0sClsxMywgMTIsIDExLCAxMCwgOV0sCl0KCnRlc3RfNCA9IFtbMSwgMiwgMywgNCwgNV1dCgp0ZXN0XzUgPSBbWzFdLApbMl0sClszXSwKWzRdLApbNV0sCls2XSwKWzddXQoKCnRlc3RfOCA9IFtbJ2cnLCAncicsICdlJywgJ2EnLCAndCddLApbJ3MnLCAncycsICchJywgJyEnLCAnICddLApbJ2UnLCAnYycsICdjJywgJ3UnLCAncyddCl0KCnByaW50KCd0ZXN0XzEgKGV4YW1wbGUgcHJvdmlkZWQpIC0nLCBjbG9ja3dpc2VNYXRyaXgodGVzdF8xKSkgIyBFeHBlY3RlZCBbMiwgMywgNCwgOCwgMTIsIDEwLCA2LCAwLCAxLCA1LCA3LCA5XQpwcmludCgndGVzdF8yIChyZWN0YW5nbGUpIC0nLCBjbG9ja3dpc2VNYXRyaXgodGVzdF8yKSkgIyBFeHBlY3RlZCBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwXQpwcmludCgndGVzdF8zIChCaWcgU3F1YXJlKSAtJywgY2xvY2t3aXNlTWF0cml4KHRlc3RfMykpICMgRXhwZWN0ZWQgWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1XQpwcmludCgndGVzdF80IChzaW5nbGUgcm93KSAtJywgY2xvY2t3aXNlTWF0cml4KHRlc3RfNCkpICMgRXhwZWN0ZWQgWzEsIDIsIDMsIDQsIDVdCnByaW50KCd0ZXN0XzUgKHNpbmdsZSBjb2x1bW4pIC0nLCBjbG9ja3dpc2VNYXRyaXgodGVzdF81KSkgIyBFeHBlY3RlZCBbMSwgMiwgMywgNCwgNSwgNiwgN10KcHJpbnQoJ3Rlc3RfNiAoc2luZ2xlIGVtcHRyeV9hcnIpIC0nLCBjbG9ja3dpc2VNYXRyaXgoW10pKSAjIEV4cGVjdGVkIFtdCnByaW50KCd0ZXN0XzcgKHNpbmdsZSBlbXB0cnlfYXJyYXlzKSAtJywgY2xvY2t3aXNlTWF0cml4KFtbXSxbXV0pKSAjIEV4cGVjdGVkIFtdCnByaW50KCd0ZXN0XzggKG5vbiBpbnQgdmFsdWVzKSAtJywgY2xvY2t3aXNlTWF0cml4KHRlc3RfOCkpICMgRXhwZWN0ZWQgW10=