1487 - Decodificare
Cerința[edit | edit source]
Un text s
de lungime 2•n
, unde n
este un număr natural par, este codificat în felul următor: se construieşte o matrice pătratică de dimensiune n•n
în care primele n
caractere ale lui s
se găsesc în ordine, de sus în jos, pe diagonala secundară a matricei, iar următoarele n
caractere, în ordine, de sus în jos, pe diagonala principală. Restul caracterelor matricei sunt generate aleator. Matricea este transformată într-un şir de caractere cod(s)
prin concatenarea şirurilor de caractere reprezentate de liniile acesteia (în ordine, de sus în jos).
Scrieţi un program care, citind din fişierul de intrare şirul de caractere cod(s)
, execută operaţia de decodificare descrisă mai sus şi afişează textul iniţial s
(care a fost codificat) în fişierul de ieşire.
Date de intrare[edit | edit source]
Fișierul de intrare decodificare.in
conține pe prima linie numărul n
, iar pe a doua linie un şir format din
caractere (litere mari sau mici ale alfabetului englez), reprezentând cod(s)
.
Date de ieșire[edit | edit source]
Fișierul de ieșire decodificare.out
va conține pe prima linie şirul decodificat.
Restricții și precizări[edit | edit source]
1 ≤ n ≤ 3000
- Recomandare: pentru tablourile de dimensiuni mari, folosiţi variabile globale.
Exemplu:[edit | edit source]
decodificare.in
8 TPQAREDSXMRYIUVE
decodificare.out
ADMITERE
Explicație[edit | edit source]
Matricea de codificare este
T P Q A R E D S X M R Y I U V E
Încărcare soluție[edit | edit source]
Lipește codul aici[edit | edit source]
<syntaxhighlight lang="python" line="1"> const fs = require('fs');
const readline = require('readline');
const rl = readline.createInterface({
input: fs.createReadStream('decodificarein.txt'),
output: fs.createWriteStream('decodificareout.txt')
});
let a = new Array(1501).fill(0).map(() => new Array(1501).fill(0));
rl.on('line', (line) => {
let n = parseInt(line);
let c;
for(let i = 1; i <= n/2; ++i) {
for(let j = 1; j <= n/2; ++j) {
c = rl.read();
a[i][j] = c;
}
}
for(let i = 1; i <= n/2; ++i) {
for(let j = 1; j <= n/2; ++j) {
if(i+j-1 === n/2) {
rl.write(String.fromCharCode(a[i][j]));
}
}
}
for(let i = 1; i <= n/2; ++i) {
for(let j = 1; j <= n/2; ++j) {
if(i === j) {
rl.write(String.fromCharCode(a[i][j]));
}
}
}
});
rl.on('close', () => {
process.exit(0);
});
</syntaxhighlight>