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';
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;
}
}
}