Exemple #1
0
int main(int argc, char ** argv) {
  bitset<OptionFlagNum> mode;
  string prog;

  int opt, diff = 0;
  while (( opt = getopt(argc, argv, "hleg")) != -1) {
    switch (opt) {
    case 'h': mode.set( MODE_HELP ); break;
    case 'e': mode.set( OPTION_EMIT ); break;
    case 'l': mode.set( OPTION_LABELS ); break;
    case 'g': mode.set( OPTION_GENOME ); break;
    }
  }

  if ( mode[MODE_HELP] ) { usage(); exit(0); }

  char *name;
  for (; optind<argc; optind++)
    if (argv[optind])
      name = argv[optind];

  ifstream ifs( name );

  if (!ifs)
    if (!mode[OptionFlagNum]) { test(); exit(1); }
    else { usage(); exit(1); }

  char c;
  while (ifs.get(c)) {
    switch(c) {
    case ' ' : prog+='A'; break;
    case '\t': prog+='B'; break;
    case '\n': prog+='C'; break;
    }
  }

  map<string, int> labels;
  VT tokens;
  int pos = 0;

  while ( !prog.empty() ) {
    Token tok = lexer(prog, pos);
    tokens.push_back(tok);

    if ( tok.get_id() == CAAP )
      labels[ tok.get_param() ] = tok.get_pos();
  }

  if ( mode[OPTION_LABELS] ) debug_labels(tokens, labels);
  if ( mode[OPTION_EMIT] )   debug_print(tokens, labels);
  if ( mode[OPTION_GENOME] ) debug_print_as_genome(tokens);

  if ( mode[OPTION_LABELS] | mode[OPTION_EMIT] | mode[OPTION_GENOME] )
    cout << endl << "  <===--- RUN PROGRAM ---===>" << endl << endl;

  interprete(tokens, labels);
}
void backtrack(VVI& dp, VT& res, VT& A, VT& B, int i, int j)
{
  if(!i || !j) return;
  if(A[i-1] == B[j-1]) { res.push_back(A[i-1]); backtrack(dp, res, A, B, i-1, j-1); }
  else
  {
    if(dp[i][j-1] >= dp[i-1][j]) backtrack(dp, res, A, B, i, j-1);
    else backtrack(dp, res, A, B, i-1, j);
  }
}
Exemple #3
0
void test() {
  map<string, int> labels;
  VT tokens;
  int pos = 0;

  /* test program */
  string prog  =
         string("AAACAAABAABAAACBBAAAABCAAABBAABABCBBAAAABACAAA")
    + "BBABBAACBBAAAABBCAAABBABBAACBBAAAABAACAAABBABBBBCBBAAAAB"
    + "ABCAAABABBAACBBAAAABBACAAABAAAAACBBAAAABBBCAAABBBABBBCBB"
    + "AAAABAAACAAABBABBBBCBBAAAABAABCAAABBBAABACBBAAAABABACAAA"
    + "BBABBAACBBAAAABABBCAAABBAABAACBBAAAABBAACAAABAAAAACBBAAA"
    + "ABBABCAAABBABBBBCBBAAAABBBACAAABBAABBACBBAAAABBBBCAAABAA"
    + "AAACBBAAAABAAAACAAABBBAABBCBBAAAABAAABCAAABBBAAAACBBAAAA"
    + "BAABACAAABBAAAABCBBAAAABAABBCAAABBAAABBCBBAAAABABAACAAAB"
    + "BAABABCBBAAAABABABCAAABBBAABBCBBAAAABABBACAAABAAAABCBBAA"
    + "AABABBBCAAAACBBAAAAACCABABBBABBBABBBAABAABBABAABABBBABAA"
    + "ABBAABABCCABABBABBBAABBAABABABBBABBBABBABBAAABBABAABABBA"
    + "BBBAABBAABABCCCCCAAABBAAAABABBAABAAABBAABAACBAAACBCCAAAB"
    + "BBABBBABBBAABAABBABAABABBBABAAABBAABABCACABBBACACBAABBBA"
    + "BBBABBBAABAABBABAABABBBABAAABBAABABABABBBBBABBAABABABBAB"
    + "BBAABBAABAACBCAAAAABCBAAACACABBBABBBABBBAABAABBABAABABBB"
    + "ABAAABBAABABCCAAABBBABBBABBBAABAABBABAABABBBABAAABBAABAB"
    + "ABABBBBBABBAABABABBABBBAABBAABAACACCACCCBCCAAABBBAABAABB"
    + "AABABABBAAAABABBAABAACACAACABCBABBBACAAAABABACBAABCBAABB"
    + "BAABAABBAABABABBAAAABABBAABAAABABBBBBABBAABABABBABBBAABB"
    + "AABAACACCAAABCBAAACACABBBAABAABBAABABABBAAAABABBAABAACCA"
    + "AABBBAABAABBAABABABBAAAABABBAABAAABABBBBBABBAABABABBABBB"
    + "AABBAABAACACCAAABCBAAAAAAACBBACBCCAAABBABBBAABBAABABABBB"
    + "ABBBABBABBAAABBABAABABBABBBAABBAABABCAAABABACAAABBABCBCA"
    + "ABCAACBC";

  while ( !prog.empty() ) {
    Token tok = lexer(prog, pos);
    tokens.push_back(tok);

    if ( tok.get_id() == CAAP )
      labels[ tok.get_param() ] = tok.get_pos();
  }

  usage();

  debug_labels(tokens, labels);
  debug_print(tokens, labels);
  debug_print_as_genome(tokens);

  cout << endl << "  <===--- RUN PROGRAM ---===>" << endl << endl;
  interprete(tokens, labels);
}
Exemple #4
0
VT
BRAIN::top () const
{
    VT vt;
    PBC smass = infop->area.getmass (infop->getlastpos (), infop->getlastclr ());
    PBC smass_his = infop->area.getmass (smass.first, infop->turn ());
    PBC fmass = infop->father->area.getmass (smass.first, infop->getlastclr ());
    PBC fmass_his = infop->father->area.getmass (smass.first, infop->turn ());
    // 断事件,必然有异块半联(即断)已块半联(即断),可能有已块联络(全联)
    BITB cut = infop->cutpos (infop->getlastclr ()).blockon (infop->getlastpos ());
    if (cut[infop->getlastpos ()])
    {
        PBC f_his = infop->father->area.getmass (cut, infop->turn ());
        PBC s_my = infop->area.getmass (cut, infop->getlastclr ());
        vt.push_back (TARGET (DUAN, INT_MAX, f_his, s_my));       //被断者,断者
    }
    // 已块联络,落在父的什么色区都有可能
    if (fmass.first.blockcount () > 1)
        vt.push_back (TARGET (LIANLUO, INT_MAX, fmass, smass));     //联络对象,联络效果
    // 异块隔开,落在父的什么色区都有可能
    if (fmass_his.first.blockcount () < smass_his.first.blockcount ())
        vt.push_back (TARGET (GE, INT_MAX, fmass_his, smass));      //隔开对象,阻隔者
    return vt;
}
void backtrackall(VVI& dp, set<VT>& res, VT& A, VT& B, int i, int j)
{
  if(!i || !j) { res.insert(VI()); return; }  
  if(A[i-1] == B[j-1])
  {
    set<VT> tempres;
    backtrackall(dp, tempres, A, B, i-1, j-1);
    for(set<VT>::iterator it=tempres.begin(); it!=tempres.end(); it++)
    {
      VT temp = *it;
      temp.push_back(A[i-1]);
      res.insert(temp);
    }
  }
  else
  {
    if(dp[i][j-1] >= dp[i-1][j]) backtrackall(dp, res, A, B, i, j-1);
    if(dp[i][j-1] <= dp[i-1][j]) backtrackall(dp, res, A, B, i-1, j);
  }
}
Exemple #6
0
TARGETS
operator ~ (TARGETS a)
{
  vector < TARGETS > vts (a.nut.size ());
  VT vt;
  for (int i = 0; i < a.nut.size (); ++i)       //将 a.nut 按行(与结构)每个元素取~后
    for (int j = 0; j < a.nut[i].size (); ++j)
      {                         //竖排(或结构)形成一个targets, 共a.nut.size()个
        vt.clear ();
        vt.push_back (~a.nut[i][j]);
        vts[i].nut.push_back (vt);
      } TARGETS
    tmp = vts[0];
  for (int i = 1; i < vts.size (); ++i) //将这些targets连&
    tmp = tmp & vts[i];
  for (int i = 0; i < tmp.nut.size (); ++i)     //归整每行(与结构)
    unique (tmp.nut[i].begin (), tmp.nut[i].end ());
  unique (tmp.nut.begin (), tmp.nut.end ());    //归整所有行(或结构)
  return tmp;
}