Pisto-Uni Codes Source Code
The different files listed here are associated with this page.
main.cpp
/* uCodeBase3 - Shows the potential of universal codes using 89 trits Copyright (C) 2009 Pier-Luc St-Onge <pl_so@hotmail.com> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "UniCode3.h" int main(void) { PureInt3().exec(); FixedInt3().exec(); PureFibo3().exec(); FiboElias3().exec(); PureLeven3().exec(); char pause; scanf_s("%c", &pause); return 0; }
UniCode3.h
/* uCodeBase3 - Shows the potential of universal codes using 89 trits Copyright (C) 2009 Pier-Luc St-Onge <pl_so@hotmail.com> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #ifndef UNICODE3_H #define UNICODE3_H #include <math.h> #include <stdio.h> #include <string> using namespace std; class UniCode3 { public: void exec() const; static double decodeInt3(const string &code); static string encodeInt3(double val, size_t nb = 0); static string encodeInt3(long long val, size_t nb = 0); static size_t nbTrits(const string &code); protected: virtual string decode(const string &code) const = 0; virtual string encode(const string &int3) const = 0; virtual string f(size_t nb, bool plusOne = false) const; virtual size_t maxNbIter() const = 0; virtual string title() const = 0; }; class PureInt3: public UniCode3 { protected: string decode(const string &code) const; string encode(const string &int3) const; size_t maxNbIter() const { return 89; } string title() const { return "PureInt3"; } }; class FixedInt3: public UniCode3 { protected: string decode(const string &code) const; string encode(const string &int3) const; size_t maxNbIter() const { return 84; } string title() const { return "FixedInt3Length"; } }; class PureFibo3: public UniCode3 { public: static double decodeFibo3(const string &fibo3); static string encodeFibo3(long long val); protected: string decode(const string &code) const; string encode(const string &int3) const; string f(size_t nb, bool plusOne = false) const; size_t maxNbIter() const { return 87; } string title() const { return "SignedFibo3"; } }; class FiboElias3: public UniCode3 { protected: string decode(const string &code) const; string encode(const string &int3) const; size_t maxNbIter() const { return 82; } string title() const { return "FiboElias3"; } }; class PureLeven3: public UniCode3 { protected: string decode(const string &code) const; string encode(const string &int3) const; size_t maxNbIter() const { return 80; } string title() const { return "SignedLeven3"; } }; #endif // UNICODE3_H
UniCode3.cpp
/* uCodeBase3 - Shows the potential of universal codes using 89 trits Copyright (C) 2009 Pier-Luc St-Onge <pl_so@hotmail.com> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "UniCode3.h" #define SHOWCODE code.c_str(), decodeInt3(decode(code)), nbTrits(code) void UniCode3::exec() const { printf("%s\nFunction\tCode\tValue\tNb trits\n", title().c_str()); size_t nbMax = maxNbIter(); string code = encode(f(0)); printf("f(%d)\t%s\t%g\t%d\n", 0, SHOWCODE); for (size_t nb = 1; nb <= nbMax; nb++) { code = encode(f(nb)); printf("f(%d)\t%s\t%g\t%d\n", nb, SHOWCODE); code = encode(f(nb, true)); printf("f(%d)+1\t%s\t%g\t%d\n", nb, SHOWCODE); } } double UniCode3::decodeInt3(const string &code) { double tritVal = 1, val = 0; for (size_t trit = 0; trit < code.size(); trit++) { if (code[trit] == 'N') val -= tritVal; if (code[trit] == 'P') val += tritVal; tritVal *= 3; } return val; } string UniCode3::encodeInt3(double val, size_t nb) { const string n = (val > 0 ? "N" : "P"), p = (val > 0 ? "P" : "N"), z = "O"; double abso = 2 * (val < 0 ? -val : val), tritVal = 1; string code; while (3 * tritVal < abso) tritVal *= 3; while (tritVal > 0.5) { if (abso > tritVal) { code.insert(0, p); abso -= 2 * tritVal; } else if (abso < -tritVal) { code.insert(0, n); abso += 2 * tritVal; } else { code.insert(0, z); } tritVal /= 3; } if (nb > code.size()) code.append(string(nb - code.size(), 'O')); return code; } string UniCode3::encodeInt3(long long val, size_t nb) { const string n = (val > 0 ? "N" : "P"), p = (val > 0 ? "P" : "N"), z = "O"; long long abso = 2 * (val < 0 ? -val : val), tritVal = 1; string code; while (3 * tritVal < abso) tritVal *= 3; while (tritVal > 0) { if (abso > tritVal) { code.insert(0, p); abso -= 2 * tritVal; } else if (abso < -tritVal) { code.insert(0, n); abso += 2 * tritVal; } else { code.insert(0, z); } tritVal /= 3; } if (nb > code.size()) code.append(string(nb - code.size(), 'O')); return code; } string UniCode3::f(size_t nb, bool plusOne) const { if (nb == 0) return "O"; return string(nb, plusOne ? 'N' : 'P') + (plusOne ? "P" : ""); } size_t UniCode3::nbTrits(const string &code) { size_t nb = 0; for (size_t ind = 0; ind < code.size(); ind++) { char trit = code[ind]; if (trit == 'N' || trit == 'O' || trit == 'P') nb++; } return nb; }
PureInt3.cpp - PureInt3
/* uCodeBase3 - Shows the potential of universal codes using 89 trits Copyright (C) 2009 Pier-Luc St-Onge <pl_so@hotmail.com> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "UniCode3.h" string PureInt3::decode(const string &code) const { return code; } string PureInt3::encode(const string &int3) const { return int3; }
FixedInt3.cpp - FixedInt3Length
/* uCodeBase3 - Shows the potential of universal codes using 89 trits Copyright (C) 2009 Pier-Luc St-Onge <pl_so@hotmail.com> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "UniCode3.h" string FixedInt3::decode(const string &code) const { if (code.size() < 6) { return "NaN"; } size_t length = (size_t)decodeInt3(code.substr(0, 5)); if (code.size() != 6 + length) { return "NaN"; } if (length == 0) { return "O"; } return code.substr(6); } string FixedInt3::encode(const string &int3) const { return encodeInt3((long long)int3.size(), 5) + " " + int3; }
PureFibo3.cpp - SignedFibo3
/* uCodeBase3 - Shows the potential of universal codes using 89 trits Copyright (C) 2009 Pier-Luc St-Onge <pl_so@hotmail.com> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "UniCode3.h" string PureFibo3::decode(const string &code) const { if (code == "O") return code; return encodeInt3(decodeFibo3(code.substr(2))); } string PureFibo3::encode(const string &int3) const { return int3; } string PureFibo3::f(size_t nb, bool plusOne) const { if (nb == 0) return "O"; string code("P "); if (plusOne) { for (size_t trit = 0; trit < nb; trit++) { code.append(1, 'N'); } } else { for (size_t trit = 0; trit < nb; trit++) { code.append(1, (nb - trit) & 1 ? 'P' : 'O'); } } code.append(plusOne ? 2 : 1, 'P'); return code; } double PureFibo3::decodeFibo3(const string &fibo3) { if (fibo3.size() < 2) return -1; bool prevIsPlus = false, valid = false; double prev = 0.5, cur = 1, eval = 0; for (int ind = 0; ind < (int)fibo3.size(); ind++) { if (fibo3[ind] == 'P') { if (prevIsPlus) { valid = true; break; } prevIsPlus = true; eval += cur; } else { prevIsPlus = false; if (fibo3[ind] == 'N') eval -= cur; } double next = 2 * (prev + cur); prev = cur; cur = next; } if (!valid) eval = -1; return eval; } string PureFibo3::encodeFibo3(long long val) { if (val <= 0) return "NaFibo3"; if (val == 1) return "PP"; long long sumPrev = 1, prev = 1, cur = 3; while (val >= cur + 2 * prev - sumPrev) { long long next = 2 * (prev + cur); prev = cur; cur = next; sumPrev += prev; } string y = "P"; while (cur > 0) { if (-val > sumPrev) { y = "N" + y; val += cur; } else if (val < cur - sumPrev) { y = "O" + y; } else { y = "P" + y; val -= cur; } long long pre_prev = (cur - 2 * prev) / 2; sumPrev -= prev; cur = prev; prev = pre_prev; } return y; }
FiboElias3.cpp - FiboElias3
/* uCodeBase3 - Shows the potential of universal codes using 89 trits Copyright (C) 2009 Pier-Luc St-Onge <pl_so@hotmail.com> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "UniCode3.h" string FiboElias3::decode(const string &code) const { size_t length = (size_t)PureFibo3::decodeFibo3(code); return code.substr(code.size() - length); } string FiboElias3::encode(const string &int3) const { return PureFibo3::encodeFibo3(int3.size()) + " " + int3; }
PureLeven3.cpp - SignedLeven3
/* uCodeBase3 - Shows the potential of universal codes using 89 trits Copyright (C) 2009 Pier-Luc St-Onge <pl_so@hotmail.com> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "UniCode3.h" string PureLeven3::decode(const string &code) const { size_t h = 0; while (h < code.size() && code[h] != 'O') h++; if (h == code.size()) return "NaN"; char mst = 'O'; string int3 = string(1, mst); size_t nextT = h + 1; while (h > 0) { if (mst == 'N') int3.append("P"); double toReadF = decodeInt3(int3); size_t toRead = (size_t)(toReadF <= 90 ? toReadF : 90); if (nextT + toRead > code.size()) return "NaN"; mst = code[--h]; int3 = code.substr(nextT, toRead) + string(1, mst); nextT += toRead + 1; } return int3; } string PureLeven3::encode(const string &int3) const { if (int3.empty()) { return "NaN"; } string header, tmp3(int3), body; size_t last = tmp3.size() - 1; if (last > 0 && tmp3[last] == 'O') { return "NaN"; } while (tmp3[last] != 'O') { header.append(1, tmp3[last]); body = (last > 0 ? " " : "") + tmp3.substr(0, last) + body; tmp3 = encodeInt3((long long)last); last = tmp3.size() - 1; if (last > 0 && tmp3[last] == 'P' && tmp3[last - 1] == 'N') { tmp3.erase(last--); } } return header + tmp3 + body; }