out3/0016329_3.cpp

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

int determinator(char* det,int num);
bool load(char* input,int i,int* output);
void halt(int* output);
bool jmp(char* input,int i,int* output);
bool jmpeq(char* input,int i,int* output);
bool ror(char* input,int i,int* output);
bool xor1(char* input,int i,int* output);
bool addi(char* input,int i,int* output);
bool addf(char* input,int i,int* output);
bool move(char* input,int i,int* output);
bool load(char* input,int i,int* output);
bool store(char* input,int i,int* output);
bool or1(char* input,int i,int* output);
bool and1(char* input,int i,int* output);
void binarytransformation(int* output,int* binaryoutput);


int main(){
    char input[255],det[6];
    int output[4],binaryoutput[16];

    while(1){
             
    for(int l=0;l<=3;l++)output[l]=16; //initialization of output
    gets(input);

    int i=0;
    while((input[i]<='Z'&&input[i]>='A')||(input[i]<='z'&&input[i]>='a'))
    {
    det[i]=input[i++];
}
                      det[i]='\0';

other

    for(int i=0;det[i]!='\0';i++) // ->small capital
    {
     if(det[i]<='Z'&&det[i]>='A')det[i]=(char)(det[i]+32);
     }

    int deter1=determinator(det,i);
    bool deter2;
    switch(deter1)
        {
                case 11:deter2=and1(input,i,output);break;  
                case 10:halt(output);break;
                case 9:deter2=jmp(input,i,output);break;
                case 8:deter2=jmpeq(input,i,output);break;
                case 7:deter2=ror(input,i,output);break;
                case 6:deter2=xor1(input,i,output);break;
                case 5:deter2=or1(input,i,output);break;
                case 4:deter2=addf(input,i,output);break;
                case 3:deter2=addi(input,i,output);break;
                case 2:deter2=move(input,i,output);break;
                case 1:deter2=store(input,i,output);break;
                case 0:deter2=load(input,i,output);break;
                }

    binarytransformation(output,binaryoutput);

    if(deter1==255||deter2==false){
                                   cout<<"Error: " <<input;
                                   break;
                                   }
    for(int k=0;k<=15;k++)
    cout<<binaryoutput[k];
    cout<<endl;
    }
    //system("pause");
}

int determinator(char* det,int num){
    if(equal(det,det+(num+1),"load"))return 0;
    if(equal(det,det+(num+1),"store"))return 1;
    if(equal(det,det+(num+1),"move"))return 2;
    if(equal(det,det+(num+1),"addi"))return 3;
    if(equal(det,det+(num+1),"addf"))return 4;
    if(equal(det,det+(num+1),"or"))return 5;
    if(equal(det,det+(num+1),"xor"))return 6;
    if(equal(det,det+(num+1),"ror"))return 7;
    if(equal(det,det+(num+1),"jmpeq"))return 8;
    if(equal(det,det+(num+1),"jmp"))return 9;
    if(equal(det,det+(num+1),"halt"))return 10;
    if(equal(det,det+(num+1),"and"))return 11;
    return 255;
}

void halt(int* output){
     output[0]=12;
     output[1]=0;
     output[2]=0;
     output[3]=0;
     }

bool load(char* input,int i,int* output){
    int j=i;
    
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[1]=input[j++]-'0';

    for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
    j++;
    for(;j<=255&&input[j]==' ';j++){
        if(j==253)return false;
        }
    

    if(input[j]=='['){
                        int k=j;
                        int num=0;
                        k++;
                        for(;input[k]<='9'&&input[k]>='0';k++)if((k-j)>3)return false;
                        switch(k-j-1){
                                    case 3:num=((input[j+1]-'0')*100)+((input[j+2]-'0')*10)+(input[j+3]-'0');break;
                                    case 2:num=((input[j+1]-'0')*10)+(input[j+2]-'0');break;
                                    case 1:num=input[j+1]-'0';break;
                                    }
                        if(num>255)return false;
                        output[2]=num/16;
                        num=num%16;
                        output[3]=num;
                        if(input[k]!=']')return false;
                        output[0]=1;
                        }
                        
    if(input[j]<='9'&&input[j]>='0')
        {                                      
                        int k=j;
                        int num=0;
                        for(;input[k]<='9'&&input[k]>='0';k++)if((k-j)>3)return false;
                        switch(k-j){
                                    case 3:num=((input[j]-'0')*100)+((input[j+1]-'0')*10)+(input[j+2]-'0');break;
                                    case 2:num=((input[j]-'0')*10)+(input[j+1]-'0');break;
                                    case 1:num=input[j]-'0';break;
                                    }
                        if(num>255)return false;
                        output[2]=num/16;
                        num=num%16;
                        output[3]=num;
                        output[0]=2;
                        }
        
        for(int k=0;k<=3;k++)
        {         
            if(output[k]>=65-'0'&&output[k]<=70-'0')output[k]-=7;
            if(output[k]>15)return false;
            }
            return true;
            }
            
bool store(char* input,int i,int* output){
     
    int j=i;
    
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[1]=input[j++]-'0';

    for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
    j++;
    for(;j<=255&&input[j]==' ';j++){
        if(j==253)return false;
        }
                         
    if(input[j]=='['){
                            int k=j;
                            int num=0;
                            k++;
                            for(;input[k]<='9'&&input[k]>='0';k++)if((k-j)>3)return false;
                            switch(k-j-1){
                                        case 3:num=((input[j+1]-'0')*100)+((input[j+2]-'0')*10)+(input[j+3]-'0');break;
                                        case 2:num=((input[j+1]-'0')*10)+(input[j+2]-'0');break;
                                        case 1:num=input[j+1]-'0';break;
                                        }
                            if(num>255)return false;
                            output[2]=num/16;
                            num=num%16;
                            output[3]=num;
                            if(input[k]!=']')return false;
                            output[0]=3;
                            }
        
        for(int k=0;k<=3;k++)
        {         
            if(output[k]>=65-'0'&&output[k]<=70-'0')output[k]-=7;
            if(output[k]>15)return false;
            }
            return true;
            }

bool jmp(char* input,int i,int* output){
     
    int j=i;
    
    output[0]=11;
    output[1]=0;

    for(;j<=255&&input[j]==' ';j++){
        if(j==253)return false;
        }
                         
    if(input[j]<='9'&&input[j]>='0')
        {                                      
                        int k=j;
                        int num=0;
                        for(;input[k]<='9'&&input[k]>='0';k++)if((k-j)>3)return false;
                        switch(k-j){
                                    case 3:num=((input[j]-'0')*100)+((input[j+1]-'0')*10)+(input[j+2]-'0');break;
                                    case 2:num=((input[j]-'0')*10)+(input[j+1]-'0');break;
                                    case 1:num=input[j]-'0';break;
                                    }
                        if(num>255)return false;
                        output[2]=num/16;
                        num=num%16;
                        output[3]=num;
                        }
        
        for(int k=0;k<=3;k++)
        {         
            if(output[k]>15)return false;
            }
            return true;
            }
            
bool move(char* input,int i,int* output){
     
    int j=i;
    output[0]=4;
    output[1]=0;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[3]=input[j++]-'0';
    for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
    j++;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[2]=input[j++]-'0';
     for(int k=0;k<=3;k++)
        {   
            if(output[k]>=65-'0'&&output[k]<=70-'0')output[k]-=7;      
            if(output[k]>15)return false;
            }
            return true;
            }
            
bool addi(char* input,int i,int* output){
     
    int j=i;
    output[0]=5;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[1]=input[j++]-'0';
    for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
    j++;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[2]=input[j++]-'0';
    for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
    j++;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[3]=input[j++]-'0';
     for(int k=0;k<=3;k++)
        {   
            if(output[k]>=65-'0'&&output[k]<=70-'0')output[k]-=7;      
            if(output[k]>15)return false;
            }
            return true;
            }
            
bool addf(char* input,int i,int* output){
     
    int j=i;
    output[0]=6;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[1]=input[j++]-'0';
    for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
    j++;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[2]=input[j++]-'0';
    for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
    j++;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[3]=input[j++]-'0';
     for(int k=0;k<=3;k++)
        {   
            if(output[k]>=65-'0'&&output[k]<=70-'0')output[k]-=7;      
            if(output[k]>15)return false;
            }
            return true;
            }
            
bool or1(char* input,int i,int* output){
     
    int j=i;
    output[0]=7;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[1]=input[j++]-'0';
    for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
    j++;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[2]=input[j++]-'0';
    for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
    j++;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[3]=input[j++]-'0';
     for(int k=0;k<=3;k++)
        {   
            if(output[k]>=65-'0'&&output[k]<=70-'0')output[k]-=7;      
            if(output[k]>15)return false;
            }
            return true;
            }
    
bool and1(char* input,int i,int* output){
     
    int j=i;
    output[0]=8;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[1]=input[j++]-'0';
    for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
    j++;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[2]=input[j++]-'0';
    for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
    j++;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[3]=input[j++]-'0';
     for(int k=0;k<=3;k++)
        {   
            if(output[k]>=65-'0'&&output[k]<=70-'0')output[k]-=7;      
            if(output[k]>15)return false;
            }
            return true;
            }
     
            
bool xor1(char* input,int i,int* output){
     
    int j=i;
    output[0]=9;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[1]=input[j++]-'0';
    for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
    j++;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[2]=input[j++]-'0';
    for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
    j++;
    for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
    j++;
    output[3]=input[j++]-'0';
     for(int k=0;k<=3;k++)
        {   
            if(output[k]>=65-'0'&&output[k]<=70-'0')output[k]-=7;      
            if(output[k]>15)return false;
            }
            return true;
            } 
            
bool ror(char* input,int i,int* output){
     
     int j=i;
     output[0]=10;
     output[2]=0;
     for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
     j++;
     output[1]=input[j++]-'0';
     for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
     j++;
     for(;j<=255&&input[j]==' ';j++){
        if(j==253)return false;
        }
     if(input[j]<='9'&&input[j]>='0')
        {                                      
                        int k=j;
                        int num=0;
                        for(;input[k]<='9'&&input[k]>='0';k++)if((k-j)>2)return false;
                        switch(k-j){
                                    case 2:num=((input[j]-'0')*10)+(input[j+1]-'0');break;
                                    case 1:num=input[j]-'0';break;
                                    }
                        if(num>16)return false;
                        output[3]=num;
                        }
        for(int k=0;k<=3;k++)
        {   
            if(output[k]>=65-'0'&&output[k]<=70-'0')output[k]-=7;      
            if(output[k]>15)return false;
            }
            return true;
            }
    
bool jmpeq(char* input,int i,int* output){
     int j=i;
     output[0]=10;
     for(;j<=255&&input[j]!='R';j++){
        if(j==255)return false;
        }
     j++;
     output[1]=input[j++]-'0';
     for(;j<=255&&input[j]!='=';j++){
        if(j==255)return false;
        }
     j++;
     for(;j<=255&&input[j]==' ';j++){
        if(j==250)return false;
        }
     if(input[j]!='R'||input[j+1]!='0'){cout<<"a"<<input[j];return false;}
     j+=2;
     for(;j<=255&&input[j]!=',';j++){
        if(j==255)return false;
        }
     j++;
     for(;j<=255&&input[j]==' ';j++){
        if(j==250)return false;
        }
     if(input[j]<='9'&&input[j]>='0')
        {                                      
                        int k=j;
                        int num=0;
                        for(;input[k]<='9'&&input[k]>='0';k++)if((k-j)>3)return false;
                        switch(k-j){
                                    case 3:num=((input[j]-'0')*100)+((input[j+1]-'0')*10)+(input[j+2]-'0');break;
                                    case 2:num=((input[j]-'0')*10)+(input[j+1]-'0');break;
                                    case 1:num=input[j]-'0';break;
                                    }
                        if(num>255)return false;
                        output[2]=num/16;
                        num=num%16;
                        output[3]=num;
                        }
        for(int k=0;k<=3;k++)
        {         
            if(output[k]>=65-'0'&&output[k]<=70-'0')output[k]-=7;
            if(output[k]>15)return false;
            }
            return true;
            }
     
void binarytransformation(int* output,int* binaryoutput){

     for(int i=0;i<=3;i++)
     {
             for(int j=0,sum=8;j<=3;j++,sum/=2)
             {
                     binaryoutput[4*i+j]=output[i]/sum;
                     output[i]=output[i]%sum;
                     }
        }
        }