//--------------------------------------------------------------------------- #include <iostream> #include <stdio.h> #include <vector> #include <string> #include <list> #include <algorithm> typedef unsigned char UCHAR; using namespace std; //--------------------------------------------------------------------------- string sCode; // Ôàêòîðèçàöèÿ ÷èñëà vector<int> fucktorize(int numm) { if (numm == 1) { vector<int> v; v.push_back(1); return v; } int newnum = numm; vector<int> 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<int>& 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<int> 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<int> 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<int> 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<int> 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<int> 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" <<endl; cout << "Exiting..." << endl; return -1; } string bff_code = brainfuckit(argv[1]); cout << bff_code <<endl; // system("pause"); return 0; }