Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdio.h>
- #include <cstring>
- using namespace std;
- FILE *fin=fopen("coduri.in","r");
- FILE *fout=fopen("coduri.out","w");
- unsigned int n,h,d;
- char s[41];
- int v[33];
- void binar_hexa(char b[]) // Functie conversie din binar in hexa
- {
- unsigned int i,j=0;
- int x[33];
- unsigned int n=strlen(b);
- for(i=3;i<=n;i+=4)
- {
- j++;
- x[j]=8*(b[i-3]-48)+4*(b[i-2]-48)+2*(b[i-1]-48)+(b[i]-48);
- }
- n=j;
- for(i=1;i<=n;i++)
- {
- if(x[i]<10)
- fprintf(fout,"%d",x[i]);
- else
- switch(x[i])
- {
- case 10:{fprintf(fout,"%c",'A');break;}
- case 11:{fprintf(fout,"%c",'B');break;}
- case 12:{fprintf(fout,"%c",'C');break;}
- case 13:{fprintf(fout,"%c",'D');break;}
- case 14:{fprintf(fout,"%c",'E');break;}
- case 15:{fprintf(fout,"%c",'F');break;}
- }
- }
- fprintf(fout,"\n");
- }
- void hexa_binar(char s[],int v[]) // Functie conversie din hexa in binar
- {
- unsigned int L=strlen(s),j=0;
- for(unsigned int i=0;i<L;i++)
- {
- if(s[i]=='0')
- {v[j]=0;v[j+1]=0;v[j+2]=0;v[j+3]=0;}
- if(s[i]=='1')
- {v[j]=0;v[j+1]=0;v[j+2]=0;v[j+3]=1;}
- if(s[i]=='2')
- {v[j]=0;v[j+1]=0;v[j+2]=1;v[j+3]=0;}
- if(s[i]=='3')
- {v[j]=0;v[j+1]=0;v[j+2]=1;v[j+3]=1;}
- if(s[i]=='4')
- {v[j]=0;v[j+1]=1;v[j+2]=0;v[j+3]=0;}
- if(s[i]=='5')
- {v[j]=0;v[j+1]=1;v[j+2]=0;v[j+3]=1;}
- if(s[i]=='6')
- {v[j]=0;v[j+1]=1;v[j+2]=1;v[j+3]=0;}
- if(s[i]=='7')
- {v[j]=0;v[j+1]=1;v[j+2]=1;v[j+3]=1;}
- if(s[i]=='8')
- {v[j]=1;v[j+1]=0;v[j+2]=0;v[j+3]=0;}
- if(s[i]=='9')
- {v[j]=1;v[j+1]=0;v[j+2]=0;v[j+3]=1;}
- if(s[i]=='A')
- {v[j]=1;v[j+1]=0;v[j+2]=1;v[j+3]=0;}
- if(s[i]=='B')
- {v[j]=1;v[j+1]=0;v[j+2]=1;v[j+3]=1;}
- if(s[i]=='C')
- {v[j]=1;v[j+1]=1;v[j+2]=0;v[j+3]=0;}
- if(s[i]=='D')
- {v[j]=1;v[j+1]=1;v[j+2]=0;v[j+3]=1;}
- if(s[i]=='E')
- {v[j]=1;v[j+1]=1;v[j+2]=1;v[j+3]=0;}
- if(s[i]=='F')
- {v[j]=1;v[j+1]=1;v[j+2]=1;v[j+3]=1;}
- j+=4;
- }
- }
- int main()
- {
- fscanf(fin,"%d%d%d",&n,&h,&d);
- int nr=0,ok;
- for(unsigned int i=1;i<=n;i++)
- {
- fscanf(fin,"%s",s);
- unsigned int L=strlen(s)-1;
- char sir[9];
- if(s[0]=='H') // Daca e cod produs
- {
- for(unsigned int j=0;j<=L;j++)
- sir[j]=s[j+1];
- sir[L]='\0';
- hexa_binar(sir,v);
- for(unsigned int j=0;j<4*L;j++)
- fprintf(fout,"%d",v[j]);
- fprintf(fout,"\n");
- }
- if(s[0]=='D') // Daca e cod de bare
- {
- for(unsigned int j=0;j<=L;j++)
- s[j]=s[j+1];
- s[L]='\0';
- binar_hexa(s);
- }
- char sh[9],sd[33];
- if(s[0]=='U') // Daca e un cod ce nu e total lizibil
- {
- for(unsigned int j=0;j<h;j++) // Completez vectorul hexa
- sh[j]=s[j+1];
- sh[h]='\0';
- unsigned int Ld=0;
- for(unsigned int j=h+1;j<=L;j++) // Completez vectorul binar
- {
- sd[Ld]=s[j];
- Ld++;
- }
- sd[Ld]='\0';
- unsigned int cifra;
- ok=1;
- for(unsigned int j=0;j<h;j++)
- {
- if(sh[j]=='X') // Daca un element in codul hexa nu e lizibil
- {
- if((j*4+3)>Ld) // Daca nu are cod binar corespunzator
- {
- ok=0;
- break;
- }
- else // Daca codul binar e corect
- if(sd[j*4]!='X'&&sd[j*4+1]!='X'&&sd[j*4+2]!='X'&&sd[j*4+3]!='X')
- {
- cifra=8*(sd[j*4]-48)+4*(sd[j*4+1]-48)+2*(sd[j*4+2]-48)+(sd[j*4+3]-48);
- if(cifra<10) // Depun cifra calculata in codul hexa
- sh[j]=cifra+48;
- else
- switch(cifra)
- {
- case 10:{sh[j]='A';break;}
- case 11:{sh[j]='B';break;}
- case 12:{sh[j]='C';break;}
- case 13:{sh[j]='D';break;}
- case 14:{sh[j]='E';break;}
- case 15:{sh[j]='F';break;}
- }
- }
- else // Nici codul binar nu poate fi recuperat
- for(int k=0;k<h-1;k++)
- if(k!=j&&sd[k*4]==sd[j*4]&&sd[k*4+1]==sd[j*4+1]&&sd[k*4+2]==sd[j*4+2]&&sd[k*4+3]==sd[j*4+3]&&sh[k]!='X')
- sh[j]=sh[j];
- else
- ok=0;
- }
- }
- if(ok) // Daca s-a putut recupera codul il afisez
- fprintf(fout,"%s\n",sh);
- else // Codul n-a putut fi recuperat
- {
- nr++;
- fprintf(fout,"%d\n",0);
- }
- }
- }
- fprintf(fout,"%d",nr);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement