#include <utility>
#include <iostream>
#include <string>
template <typename T>
struct to_string;
template <char... cs>
struct to_string<std::integer_sequence<char,cs...>>{
std::string operator()() {
return {cs...};
}
};
template <typename A, typename B>
struct seq_cat;
template <char... A, char... B>
struct seq_cat<std::integer_sequence<char,A...>,
std::integer_sequence<char,B...>>
{
using result_t = std::integer_sequence<char, A..., B...>;
};
constexpr char binary_to_char(char b7, char b6, char b5, char b4, char b3,
char b2, char b1, char b0) {
return (b7-'0') << 7 | (b6-'0') << 6
| (b5-'0') << 5 | (b4-'0') << 4
| (b3-'0') << 3 | (b2-'0') << 2
| (b1-'0') << 1 | (b0-'0') << 0;
}
template <char... cs>
struct binary_to_ascii;
template <char b7, char b6, char b5, char b4, char b3, char b2, char b1, char b0>
struct binary_to_ascii<b7,b6,b5,b4,b3,b2,b1,b0> {
using result_t = std::integer_sequence
< char,
binary_to_char(b7,b6,b5,b4,b3,b2,b1,b0) >;
};
template<char b7, char b6, char b5, char b4, char b3, char b2, char b1, char b0,
char... rest>
struct binary_to_ascii<b7,b6,b5,b4,b3,b2,b1,b0,rest...> {
using result_t = typename seq_cat
< std::integer_sequence< char, binary_to_char(b7,b6,b5,b4,b3,b2,b1,b0) >,
typename binary_to_ascii<rest...>::result_t
>::result_t;
};
int main() {
std::cout << to_string<binary_to_ascii<
'0','1','1','0','0','0','0','1',
'0','1','1','1','1','0','0','1',
'0','1','1','1','1','0','0','1',
'0','0','1','0','0','0','0','0',
'0','1','1','0','1','1','0','0',
'0','1','1','0','1','1','0','1',
'0','1','1','0','0','0','0','1',
'0','1','1','0','1','1','1','1'
>::result_t>()() << "\n";
}
I2luY2x1ZGUgPHV0aWxpdHk+CgkjaW5jbHVkZSA8aW9zdHJlYW0+CgkjaW5jbHVkZSA8c3RyaW5nPgoKCXRlbXBsYXRlIDx0eXBlbmFtZSBUPiAgCglzdHJ1Y3QgdG9fc3RyaW5nOwoKCXRlbXBsYXRlIDxjaGFyLi4uIGNzPiAgCglzdHJ1Y3QgdG9fc3RyaW5nPHN0ZDo6aW50ZWdlcl9zZXF1ZW5jZTxjaGFyLGNzLi4uPj57CgkJc3RkOjpzdHJpbmcgb3BlcmF0b3IoKSgpIHsKCQkJcmV0dXJuIHtjcy4uLn07CgkJfQoJfTsKCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4gIAoJc3RydWN0IHNlcV9jYXQ7CgoJdGVtcGxhdGUgPGNoYXIuLi4gQSwgY2hhci4uLiBCPgoJc3RydWN0IHNlcV9jYXQ8c3RkOjppbnRlZ2VyX3NlcXVlbmNlPGNoYXIsQS4uLj4sCgkJCQlzdGQ6OmludGVnZXJfc2VxdWVuY2U8Y2hhcixCLi4uPj4KCXsKCQl1c2luZyByZXN1bHRfdCA9IHN0ZDo6aW50ZWdlcl9zZXF1ZW5jZTxjaGFyLCBBLi4uLCBCLi4uPjsKCX07CgkJCgljb25zdGV4cHIgY2hhciBiaW5hcnlfdG9fY2hhcihjaGFyIGI3LCBjaGFyIGI2LCBjaGFyIGI1LCBjaGFyIGI0LCBjaGFyIGIzLAoJCQkJCQkJCWNoYXIgYjIsIGNoYXIgYjEsIGNoYXIgYjApIHsKCQlyZXR1cm4gICAoYjctJzAnKSA8PCA3IHwgKGI2LScwJykgPDwgNgoJCQl8IChiNS0nMCcpIDw8IDUgfCAoYjQtJzAnKSA8PCA0CgkJCXwgKGIzLScwJykgPDwgMyB8IChiMi0nMCcpIDw8IDIKCQkJfCAoYjEtJzAnKSA8PCAxIHwgKGIwLScwJykgPDwgMDsKCX0KCgl0ZW1wbGF0ZSA8Y2hhci4uLiBjcz4KCXN0cnVjdCBiaW5hcnlfdG9fYXNjaWk7CgoJdGVtcGxhdGUgPGNoYXIgYjcsIGNoYXIgYjYsIGNoYXIgYjUsIGNoYXIgYjQsIGNoYXIgYjMsIGNoYXIgYjIsIGNoYXIgYjEsIGNoYXIgYjA+CglzdHJ1Y3QgYmluYXJ5X3RvX2FzY2lpPGI3LGI2LGI1LGI0LGIzLGIyLGIxLGIwPiB7CgkJdXNpbmcgcmVzdWx0X3QgPSBzdGQ6OmludGVnZXJfc2VxdWVuY2UKCQk8IGNoYXIsCgkJYmluYXJ5X3RvX2NoYXIoYjcsYjYsYjUsYjQsYjMsYjIsYjEsYjApID47Cgl9OwoKCXRlbXBsYXRlPGNoYXIgYjcsIGNoYXIgYjYsIGNoYXIgYjUsIGNoYXIgYjQsIGNoYXIgYjMsIGNoYXIgYjIsIGNoYXIgYjEsIGNoYXIgYjAsCgkJCWNoYXIuLi4gcmVzdD4KCXN0cnVjdCBiaW5hcnlfdG9fYXNjaWk8YjcsYjYsYjUsYjQsYjMsYjIsYjEsYjAscmVzdC4uLj4gewoJCXVzaW5nIHJlc3VsdF90ID0gdHlwZW5hbWUgc2VxX2NhdAoJCTwgc3RkOjppbnRlZ2VyX3NlcXVlbmNlPCBjaGFyLCBiaW5hcnlfdG9fY2hhcihiNyxiNixiNSxiNCxiMyxiMixiMSxiMCkgPiwKCQl0eXBlbmFtZSBiaW5hcnlfdG9fYXNjaWk8cmVzdC4uLj46OnJlc3VsdF90CgkJPjo6cmVzdWx0X3Q7Cgl9OwoKCWludCBtYWluKCkgewoJCXN0ZDo6Y291dCA8PCB0b19zdHJpbmc8YmluYXJ5X3RvX2FzY2lpPAoJCQknMCcsJzEnLCcxJywnMCcsJzAnLCcwJywnMCcsJzEnLAoJCQknMCcsJzEnLCcxJywnMScsJzEnLCcwJywnMCcsJzEnLAoJCQknMCcsJzEnLCcxJywnMScsJzEnLCcwJywnMCcsJzEnLAoJCQknMCcsJzAnLCcxJywnMCcsJzAnLCcwJywnMCcsJzAnLAoJCQknMCcsJzEnLCcxJywnMCcsJzEnLCcxJywnMCcsJzAnLAoJCQknMCcsJzEnLCcxJywnMCcsJzEnLCcxJywnMCcsJzEnLAoJCQknMCcsJzEnLCcxJywnMCcsJzAnLCcwJywnMCcsJzEnLAoJCQknMCcsJzEnLCcxJywnMCcsJzEnLCcxJywnMScsJzEnCgkJPjo6cmVzdWx0X3Q+KCkoKSA8PCAiXG4iOwoJfQ==