#include <ctime>
#include <iostream>
// peelは入力されたbitをまるでバナナの皮をむくように移動する。
// 0 bit目 -> 15 bit目
// 1 bit目 -> 0 bit目
// 2 bit目 -> 14 bit目
// 3 bit目 -> 1 bit目
// 4 bit目 -> 13 bit目
// 5 bit目 -> 2 bit目
// ...
// n = 奇数の時, n bit目 -> (n - 1) / 2 bit目
// n = 偶数の時, n bit目 -> 15 - (n / 2) bit目
// (例)
// a : 0000111100001111
// o : 1100110000110011
uint16_t peel(uint16_t a) {
// ここに実装
return a;
}
void assert_equal(uint16_t input, uint16_t expected) {
if (input != expected) {
std::cout << "input = " << std::hex << input << std::endl
<< "expected = " << std::hex << expected << std::endl
<< "failed" << std::endl;
exit(EXIT_FAILURE);
}
}
int main() {
// テスト
assert_equal(peel(0x0f0f), 0xcc33);
assert_equal(peel(0x5555), 0xff00);
assert_equal(peel(0xff00), 0x0ff0);
assert_equal(peel(0x0ff0), 0x3c3c);
assert_equal(peel(0x3c3c), 0x6666);
assert_equal(peel(0x6666), 0x5555);
assert_equal(peel(0x4567), 0xdd05);
assert_equal(peel(0x23c6), 0x5859);
assert_equal(peel(0x9869), 0x92a6);
assert_equal(peel(0x4873), 0xb125);
assert_equal(peel(0xdc51), 0xb7a0);
assert_equal(peel(0x5cff), 0xf72f);
// ベンチマーク
std::cout << "benchmark...";
uint32_t dammy = 0;
double start = clock();
for (int i = 0; i < 50000000; i++) {
dammy ^= peel(rand());
}
double end = clock();
std::cout << "end! elapsed:" << (end - start) / CLOCKS_PER_SEC << "s " << dammy << std::endl;
return 0;
}
I2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8aW9zdHJlYW0+CgovLyBwZWVs44Gv5YWl5Yqb44GV44KM44GfYml044KS44G+44KL44Gn44OQ44OK44OK44Gu55qu44KS44KA44GP44KI44GG44Gr56e75YuV44GZ44KL44CCCi8vIDAgYml055uuIC0+IDE1IGJpdOebrgovLyAxIGJpdOebriAtPiAgMCBiaXTnm64KLy8gMiBiaXTnm64gLT4gMTQgYml055uuCi8vIDMgYml055uuIC0+ICAxIGJpdOebrgovLyA0IGJpdOebriAtPiAxMyBiaXTnm64KLy8gNSBiaXTnm64gLT4gIDIgYml055uuCi8vIC4uLgovLyBuID0g5aWH5pWw44Gu5pmCLCBuIGJpdOebriAtPiAobiAtIDEpIC8gMiBiaXTnm64KLy8gbiA9IOWBtuaVsOOBruaZgiwgbiBiaXTnm64gLT4gMTUgLSAobiAvIDIpIGJpdOebrgovLyAo5L6LKQovLyBhIDogMDAwMDExMTEwMDAwMTExMQovLyBvIDogMTEwMDExMDAwMDExMDAxMQp1aW50MTZfdCBwZWVsKHVpbnQxNl90IGEpIHsKICAgIC8vIOOBk+OBk+OBq+Wun+ijhQogICAgcmV0dXJuIGE7Cn0KCnZvaWQgYXNzZXJ0X2VxdWFsKHVpbnQxNl90IGlucHV0LCB1aW50MTZfdCBleHBlY3RlZCkgewoJaWYgKGlucHV0ICE9IGV4cGVjdGVkKSB7CgkJc3RkOjpjb3V0IDw8ICJpbnB1dCA9ICIgPDwgc3RkOjpoZXggPDwgaW5wdXQgPDwgc3RkOjplbmRsIAoJCSAgICAgICAgICA8PCAiZXhwZWN0ZWQgPSAiIDw8IHN0ZDo6aGV4IDw8IGV4cGVjdGVkIDw8IHN0ZDo6ZW5kbAoJCSAgICAgICAgICA8PCAiZmFpbGVkIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwoJfQp9CgppbnQgbWFpbigpIHsKCS8vIOODhuOCueODiAogICAgYXNzZXJ0X2VxdWFsKHBlZWwoMHgwZjBmKSwgMHhjYzMzKTsKICAgIGFzc2VydF9lcXVhbChwZWVsKDB4NTU1NSksIDB4ZmYwMCk7CiAgICBhc3NlcnRfZXF1YWwocGVlbCgweGZmMDApLCAweDBmZjApOwogICAgYXNzZXJ0X2VxdWFsKHBlZWwoMHgwZmYwKSwgMHgzYzNjKTsKICAgIGFzc2VydF9lcXVhbChwZWVsKDB4M2MzYyksIDB4NjY2Nik7CiAgICBhc3NlcnRfZXF1YWwocGVlbCgweDY2NjYpLCAweDU1NTUpOwogICAgYXNzZXJ0X2VxdWFsKHBlZWwoMHg0NTY3KSwgMHhkZDA1KTsKICAgIGFzc2VydF9lcXVhbChwZWVsKDB4MjNjNiksIDB4NTg1OSk7CiAgICBhc3NlcnRfZXF1YWwocGVlbCgweDk4NjkpLCAweDkyYTYpOwogICAgYXNzZXJ0X2VxdWFsKHBlZWwoMHg0ODczKSwgMHhiMTI1KTsKICAgIGFzc2VydF9lcXVhbChwZWVsKDB4ZGM1MSksIDB4YjdhMCk7CiAgICBhc3NlcnRfZXF1YWwocGVlbCgweDVjZmYpLCAweGY3MmYpOwogICAgCiAgICAvLyDjg5njg7Pjg4Hjg57jg7zjgq8KICAgIHN0ZDo6Y291dCA8PCAiYmVuY2htYXJrLi4uIjsKICAgIHVpbnQzMl90IGRhbW15ID0gMDsKICAgIGRvdWJsZSBzdGFydCA9IGNsb2NrKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDAwMDAwOyBpKyspIHsgCiAgICAJZGFtbXkgXj0gcGVlbChyYW5kKCkpOwogICAgfQogICAgZG91YmxlIGVuZCA9IGNsb2NrKCk7CiAgICBzdGQ6OmNvdXQgPDwgImVuZCEgZWxhcHNlZDoiIDw8IChlbmQgLSBzdGFydCkgLyBDTE9DS1NfUEVSX1NFQyA8PCAicyAiIDw8IGRhbW15IDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiAwOwp9