Если вас не слишком заботит порядок, в котором пересекаются все диагонали, эта функция генератора в чистом Python сделает то же самое, используя тот факт, что вверх-вправо-вниз-назад-назад:
def rotate(row, n):
return row[n:] + row[:n]
def diags(grid, rev=False):
n = len(grid)
_grid = [list(row) + [None]*(n-1) for row in grid] # pad for rotation
for diag in zip(*(rotate(_grid[i], (i, -i)[rev]) for i in range(n))):
d = ''.join(filter(None, diag))
yield from (d, d[::-1])
if not rev:
yield from diags(grid, rev=True)
>>> list(diags(grid))
['H',
'H',
'XX',
'XX',
'XOX',
'XOX',
'WXXX',
'XXXW',
'XXRXX',
'XXRXX',
'XOXXX',
'XXXOX',
'XXXSX',
'XSXXX',
'XXCXX',
'XXCXX',
'XXXXE',
'EXXXX',
'DOGXX',
'XXGOD',
'XXXX',
'XXXX',
'XXX',
'XXX',
'TE',
'ET',
'X',
'X',
'HORSE',
'ESROH',
'XXXXX',
'XXXXX',
'XXXXX',
'XXXXX',
'WOCXX',
'XXCOW',
'XXXXE',
'EXXXX',
'XXGXX',
'XXGXX',
'XXXT',
'TXXX',
'XOX',
'XOX',
'XX',
'XX',
'D',
'D',
'X',
'X',
'XX',
'XX',
'XXX',
'XXX',
'XXXX',
'XXXX']