<<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)))
}}}