(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 c1, c2, c3 i c4, els transformem en els seus dígits corresponents. d1, d2, d3, d4, usant la funció
char_to_base64.
| x = ((d1 · 64 + d2) · 64 + d3) · 64 + d4 |
| x = (B1 · 256 + B2) · 256 + B3 |
(Cal recordar que el procés d’extracció de les xifres treballat a PRO1 produeix les xifres al revés, començant per B3)
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:
==’: el número de bytes serà 1; assignem d3 = 0 i d4 = 0, decodifiquem segons els passos anteriors, però només mostrem B1 per pantalla.
=’: el número de bytes és 2; assignem d4 = 0, decodifiquem segons els passos anteriors, però només mostrem B1 i B2 per pantalla.
Entrada
L’entrada consisteix en diversos casos, a on cada cas és una seqüència de caràcters acabada en punt en una línia.
Sortida
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.
Observació
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.
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