(Aquest problema fa servir la funció
base64\_to\_char del problema "Codificar en Base64
(1)".)
Es tracta de fer un programa que, donada una seqüència de bytes a l’entrada (naturals entre 0 i 255), la codifiqui en base 64. La codificació funciona de la següent manera, i treballa amb tripletes de 3 bytes:
Primer, cada 3 bytes d’entrada , i , construïm un enter en base 256 de la següent manera:
Després, reinterpretem en base 64 i n’extraiem les xifres, que ara són 4: , , , i . El procés és totalment anàleg a extreure les xifres d’un nombre en base 10, però en base 64. El que estem fent és calcular els dígits de la fórmula següent:
(Cal recordar que el procés d’extracció de xifres treballat a PRO1 produeix les xifres al revés, és a dir, començant per .)
Per últim, usant la funció base64_to_char convertim
,
,
i
en caràcters i els mostrem a la sortida en aquest ordre.
Si la seqüència d’entrada no té un llargada múltiple de 3, just al final, tindrem un grup de només 1 o 2 bytes:
Si tenim un grup de 2 bytes: assignem
,
i seguim igualment els passos de la codificació. Un cop amb les xifres
,
canviem
pel caràcter ’=’.
Si tenim un grup d’1 byte: assignem
i
,
i seguim igualment els passos de la codificació. Un cop amb les xifres
,
canviem tant
com
pel caràcter ’=’.
L’entrada consisteix en diverses seqüències de bytes. Cadascuna comença amb un enter que indica el nombre de bytes que segueixen i després hi ha bytes, a on cadascún és només un nombre natural entre 0 i 255 (ambdós inclosos).
La sortida ha de ser una línia per a cada cas amb la codificació en base 64 de la seqüència de bytes de l’entrada, sense espais entre els caràcters.
Aquest problema té com a centre d’interès la correctesa i la llegibilitat. Sobre la llegibilitat, es valorarà que el programa utilitzi funcions per evitar repetició i separar les diverses tasques.
Si teniu la funció base64_to_char i el Jutge us l’ha
acceptat, useu-la directament. Si no, copieu la següent definició:
char base64_to_char(int d) {
static char _syms[65] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
return _syms[d];
}Input
3 0 0 0 3 1 1 1 3 2 2 2 3 255 255 255 1 0 2 0 0 1 1 2 1 1 4 100 100 100 100 5 10 0 20 0 30 6 255 255 255 0 0 0
Output
AAAA AQEB AgIC //// AA== AAA= AQ== AQE= ZGRkZA== CgAUAB4= ////AAAA
Input
1 44 1 38 1 150 1 74 1 221 1 50 1 71 1 54 1 5 1 76 1 162
Output
LA== Jg== lg== Sg== 3Q== Mg== Rw== Ng== BQ== TA== og==
Input
2 246 161 2 198 147 2 111 211 2 13 73 2 8 125 2 172 240 2 145 41 2 193 95 2 109 8 2 102 246
Output
9qE= xpM= b9M= DUk= CH0= rPA= kSk= wV8= bQg= ZvY=
Input
3 187 86 98 3 171 169 241 3 52 145 94 3 182 60 181 3 212 26 182 3 253 228 97 3 171 64 63 3 216 173 75 3 0 213 97 3 122 15 167
Output
u1Zi q6nx NJFe tjy1 1Bq2 /eRh q0A/ 2K1L ANVh eg+n