//-------------------------------------------- // COW PROGRAMMING LANGUAGE // by: BigZaphod sean@fifthace.com // http://www.bigzaphod.org/cow/ // // License: Public Domain //-------------------------------------------- // Distributed Digestion eXtentions (DDX) // - added by Bovine Programming Reseach // - also known as Jason Nordwick. //-------------------------------------------- #include #include int const num_stomachs = 7; typedef std::vector mem_t; typedef std::vector tract_t; typedef std::vector poses_t; mem_t program; mem_t::iterator prog_pos; tract_t memory(num_stomachs); poses_t mem_poses(num_stomachs); int stomach; int register_val; bool has_register_val = false; void quit( bool error ) { if( error ) { printf( "\nERROR!\n" ); exit(1); } printf( "\nDone.\n" ); exit(0); } bool exec( int instruction ) { // printf( "EXEC: %d\n", instruction ); switch( instruction ) { // moo case 0: { if( prog_pos == program.begin() ) quit( true ); prog_pos--; // skip previous command. int level = 1; while( level > 0 ) { if( prog_pos == program.begin() ) break; prog_pos--; if( (*prog_pos) == 0 ) level++; else if( (*prog_pos) == 7 ) // look for MOO level--; } if( level != 0 ) quit(true); return exec( *prog_pos ); } // mOo case 1: if( mem_poses[stomach] == memory[stomach].begin() ) quit( true ); else mem_poses[stomach]--; break; // moO case 2: mem_poses[stomach]++; if( mem_poses[stomach] == memory[stomach].end() ) { memory[stomach].push_back(0); mem_poses[stomach] = memory[stomach].end(); mem_poses[stomach]--; } break; // mOO case 3: if( (*mem_poses[stomach]) == 3 ) quit( false ); return exec(*mem_poses[stomach]); // Moo case 4: if( (*mem_poses[stomach]) != 0 ) printf( "%c", *mem_poses[stomach] ); else { (*mem_poses[stomach]) = getchar(); while( getchar() != '\n' ); } break; // MOo case 5: (*mem_poses[stomach])--; break; // MoO case 6: (*mem_poses[stomach])++; break; // MOO case 7: if( (*mem_poses[stomach]) == 0 ) { int level = 1; int prev = 0; prog_pos++; // have to skip past next command when looking for next moo. if( prog_pos == program.end() ) break; while( level > 0 ) { prev = *prog_pos; prog_pos++; if( prog_pos == program.end() ) break; if( (*prog_pos) == 7 ) level++; else if( (*prog_pos) == 0 ) // look for moo command. { level--; if( prev == 7 ) level--; } } if( level != 0 ) quit( true ); } break; // OOO case 8: (*mem_poses[stomach]) = 0; break; // MMM case 9: if( has_register_val ) (*mem_poses[stomach]) = register_val; else register_val = (*mem_poses[stomach]); has_register_val = !has_register_val; break; // OOM case 10: printf( "%d\n", *mem_poses[stomach] ); break; // oom case 11: { char buf[100]; unsigned int c = 0; while( c < sizeof(buf)-1 ) { buf[c] = getchar(); c++; buf[c] = 0; if( buf[c-1] == '\n' ) break; } // swallow, just in case. if( c == sizeof(buf) ) while( getchar() != '\n' ); (*mem_poses[stomach]) = atoi( buf ); break; } // MMm case 12: { stomach--; if(stomach < 0) stomach += num_stomachs; break; } // MmM case 13: { stomach++; if(stomach >= num_stomachs) stomach -= num_stomachs; break; } // Oom case 14: { for( int i=0; i 0 ) weight += *mem_poses[i]; } if( weight == 0 ) { for( int i=0; i 0 ) *mem_poses[i] = *mem_poses[i] * div; else if( *mem_poses[i] < 0 ) *mem_poses[i] = mod * -*mem_poses[i]; else *mem_poses[i] = 0; } } } else { int sum = 0; for( int i=0; i