//--------------------------------------------------------------------------- #include #include #include #include #include #include typedef unsigned char UCHAR; using namespace std; //--------------------------------------------------------------------------- string sCode; // Факторизация числа vector fucktorize(int numm) { if (numm == 1) { vector v; v.push_back(1); return v; } int newnum = numm; vector newtext; int checker = 2; // First possible factor to check while (checker *checker <= newnum) if (newnum % checker == 0) { newtext.push_back(checker); newnum = newnum / checker; } else checker++; if (newnum != 1) newtext.push_back(newnum); return newtext; } // fuck funcktors... не переводится =) void fuckfucktors(const vector& fucktors, const int i, UCHAR op = 0) { if (op == 0) op = '+'; UCHAR notop = (op == '+') ? '-' : '+'; if (i != 0) sCode += "[>"; UCHAR tmpop; if (i != (int)fucktors.size() - 1) tmpop = '+'; else tmpop = op; for (int j = 1; j <= fucktors[i]; j++) sCode += tmpop; if (i + 1 < (int)fucktors.size()) fuckfucktors(fucktors, i + 1, op); if (i != 0) sCode += "<-] "; } int min_val(const string& s) { if (s == "") return -1; int m = (UCHAR)s[0]; for (size_t i = 1, max_i = s.size(); i < max_i; i++) if (m > (UCHAR)s[i]) m = (UCHAR)s[i]; return m; } int max_val(const string& s) { if (s == "") return -1; int m = (UCHAR)s[0]; for (size_t i = 1, max_i = s.size(); i < max_i; i++) if (m < (UCHAR)s[i]) m = (UCHAR)s[i]; return m; } // также переводится с трудом, но эта функция делает что-то прикольное .) string brainfuckit(const string &str) { string aStr, aStrPrinted; sCode = ""; if (str == "") return ""; for (size_t i = 0, max_i = str.length(); i < max_i; i++) aStr += str[i]; int iMinvalue = min_val(aStr); // *std::min_element(aStr.begin(), aStr.end()); vector fucktors = fucktorize(iMinvalue); int residuo = 0; if (fucktors.size() == 1) { fucktors = fucktorize(iMinvalue - 1); residuo = 1; } fuckfucktors(fucktors, 0); sCode += " "; for (size_t i = 0, max_i = fucktors.size() - 1; i < max_i; i++) sCode += ">"; for (int i = 0; i < residuo; i++) sCode += "+"; for (size_t i = 0, max_i = aStr.length(); i < max_i; i++) { if ((UCHAR)aStr[i] == iMinvalue) { sCode += ". "; continue; } if ((UCHAR)aStr[i] < iMinvalue) { int x = iMinvalue - (UCHAR)aStr[i]; vector ff = fucktorize(x); int res = 0; if ((ff.size() == 1) && (x != 1)) { x = x - 1; ff = fucktorize(x); res = 1; } int maxFucktor = *std::max_element(ff.begin(), ff.end()); int complement = x / maxFucktor; sCode += '<'; vector tmp_v; tmp_v.push_back(maxFucktor); tmp_v.push_back(complement); fuckfucktors(tmp_v, 0, '-'); sCode += ">"; for (int k = 0; k < res; k++) sCode += "-"; sCode += ". "; iMinvalue -= iMinvalue - (UCHAR)aStr[i]; continue; } if ((UCHAR)aStr[i] > iMinvalue) { int x = (UCHAR)aStr[i] - iMinvalue; vector ff = fucktorize(x); int res = 0; if ((ff.size() == 1) && (x != 1)) { x = x - 1; ff = fucktorize(x); res = 1; } int maxFucktor = *std::max_element(ff.begin(), ff.end()); int complement = x / maxFucktor; sCode += '<'; vector tmp_v; tmp_v.push_back(maxFucktor); tmp_v.push_back(complement); fuckfucktors(tmp_v, 0, '+'); sCode += ">"; for (int k = 0; k < res; k++) sCode += "+"; sCode += ". "; iMinvalue += (UCHAR)aStr[i] - iMinvalue; continue; } } return sCode; } int main(int argc, char *argv[]) { if (argc != 2) { cout << "Need string as a parameter to program" <