Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
// compile:
// $ g++ -std=c++11 -o esm_doukaku_20151022 esm_doukaku_20151022.cpp
#include <iostream>
#include <sstream>
#include <string>
unsigned int char2bits(char c)
{
unsigned int bits[] = { 0x00u, 0x80u, 0xc0u, 0xe0u, 0xf0u, 0xf8u, 0xfcu, 0xfeu, 0xffu };
return bits[c - '0'];
}
unsigned int rotate_right(unsigned int n, int r)
{
return ((n << (8 - r)) & 0xffu) | ((n >> r) & 0xffu);
}
std::string solve(const std::string& input)
{
unsigned int waiting = 0;
unsigned int eating = 0;
unsigned int resting = 0;
auto i = std::begin(input);
auto end = std::end(input);
while(i != end)
{
resting = eating;
eating = waiting;
waiting = 0;
for(int r = 0; r < 8; ++r)
{
auto visitors = rotate_right(char2bits(*i), r);
if(((eating | resting) & visitors) == 0)
{
waiting = visitors;
++i;
break;
}
}
}
auto sitting = waiting | eating | resting;
std::ostringstream oss;
for(int i = 0; i < 8; ++i)
{
oss << ((sitting >> (7 - i)) & 1u);
}
return oss.str();
}
void test(const std::string& input, const std::string& expected)
{
auto actual = solve(input);
if(actual == expected)
{
std::cout << '.';
}
else
{
std::cout
<< "\nFAILURE\n"
<< "input: " << input
<< ", expected: " << expected
<< ", actual: " << actual
<< std::endl;
}
}
int main(int, char* [])
{
test("3316", "11111110");
test("3342153", "11111111");
test("8", "11111111");
test("232624", "11110110");
test("1", "10000000");
test("224673432", "11111000");
test("123464334", "11111110");
test("44372332", "11111111");
test("2344", "11111111");
test("6448476233", "11111100");
test("4345174644", "11111111");
test("77743", "11111110");
test("2136524281", "10000000");
test("344373", "11100000");
test("434226", "11111111");
test("7433223", "11111110");
test("2246534", "11110111");
test("634", "11111110");
test("2222", "11111100");
test("2442343238", "11111111");
test("7243344", "11111111");
test("26147234", "10111111");
test("34424", "10011111");
test("6334", "11011111");
test("3828342", "11011110");
test("4431", "11110000");
test("2843212125", "11111111");
test("333336482", "11000000");
test("374", "11110000");
test("4382333", "11100111");
std::cout << std::endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment