int runprog(int first, int last, int level) { int ans = 0; for (int i = first; i < last; ++i) { if (prog[i].ilevel > level) continue; else if (prog[i].ilevel < level) return ans; if (prog[i].type == Stmt::STMT_LAG) { //std::cout << "LAG " << i << std::endl; ++ans; continue; } int for_to = 0; if (prog[i].for_is_var) { for_to = var[prog[i].for_var]; } else { for_to = prog[i].for_num; } int& looper = var[prog[i].looper]; for (looper = 0; looper < for_to; ++looper) { //std::cout << (char) (prog[i].looper + 'a') << ' ' << looper << std::endl; ans += runprog(i + 1, last, level + 1); } } return ans; }
// entry point into program int main(int argc, char *argv[]) { int x; program *pgm; FILE *fp; signal(SIGFPE, fpe_handler); signal(SIGINT, brk_handler); gprog = SafeMalloc(sizeof(program)); storageinit(gprog); envinfo.argc = argc; for (x=0; x<argc; x++) envinfo.argv[x] = argv[x]; if ((fp = fopen("LOGIN", "rb")) == NULL) printf("ERROR: Could not open login script\n"); else { fclose(fp); pgm = SafeMalloc(sizeof(program)); envinit(); loadall(pgm, "LOGIN"); runprog(pgm, 1); GC_free(pgm); } printf("\x1B[11m"); rl_inhibit_completion = 1; printf("\n\x1B[10mREADY\n"); setjmp(mark); do { stackinit(); gprog->nextprog = 0; gprog->prevprog = 0; input = readline(">"); prog = input; if (*input) { add_history(input); encode_rpn(); } } while (1); return 0; }
int main() { std::string s; while (std::getline(std::cin, s)) { Stmt st; int i = 0; while (s[i] == ' ') ++i; st.ilevel = i / 4; if (s[i] == 'l') st.type = Stmt::STMT_LAG; else { st.type = Stmt::STMT_FOR; char ch = s[s.size() - 3]; if (std::isdigit(ch)) { st.for_is_var = false; st.for_num = ch - '0'; } else { st.for_is_var = true; st.for_var = ch - 'a'; } st.looper = s[i + 4] - 'a'; } prog.push_back(st); } for (int i = 0; i <= 6; ++i) { var['n' - 'a'] = i; runresult[i] = runprog(0, prog.size(), 0); //std::cout << runresult[i] << std::endl; } for(int i = 0; i <= 6; ++i){ aaaa tmp(1, 1); for(int j = 0; j <= 6; ++j){ a[i+1][j+1] = tmp; tmp = tmp * aaaa(i, 1); } a[i+1][0] = aaaa(runresult[i], 1); } for(int i = 1; i <= 7; ++i){ int tmp = -1; for(int j = i; j <= 7; ++j) if(a[j][i].a != 0 && tmp == -1) tmp = j; if(i != tmp){ for(int j = 0; j <= 7; ++j) std::swap(a[i][j], a[tmp][j]); } //std::cout << a[i][i].a << std::endl; #if 0 for(int j = 1; j <= 3; ++j) { for (int k = 0; k <= 3; ++k) { std::cout << '(' << a[j][k].a << '/' << a[j][k].b << ") "; } std::cout << std::endl; } std::cout << "====" << std::endl; #endif for(int j = i + 1; j <= 7; ++j){ aaaa t = a[j][i] / a[i][i]; for(int k = 0; k <= 7; ++k){ a[j][k] = a[j][k] - (a[i][k] * t); } //std::cout << i << ' ' << j << ' ' << t.a << '/' << t.b << std::endl; //std::cout << a[1][0].a << '/' << a[1][0].b << std::endl; } #if 0 for(int j = 1; j <= 3; ++j) { for (int k = 0; k <= 3; ++k) { std::cout << '(' << a[j][k].a << '/' << a[j][k].b << ") "; } std::cout << std::endl; } std::cout << "====" << std::endl; #endif } for(int i = 7; i >= 1; --i){ for(int j = i + 1; j <= 7; ++j) a[i][0] = a[i][0] - a[i][j] * a[j][0]; a[i][0] = a[i][0] / a[i][i]; } bool first = true; for(int i = 1; i <= 7; ++i) { if (a[i][0].a == 0) continue; if (!first) { std::cout << " + "; } else { first = false; } for (int j = 0; j < i - 1; ++j) { std::cout << "n * "; } std::cout << a[i][0].a << "/" << a[i][0].b; } std::cout << std::endl; return 0; }