(Aquest problema fa servir la funció
char\_to\_base64 del problema "Decodificar Base64
(1)".)
Es tracta de fer un programa que, donada una seqüència de caràcters a l’entrada (un dels 64 que representen els dígits de base 64), la decodifiqui en els seus bytes. La decodificació funciona de la següent manera:
Primer, per a cada grup de 4 caràcters (o quartet) de l’entrada
,
,
i
,
els transformem en els seus dígits corresponents.
,
,
,
,
usant la funció char_to_base64.
Després, amb els 4 dígits reconstruim el natural aplicant la fórmula:
Tot seguit, reinterpretem en base 256, i n’extraiem les xifres, que ara són 3: , , i . El procés és totalment anàleg a extreure les xifres d’un nombre en base 10, però en base 256. El que haurem fet és calcular els dígits de la fórmula següent:
(Cal recordar que el procés d’extracció de les xifres treballat a PRO1 produeix les xifres al revés, començant per )
Finalment, mostrem , i com a nombres naturals per pantalla, en aquest ordre.
La codificació en base 64 sempre té un nombre de caràcters múltiple
de 4, però just al final de la seqüència pot haver-hi ’=’ o
’==’, que ens diu que el número de bytes de l’últim quartet
són 2 o 1, i no 3:
Si l’últim quartet té algun ’=’ al final:
Si té ’==’: el número de bytes serà 1; assignem
i
,
decodifiquem segons els passos anteriors, però només mostrem
per pantalla.
Si té ’=’: el número de bytes és 2; assignem
,
decodifiquem segons els passos anteriors, però només mostrem
i
per pantalla.
L’entrada consisteix en diversos casos, a on cada cas és una seqüència de caràcters acabada en punt en una línia.
La sortida ha de ser una línia per a cada cas amb els bytes com a nombres naturals. Abans de cada byte, inclòs el primer, hi ha d’haver un espai.
Aquest problema té com a centres d’interès la correctesa i la llegibilitat. En particular, es valorarà que el programa utilitzi funcions per evitar repetició i separar les diverses tasques.
Si teniu la funció char_to_base64 i el Jutge us l’ha
acceptat, useu-la directament. Si no, copieu la següent definició, (i
afegiu #include <algorithm>):
int char_to_base64(char c) {
static char _syms[65] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
return std::find(_syms, _syms + 64, c) - _syms;
}Input
AAAA. AQEB. AgIC. ////. AA==. AAA=. AQ==. AQE=. ZGRkZA==. CgAUAB4=. ////AAAA.
Output
0 0 0 1 1 1 2 2 2 255 255 255 0 0 0 1 1 1 100 100 100 100 10 0 20 0 30 255 255 255 0 0 0
Input
LA==. Jg==. lg==. Sg==. 3Q==. Mg==. Rw==. Ng==. BQ==. TA==. og==.
Output
44 38 150 74 221 50 71 54 5 76 162
Input
9qE=. xpM=. b9M=. DUk=. CH0=. rPA=. kSk=. wV8=. bQg=. ZvY=.
Output
246 161 198 147 111 211 13 73 8 125 172 240 145 41 193 95 109 8 102 246
Input
u1Zi. q6nx. NJFe. tjy1. 1Bq2. /eRh. q0A/. 2K1L. ANVh. eg+n.
Output
187 86 98 171 169 241 52 145 94 182 60 181 212 26 182 253 228 97 171 64 63 216 173 75 0 213 97 122 15 167