<<EnableMathJax(doller)>> = rotate = == 問題 == rotate.zip == 問題(和訳) == == メモ == == 解法 == rotate.pyは * 2byteごとにsigned charとしてunpackして(x, y)とする。 * (第二引数)度だけ座標を回転する。 * 回転後の(x', y')をfloatとしてpackして出力する。 元のファイルがJPEGなのでFF D8で始まっているはずである。 よって最初の回転後の座標のペアになるような回転角を探索し,以降の座標を逆回転して元の値を計算する。 {{{#!highlight python import sys import math import struct p = lambda x: struct.pack('b', int(round(x))) u = lambda x: struct.unpack('f', x)[0] pf = lambda x: struct.pack('f', x) if len(sys.argv) != 2: sys.exit(1) filename = sys.argv[1] bs = open(filename, 'rb').read() x,y = struct.unpack('bb', "\xff\xd8") for i in range(360): key = math.radians(i) if bs[0:8] == pf(x * math.cos(key) - y * math.sin(key)) + pf(x * math.sin(key) + y * math.cos(key)): key = -key break dec = open(filename + '.dec', 'wb') for i in range(0, len(bs), 8): x, y = u(bs[i:i+4]), u(bs[i+4:i+8]) # print [(x * math.cos(key) - y * math.sin(key)) , (x * math.sin(key) + y * math.cos(key))] dec.write(p(x * math.cos(key) - y * math.sin(key)) + p(x * math.sin(key) + y * math.cos(key))) }}}