#include <array>
#include <iostream>
#include <iomanip>
#include <map>
#include <string>
std::string to_bar_code(unsigned int zip_code)
{
const std::array<std::string, 10> digit {{
"11000", "00011", "00101", "00110", "01001",
"01010", "01100", "10001", "10010", "10100"
}};
return "1"
+ digit[(zip_code / 10000) % 10]
+ digit[(zip_code / 1000) % 10]
+ digit[(zip_code / 100) % 10]
+ digit[(zip_code / 10) % 10]
+ digit[zip_code % 10]
+ "1";
}
int to_zip_code(const std::string& bar_code)
{
const std::map<std::string, int> digits = {
{"11000", 0}, // special case
{"00011", 1},
{"00101", 2},
{"00110", 3},
{"01001", 4},
{"01010", 5},
{"01100", 6},
{"10001", 7},
{"10010", 8},
{"10100", 9}
};
const std::string bar_digits[5]{ {bar_code, 1, 5}, {bar_code, 6, 5}, {bar_code, 11, 5}, {bar_code, 16, 5}, {bar_code, 21, 5} };
unsigned int res = 0;
for (const auto& d : bar_digits)
{
res *= 10;
res += digits.at(d);
}
return res;
}
int main()
{
std::cout << "Digits" << " " << "Bar Code" << std::endl;
for (const auto zip : {99504, 12345, 67890}) {
std::cout << zip << std::setw(35) << to_bar_code(zip) << std::endl;
}
std::cout << "Digits" << " " << "Bar Code" << std::endl;
for (const auto bar : {"110100101000101011000010011", "100101010011100001100110001", "110100001011100001100010011", "100011000110101000011100101"}) {
std::cout << to_zip_code(bar) << std::setw(35) << bar << std::endl;
}
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RyaW5nPgoKc3RkOjpzdHJpbmcgdG9fYmFyX2NvZGUodW5zaWduZWQgaW50IHppcF9jb2RlKQp7CiAgICBjb25zdCBzdGQ6OmFycmF5PHN0ZDo6c3RyaW5nLCAxMD4gZGlnaXQge3sKICAgICAgICAiMTEwMDAiLCAiMDAwMTEiLCAiMDAxMDEiLCAiMDAxMTAiLCAiMDEwMDEiLAogICAgICAgICIwMTAxMCIsICIwMTEwMCIsICIxMDAwMSIsICIxMDAxMCIsICIxMDEwMCIKICAgIH19OwogICAgcmV0dXJuICIxIgogICAgICAgICsgZGlnaXRbKHppcF9jb2RlIC8gMTAwMDApICUgMTBdCiAgICAgICAgKyBkaWdpdFsoemlwX2NvZGUgLyAxMDAwKSAlIDEwXQogICAgICAgICsgZGlnaXRbKHppcF9jb2RlIC8gMTAwKSAlIDEwXQogICAgICAgICsgZGlnaXRbKHppcF9jb2RlIC8gMTApICUgMTBdCiAgICAgICAgKyBkaWdpdFt6aXBfY29kZSAlIDEwXQogICAgICAgICsgIjEiOwp9CgppbnQgdG9femlwX2NvZGUoY29uc3Qgc3RkOjpzdHJpbmcmIGJhcl9jb2RlKQp7CiAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkaWdpdHMgPSB7CiAgICAgICAgeyIxMTAwMCIsIDB9LCAvLyBzcGVjaWFsIGNhc2UKICAgICAgICB7IjAwMDExIiwgMX0sCiAgICAgICAgeyIwMDEwMSIsIDJ9LAogICAgICAgIHsiMDAxMTAiLCAzfSwKICAgICAgICB7IjAxMDAxIiwgNH0sCiAgICAgICAgeyIwMTAxMCIsIDV9LAogICAgICAgIHsiMDExMDAiLCA2fSwKICAgICAgICB7IjEwMDAxIiwgN30sCiAgICAgICAgeyIxMDAxMCIsIDh9LAogICAgICAgIHsiMTAxMDAiLCA5fQogICAgfTsKICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGJhcl9kaWdpdHNbNV17IHtiYXJfY29kZSwgMSwgNX0sIHtiYXJfY29kZSwgNiwgNX0sIHtiYXJfY29kZSwgMTEsIDV9LCB7YmFyX2NvZGUsIDE2LCA1fSwge2Jhcl9jb2RlLCAyMSwgNX0gfTsKICAgIHVuc2lnbmVkIGludCByZXMgPSAwOwogICAgZm9yIChjb25zdCBhdXRvJiBkIDogYmFyX2RpZ2l0cykKICAgIHsKICAgICAgICByZXMgKj0gMTA7CiAgICAgICAgcmVzICs9IGRpZ2l0cy5hdChkKTsKICAgIH0KICAgIHJldHVybiByZXM7Cn0KCgppbnQgbWFpbigpCnsKICAgIHN0ZDo6Y291dCA8PCAiRGlnaXRzIiA8PCAiICAgICAgICIgPDwgIkJhciBDb2RlIiA8PCBzdGQ6OmVuZGw7CiAgICBmb3IgKGNvbnN0IGF1dG8gemlwIDogezk5NTA0LCAxMjM0NSwgNjc4OTB9KSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHppcCA8PCBzdGQ6OnNldHcoMzUpIDw8IHRvX2Jhcl9jb2RlKHppcCkgPDwgc3RkOjplbmRsOwogICAgfQogICAgc3RkOjpjb3V0IDw8ICJEaWdpdHMiIDw8ICIgICAgICAgIiA8PCAiQmFyIENvZGUiIDw8IHN0ZDo6ZW5kbDsKICAgIGZvciAoY29uc3QgYXV0byBiYXIgOiB7IjExMDEwMDEwMTAwMDEwMTAxMTAwMDAxMDAxMSIsICIxMDAxMDEwMTAwMTExMDAwMDExMDAxMTAwMDEiLCAiMTEwMTAwMDAxMDExMTAwMDAxMTAwMDEwMDExIiwgIjEwMDAxMTAwMDExMDEwMTAwMDAxMTEwMDEwMSJ9KSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHRvX3ppcF9jb2RlKGJhcikgPDwgc3RkOjpzZXR3KDM1KSA8PCBiYXIgPDwgc3RkOjplbmRsOwogICAgfSAgICAKfQo=