#include <iostream>
#include <cmath>
using namespace std;
int original(int turn) {
if (turn != 0) {
if (turn > 0) {
turn /= 45;
if (turn < 4) turn = 4;
if (turn > 8) turn = 8;
} else {
turn /= 45;
if (turn > -4) turn = -4;
if (turn < -8) turn = -8;
}
}
return turn;
}
int optimized(int turn) {
int s=turn>>31,a=turn+s^s,m=a-180>>31,n=a-360>>31,b=262144&m|a*1457&~m&n|524288&~n;
turn=(b>>16)+s^s;
return turn;
}
int main() {
int errors = 0;
for (int i = -720; i < 720; ++i) if (i != 0) {
int t1 = original(i);
int t2 = optimized(i);
if (t1 != t2) {
std::cout << "at " << i << " expected " << t1 << " got " << t2 << std::endl;
++errors;
}
}
std::cout << "errors: " << errors << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgb3JpZ2luYWwoaW50IHR1cm4pIHsKICAgIGlmICh0dXJuICE9IDApIHsKICAgICAgICBpZiAodHVybiA+IDApIHsKICAgICAgICAgICAgdHVybiAvPSA0NTsKICAgICAgICAgICAgaWYgKHR1cm4gPCA0KSB0dXJuID0gNDsKICAgICAgICAgICAgaWYgKHR1cm4gPiA4KSB0dXJuID0gODsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0dXJuIC89IDQ1OwogICAgICAgICAgICBpZiAodHVybiA+IC00KSB0dXJuID0gLTQ7CiAgICAgICAgICAgIGlmICh0dXJuIDwgLTgpIHR1cm4gPSAtODsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdHVybjsKfQoKCmludCBvcHRpbWl6ZWQoaW50IHR1cm4pIHsKICAgIGludCBzPXR1cm4+PjMxLGE9dHVybitzXnMsbT1hLTE4MD4+MzEsbj1hLTM2MD4+MzEsYj0yNjIxNDQmbXxhKjE0NTcmfm0mbnw1MjQyODgmfm47CiAgICB0dXJuPShiPj4xNikrc15zOwogICAgcmV0dXJuIHR1cm47Cn0KCgppbnQgbWFpbigpIHsKICAgIGludCBlcnJvcnMgPSAwOwogICAgZm9yIChpbnQgaSA9IC03MjA7IGkgPCA3MjA7ICsraSkgaWYgKGkgIT0gMCkgewogICAgICAgIGludCB0MSA9IG9yaWdpbmFsKGkpOwogICAgICAgIGludCB0MiA9IG9wdGltaXplZChpKTsKICAgICAgICBpZiAodDEgIT0gdDIpIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJhdCAiIDw8IGkgPDwgICIgZXhwZWN0ZWQgIiA8PCB0MSA8PCAiIGdvdCAiIDw8IHQyIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgKytlcnJvcnM7CiAgICAgICAgfQogICAgfQogICAgc3RkOjpjb3V0IDw8ICJlcnJvcnM6ICIgPDwgZXJyb3JzIDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiAwOwp9