問題1.6

世界で闘うプログラミング力を鍛える150問

あー。マトリクスとか、面倒すぎる。
この辺、普段から頭使ってないと、咄嗟に出来ないなー。
Numpy使っちゃいたくなるよね。。。

問題

NxNの行列に書かれた、1つのピクセルが4バイト四方の画像があります。その画像を90度か移転させるメソッドを書いてください。あなたはこれを追加の領域なしでできますか?

#encoding: utf-8


def rotate_matrix_90_degrees(matrix):
    '''
    引数で受け取ったNxNの行列を90度回転する
    >>> rotate_matrix_90_degrees([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
    [[6, 3, 0], [7, 4, 1], [8, 5, 2]]
    '''
    # 引数で受け取った2次元配列のサイズ取得
    matrix_size = len(matrix)
    matrix_last = matrix_size - 1

    # 行列を90度回転
    layer = 0
    while layer < (matrix_size / 2):
        first_pos = layer
        last_pos = matrix_last - layer
        for counter in range(first_pos, last_pos):
            offset = counter - first_pos
            # 上端の一時保存
            tmp_top = matrix[first_pos][counter]
            # 左端を上端に移動
            matrix[first_pos][counter] = matrix[last_pos - offset][first_pos]
            # 下端を左端に移動
            matrix[last_pos - offset][first_pos]    \
                = matrix[last_pos][last_pos - offset]
            # 右端を下端に移動
            matrix[last_pos][last_pos - offset] = matrix[counter][last_pos]
            # 上端の一時保存を左端に移動
            matrix[counter][last_pos] = tmp_top

            counter = counter + 1
        layer = layer + 1

    return matrix


def _test():
    import doctest
    doctest.testmod()


if __name__ == '__main__':
    _test()