1487 - Decodificare

De la Universitas MediaWiki

Cerința

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

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

Fișierul de ieșire decodificare.out va conține pe prima linie şirul decodificat.

Restricții și precizări

  • 1 ≤ n ≤ 3000
  • Recomandare: pentru tablourile de dimensiuni mari, folosiţi variabile globale.

Exemplu:

decodificare.in

8
TPQAREDSXMRYIUVE

decodificare.out

ADMITERE

Explicație

Matricea de codificare este

T P Q A
R E D S
X M R Y
I U V E

Încărcare soluție

Lipește codul aici

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);

});