Rezolvare completă PbInfo #1491 Coduri

În urma inundațiilor din această iarnă, COFFESHOP a suferit câteva pierderi esențiale. Unele materiale au fost luate de ape, iar documentele de înregistrare deteriorate. Pentru estimarea pagubelor s-a pornit la realizarea unor liste cu produsele existente în depozit. Singurele documente recuperate parțial au fost listingurile codurilor produselor și ale codurilor de bare.

Fiecare produs are un un cod reprezentând un număr în bază 16. Codul de bare asociat fiecărui produs este numărul obținut prin conversia codului produsului în baza 2. Pentru un produs se cunoaște fie codul produsului, fie codul de bare. În cazul produselor ale căror coduri nu sunt total vizibile, cifrele care nu se vad sunt marcate cu X.

Cerința

Fiind date numerele naturale N, H și D, reprezentând numărul de produse, numărul de cifre pentru codurile produselor, respectiv numărul de cifre pentru codurile de bare și cele N coduri, să se determine:

a) Pentru fiecare produs pentru care se cunoaște unul dintre cele două coduri, codul care lipsește, adică codul de bare – dacă este specificat codul produsului, respectiv codul produsului – dacă este precizat codul de bare. Pentru produsele pentru care nu se cunoaște cu exactitate niciunul dintre coduri, se va determina, dacă este posibil, codul produsului.
b) Numărul de coduri indescifrabile.

Date de intrare

Fișierul de intrare coduri.in conține pe prima linie despărțite printr-un spațiu, trei numere naturale N H D. Începând cu a doua linie, pe următoarele N linii se găsesc N coduri, precedate de caracterul 'H' pentru codurile produselor, 'D' pentru codurile de bare sau 'U' (unknown) pentru produsele ale căror coduri sunt indescifrabile. În cazul în care, pentru un produs nu se cunoaște cu exactitate niciunul din coduri, fișierul de intrare conține pe linia corespunzătoare caracterul 'U', urmat de codul produsului și codul de bare, cifrele indescifrabile fiind marcate cu 'X'. Pentru codurile indescifrabile, în fișierul de intrare, este scris caracterul 'U', urmat de H cifre hexazecimale și D cifre binare.

Date de ieșire

Fișierul de ieșire coduri.out va conține N+1 linii. Pe primele N linii vor fi trecute codurile lipsă ale produselor în ordinea citirii din fișierul de intrare, codul produsului în cazul în care o parte din cifre sunt indescifrabile, dar pot fi reconstituite din codul de bare, respectiv 0 în cazul în care codul nu poate fi reconstituit. Pe ultima linie se va afișa numărul de coduri indescifrabile.

Restricții și precizări

  • 1 ≤ N ≤ 60000; 1 ≤ H ≤ 8; 1 ≤ D ≤ 32
  • Codurile produselor sunt cuprinse în intervalul [0,7FFFFFFF]
  • Pentru reprezentarea codurilor în hexazecimal se folosesc majuscule.

Exemplul 1

coduri.in

5 2 8
HB1
D01011100
D00110101
H23
HA3

coduri.out

10110001
5C
35
00100011
10100011
0

Explicație

Pe al doilea rând, numărul este în bază 16, adică reprezintă codul produsului, iar \( {B1}_{16} = {177}_{10} = {10110001}_{2} \).
Pe al treilea rând numărul este în bază 2, adică reprezintă codul de bare, iar \( {01011100}_{2} = {92}_{10} = {5C}_{16} \).
Pe al patrulea rând, numărul este în bază 2, adică reprezintă codul de bare, iar \( {00110101}_{2} = {53}_{10} = {35}_{16} \).
Pe al cincelea rând, numărul este în bază 16, adică reprezintă codul produsului, iar \( {23}_{16} = {35}_{10} = {00100011}_{2} \).
Pe al șaselea rând, număr este în bază 16, adică reprezintă codul produsului, iar \( {A3}_{16} = {163}_{10} = {10100011}_{2} \).
Pe ultimul rând se afișează 0, deoarece nu sunt coduri indescifrabile.

Exemplul 2

coduri.in

7 2 8
HB1
D11111111
UX00000X000
HA3
UBX1011X010
UBX10110011
UX1X0000001

coduri.out

10110001
FF
00
10100011
0
B3
0
2

Explicație

Pe al doilea rând, numărul este în bază 16, adică reprezintă codul produsului, iar \( {B1}_{16} = {177}_{10} = {10110001}_{2} \).
Pe al treilea rând numărul este în bază 2, adică reprezintă codul de bare, iar \( {11111111}_{2} = {255}_{10} = {FF}_{16} \).
Pe al patrulea rând, numărul este parțial indescifrabil, adică prima cifră din codul produsului nu este vizibilă, dar poate fi reconstituită din codul de bare, codul produsului fiind \( {00}_{16} = {0}_{10} = {00000000}_{2} \).
Pe al cincelea rând, numărul este în bază 16, adică reprezintă codul produsului, iar \( {A3}_{16} =16 {3}_{10} = {10100011}_{2} \).
Pe al șaselea rând, numărul este parțial indescifrabil, adică a doua cifră din codul produsului nu este vizibilă și nu poate fi reconstituită din codul de bare, deoarece cifra a cincea este de asemenea indescifrabilă. Se afișează 0.
Pe al șaptelea rând, numărul este parțial indescifrabil, adică a doua cifră din codul produsului nu este vizibilă, dar poate fi reconstituită din codul de bare, codul produsului fiind \( {B3}_{16} = {179}_{10} = {10110011}_{2} \).
Pe al optulea rând, numărul este parțial indescifrabil, adică prima cifră din codul produsului nu este vizibilă și nu poate fi reconstituită din codul de bare, deoarece prima cifră a acestuia este de asemenea indescifrabilă. Se afișează 0.
Pe ultimul rând se afișează 2, deoarece sunt 2 coduri indescifrabile.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Coduri:

#include <fstream>

using namespace std;

ifstream f("coduri.in");
ofstream g("coduri.out");
int n, h, d;
char a[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'},c,cod[65], cod1[65];
char w[64]={'0','0','0','0','0','0','0','1','0','0','1','0','0','0','1','1','0','1','0','0','0','1','0','1','0','1','1','0','0','1','1','1','1','0','0','0','1','0','0','1','1','0','1','0','1','0','1','1','1','1','0','0','1','1','0','1','1','1','1','0','1','1','1','1'};
int i,j,x,q,nrx=0,nrg;
int main()
{
    f>>n>>h>>d;
    for(i=1;i<=n;i++)
    {
        f>>c;
        if(c=='H')
        {
            for(j=1;j<=h;j++)
            {
                f>>cod[j];
                if(cod[j]>'9') q=cod[j]-'A'+10; else q=cod[j]-'0';
                g<<w[4*q+0]<<w[4*q+1]<<w[4*q+2]<<w[4*q+3];
            }
        }
        else
            if(c=='D')
            {
                for(int k=1;k<=d;k++)f>>cod1[k];
                for(j=1;j<=h;j++)
                {

                    x=(cod1[j*4-3]-'0')*8+(cod1[j*4-2]-'0')*4+(cod1[j*4-1]-'0')*2+(cod1[j*4]-'0');
                    g<<a[x];
                }
            }
            else
            {

                for(j=1;j<=h;j++)
                    f>>cod[j];
                nrg=0;
                for(int k=1;k<=d;k++)f>>cod1[k];
                for(j=1;j<=h;j++)
                {

                    if(cod[j]=='X')
                    {
                        if(cod1[j*4-3]!='X'&&cod1[j*4-2]!='X'&&cod1[j*4-1]!='X'&&cod1[j*4]!='X')
                        {
                            x=(cod1[j*4-3]-'0')*8+(cod1[j*4-2]-'0')*4+(cod1[j*4-1]-'0')*2+(cod1[j*4]-'0');
                            cod[j]=a[x];
                        }
                        else nrg++;
                    }
                }
                if(nrg>0) {nrx++;g<<0;}
                else
                for(j=1;j<=h;j++)
                {
                    g<<(char) cod[j];
                }
            }

        g<<'\n';

    }
    g<<nrx;
    g.close();
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1491 Coduri

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1491 Coduri de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!