#include <iostream>
#include <iomanip>
#include <bitset>
template <typename TCont>
bool valid_index(uint8_t v1, uint8_t v2, TCont& slots) {
uint8_t index = static_cast<uint8_t>(v1 + v2) >> 4;
if (index == 0) { // Index 0 is invalid
return false;
}
if (slots[index] == 0) { // An empty slot is valid
slots[index] = v1;
return true;
}
// A collision is valid only if they share the lowest index
return (slots[index] == v1);
}
int main()
{
unsigned long long count = 0;
unsigned long long valid_count = 0;
// For every sorted combination of 5 indexes
const uint8_t step = 0b0000'0010;
for (uint8_t i1 = 0b0001'0000; i1; i1 += step)
for (uint8_t i2 = 0b0001'0000 + (i1 & 0xF0); i2; i2 += step)
for (uint8_t i3 = 0b0001'0000 + (i2 & 0xF0); i3; i3 += step)
for (uint8_t i4 = 0b0001'0000 + (i3 & 0xF0); i4; i4 += step)
for (uint8_t i5 = 0b0001'0000 + (i4 & 0xF0); i5; i5 += step) {
++count;
uint8_t slots[16] = {};
if (valid_index(i1, 0, slots) &&
valid_index(i2, 0, slots) &&
valid_index(i3, 0, slots) &&
valid_index(i4, 0, slots) &&
valid_index(i5, 0, slots) &&
valid_index(i1, i2, slots) &&
valid_index(i1, i3, slots) &&
valid_index(i1, i4, slots) &&
valid_index(i1, i5, slots) &&
valid_index(i2, i3, slots) &&
valid_index(i2, i4, slots) &&
valid_index(i2, i5, slots) &&
valid_index(i3, i4, slots) &&
valid_index(i3, i5, slots) &&
valid_index(i4, i5, slots) &&
valid_index(i1, i2 + i3, slots) &&
valid_index(i1, i2 + i4, slots) &&
valid_index(i1, i2 + i5, slots) &&
valid_index(i1, i3 + i4, slots) &&
valid_index(i3, i3 + i5, slots) &&
valid_index(i1, i4 + i5, slots) &&
valid_index(i2, i3 + i4, slots) &&
valid_index(i2, i3 + i5, slots) &&
valid_index(i2, i4 + i5, slots) &&
valid_index(i3, i4 + 15, slots) &&
valid_index(i1, i2 + i3 + i4, slots) &&
valid_index(i1, i2 + i3 + i5, slots) &&
valid_index(i1, i2 + i4 + i5, slots) &&
valid_index(i1, i3 + i4 + i5, slots) &&
valid_index(i2, i3 + i4 + i5, slots) &&
valid_index(i1, i2 + i3 + i4 + i5, slots))
{
++valid_count;
std::cout << "Valid combination: ";
std::cout << std::setw(10) << (i1 / 16.0);
std::cout << std::setw(10) << (i2 / 16.0);
std::cout << std::setw(10) << (i3 / 16.0);
std::cout << std::setw(10) << (i4 / 16.0);
std::cout << std::setw(10) << (i5 / 16.0) << "\n";
auto magic = 60ull << 56;
magic |= static_cast<uint64_t>(i1) << (60 - 53 - 4); // F7
magic |= static_cast<uint64_t>(i2) << (60 - 44 - 4); // E6
magic |= static_cast<uint64_t>(i3) << (60 - 35 - 4); // D5
magic |= static_cast<uint64_t>(i4) << (60 - 26 - 4); // C4
magic |= static_cast<uint64_t>(i5) << (60 - 17 - 4); // B3
std::cout << "Magic: " << std::hex << magic << std::dec;
std::cout << " " << std::bitset<64>(magic) << "\n\n";
}
}
std::cout << valid_count << "/" << count << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGJpdHNldD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUQ29udD4KYm9vbCB2YWxpZF9pbmRleCh1aW50OF90IHYxLCB1aW50OF90IHYyLCBUQ29udCYgc2xvdHMpIHsKICAgIHVpbnQ4X3QgaW5kZXggPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2MSArIHYyKSA+PiA0OwogICAgaWYgKGluZGV4ID09IDApIHsgLy8gSW5kZXggMCBpcyBpbnZhbGlkCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHNsb3RzW2luZGV4XSA9PSAwKSB7IC8vIEFuIGVtcHR5IHNsb3QgaXMgdmFsaWQKICAgICAgICBzbG90c1tpbmRleF0gPSB2MTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8vIEEgY29sbGlzaW9uIGlzIHZhbGlkIG9ubHkgaWYgdGhleSBzaGFyZSB0aGUgbG93ZXN0IGluZGV4CiAgICByZXR1cm4gKHNsb3RzW2luZGV4XSA9PSB2MSk7ICAgIAp9CgppbnQgbWFpbigpCnsKICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBjb3VudCA9IDA7CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgdmFsaWRfY291bnQgPSAwOwoKICAgIC8vIEZvciBldmVyeSBzb3J0ZWQgY29tYmluYXRpb24gb2YgNSBpbmRleGVzCiAgICBjb25zdCB1aW50OF90IHN0ZXAgPSAwYjAwMDAnMDAxMDsKICAgIGZvciAodWludDhfdCBpMSA9IDBiMDAwMScwMDAwOyBpMTsgaTEgKz0gc3RlcCkKICAgIGZvciAodWludDhfdCBpMiA9IDBiMDAwMScwMDAwICsgKGkxICYgMHhGMCk7IGkyOyBpMiArPSBzdGVwKQogICAgZm9yICh1aW50OF90IGkzID0gMGIwMDAxJzAwMDAgKyAoaTIgJiAweEYwKTsgaTM7IGkzICs9IHN0ZXApCiAgICBmb3IgKHVpbnQ4X3QgaTQgPSAwYjAwMDEnMDAwMCArIChpMyAmIDB4RjApOyBpNDsgaTQgKz0gc3RlcCkKICAgIGZvciAodWludDhfdCBpNSA9IDBiMDAwMScwMDAwICsgKGk0ICYgMHhGMCk7IGk1OyBpNSArPSBzdGVwKSB7CiAgICAgICAgKytjb3VudDsKICAgICAgICAKICAgICAgICB1aW50OF90IHNsb3RzWzE2XSA9IHt9OwogICAgICAgIGlmICh2YWxpZF9pbmRleChpMSwgMCwgc2xvdHMpICYmCiAgICAgICAgICAgIHZhbGlkX2luZGV4KGkyLCAwLCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTMsIDAsIHNsb3RzKSAmJgogICAgICAgICAgICB2YWxpZF9pbmRleChpNCwgMCwgc2xvdHMpICYmCiAgICAgICAgICAgIHZhbGlkX2luZGV4KGk1LCAwLCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTEsIGkyLCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTEsIGkzLCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTEsIGk0LCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTEsIGk1LCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTIsIGkzLCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTIsIGk0LCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTIsIGk1LCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTMsIGk0LCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTMsIGk1LCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTQsIGk1LCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTEsIGkyICsgaTMsIHNsb3RzKSAmJgogICAgICAgICAgICB2YWxpZF9pbmRleChpMSwgaTIgKyBpNCwgc2xvdHMpICYmCiAgICAgICAgICAgIHZhbGlkX2luZGV4KGkxLCBpMiArIGk1LCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTEsIGkzICsgaTQsIHNsb3RzKSAmJgogICAgICAgICAgICB2YWxpZF9pbmRleChpMywgaTMgKyBpNSwgc2xvdHMpICYmCiAgICAgICAgICAgIHZhbGlkX2luZGV4KGkxLCBpNCArIGk1LCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTIsIGkzICsgaTQsIHNsb3RzKSAmJgogICAgICAgICAgICB2YWxpZF9pbmRleChpMiwgaTMgKyBpNSwgc2xvdHMpICYmCiAgICAgICAgICAgIHZhbGlkX2luZGV4KGkyLCBpNCArIGk1LCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTMsIGk0ICsgMTUsIHNsb3RzKSAmJgogICAgICAgICAgICB2YWxpZF9pbmRleChpMSwgaTIgKyBpMyArIGk0LCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTEsIGkyICsgaTMgKyBpNSwgc2xvdHMpICYmCiAgICAgICAgICAgIHZhbGlkX2luZGV4KGkxLCBpMiArIGk0ICsgaTUsIHNsb3RzKSAmJgogICAgICAgICAgICB2YWxpZF9pbmRleChpMSwgaTMgKyBpNCArIGk1LCBzbG90cykgJiYKICAgICAgICAgICAgdmFsaWRfaW5kZXgoaTIsIGkzICsgaTQgKyBpNSwgc2xvdHMpICYmCiAgICAgICAgICAgIHZhbGlkX2luZGV4KGkxLCBpMiArIGkzICsgaTQgKyBpNSwgc2xvdHMpKQogICAgICAgIHsKICAgICAgICAgICAgKyt2YWxpZF9jb3VudDsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJWYWxpZCBjb21iaW5hdGlvbjogIjsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6c2V0dygxMCkgPDwgKGkxIC8gMTYuMCk7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoMTApIDw8IChpMiAvIDE2LjApOwogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjpzZXR3KDEwKSA8PCAoaTMgLyAxNi4wKTsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6c2V0dygxMCkgPDwgKGk0IC8gMTYuMCk7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoMTApIDw8IChpNSAvIDE2LjApIDw8ICJcbiI7CgogICAgICAgICAgICBhdXRvIG1hZ2ljID0gNjB1bGwgPDwgNTY7CiAgICAgICAgICAgIG1hZ2ljIHw9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihpMSkgPDwgKDYwIC0gNTMgLSA0KTsgLy8gRjcKICAgICAgICAgICAgbWFnaWMgfD0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGkyKSA8PCAoNjAgLSA0NCAtIDQpOyAvLyBFNgogICAgICAgICAgICBtYWdpYyB8PSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oaTMpIDw8ICg2MCAtIDM1IC0gNCk7IC8vIEQ1CiAgICAgICAgICAgIG1hZ2ljIHw9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihpNCkgPDwgKDYwIC0gMjYgLSA0KTsgLy8gQzQKICAgICAgICAgICAgbWFnaWMgfD0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGk1KSA8PCAoNjAgLSAxNyAtIDQpOyAvLyBCMwogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIk1hZ2ljOiAiIDw8IHN0ZDo6aGV4IDw8IG1hZ2ljIDw8IHN0ZDo6ZGVjOwogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIiAgIiA8PCBzdGQ6OmJpdHNldDw2ND4obWFnaWMpIDw8ICJcblxuIjsKICAgICAgICB9CiAgICB9CgogICAgc3RkOjpjb3V0IDw8IHZhbGlkX2NvdW50IDw8ICIvIiA8PCBjb3VudCA8PCBzdGQ6OmVuZGw7Cn0KCg==