#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;
}