No internet connection
  1. Home
  2. Exercícios do Beecrowd

Pessoal estou com dificuldade no exercício 1534

Por Denise Schirmer @deniseschirmer
    2023-10-28 09:47:52.288Z

    const readline = require('readline');

    const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
    });

    function printBidimensionalArray(N) {
    const array = new Array(N);

    for (let i = 0; i < N; i++) {
    array[i] = new Array(N);
    }

    for (let i = 0; i < N; i++) {
    for (let j = 0; j < N; j++) {
    if (i === j) {
    array[i][j] = 1;
    } else {
    array[i][j] = 3;
    }
    }
    }

    for (let i = 0; i < N; i++) {
    for (let j = 0; j < N; j++) {
    process.stdout.write(array[i][j].toString());
    }
    console.log();
    }
    }

    rl.on('line', (input) => {
    const N = parseInt(input);

    if (!isNaN(N)) {
    printBidimensionalArray(N);
    }
    });

    O que estou fazendo de errado?

    Resolvido no post #2, clique para visualizar
    • 5 respostas
    1. Julio @Julio
        2023-10-28 18:38:44.164Z2023-10-28 18:47:04.393Z

        Não entendi muito bem partes do seu código, tipo, porque exatamente esta importando a lib 'readline' ?

        De qualquer maneira, a dica que posso te passar sobre essa atividade é que todo array inicialmente começa com com o numero 1, é preenchido no meio com números 3 e termina com 2.
        Ex:

        ---- / ----

        Quando a entrada é o numero 4:
        1332

        Quando a entrada é o numero 7
        1333332

        ---- / ----

        E ao passar as iterações o numero 1 da um passo para a direita do array, e o numero 2 da um passo para a esqueda do array.
        Ou seja, o seu index atual é sempre o index anterior + 1 , no caso do numero 1;
        E no caso do numero 2, index atual é sempre o index anterior - 1;

        Há um caso especial quando a entrada é um numero impar, em que, na iteração (n/2) + 1, o número 1 não está no array, e tu tem que tratar essa ocasião.

        Vou deixar aqui a minha solução, caso queira usar como base:

        .
        .
        .
        .
        .

        let N = parseInt(lines.shift())
        
        while(!isNaN(N)){      // Enquanto o N for um número válido 
        
            let newArr = []
        
            for(let i = 1 ; i < N-1 ; i++){    // Preenchendo o array com numeros 3, da posição 1 até a N-1
                newArr.push(3)
            }
        
            newArr.unshift(1)   // Atribuindo 1 na primeira posição
            newArr.push(2)      // Atribuindo 2 na ultima posição
        
            console.log(newArr.join(''))     // Realizando o primeiro print na saida, exigido pelo beecrowd
        
            for(let i = 1 ; i < N ; i++){
                let index1 = newArr.indexOf(1)    // Pegando o index anterior do 1
                let index2 = newArr.indexOf(2)    // Pegando o index anterior do 2 
        
                if(index1 === -1){      // Tratando caso especial quando o numero 1 nao esta no array ---> N é numero impar
                    index1 = index2
                }
                newArr[index1] = 3          // Colocando o 3 na posição anterior do 1
                newArr[index2] = 3          // Colocando o 3 na posição anterior do 2
                newArr[index1 + 1] = 1   // Movendo o 1 para a direita
                newArr[index2 - 1] = 2    // Movendo o 2 para a esquerda
        
                console.log(newArr.join(''))     // Imprimindo na tela o array atual
            }
        
            N = parseInt(lines.shift())
        }
        
        
        1. Estava com dúvidas nesta questão também. Obrigado pela explicação do código, ajudou muito.

          1. Em resposta aJulio:
            Denise Schirmer @deniseschirmer
              2023-10-29 11:51:07.913Z

              Muito obrigada.

              1. Em resposta aJulio:
                Hilton Rodrigo Mota @hrodrigomota
                  2023-11-02 23:28:42.126Z

                  Valeu pela explicação, Julio. Havia entendido a lógica de movimentação dos números, porém estava me atrapalhando no código.
                  Ajudou bastante. Obrigado!

                • Em resposta adeniseschirmer:
                  Miti @Mitisuaki
                    2023-11-03 21:41:32.979Z

                    Oi, então, essa questão é chatinha até você encontrar a lógica sobre ela.
                    Basicamente a ideia é que você terá 2 linhas diagonais, uma com 1 e outra com 2 apenas. Quanto aos outros valores todos serão 3.

                    A minha ideia foi basicamente verificar se a linha for igual a coluna ele será = a 1, ja se o tamanho da matriz -1 (pois irei considerar o indice) for igual a coluna ele será 2, mas esse segundo valor terá de ser subtraido para cada linha, assim começando com tamanho da coluna -1, e subtraindo -1 toda linha.
                    Com isso meu código ficou asim:

                    var input = require('fs').readFileSync('/dev/stdin', 'utf8');
                    var lines = input.trim().split('\n');
                    
                    let matrizSize = +lines.shift();
                    
                    while (!isNaN(matrizSize)) {
                        for (let i = 0, x = matrizSize - 1; i < matrizSize; i++, x--) {
                            let row = "";
                            for (let j = 0; j < matrizSize; j++) {
                                let n = 3;
                    
                                if (i === j) n = 1;
                                if (j === x) n = 2;
                    
                                row += n;
                            }
                            console.log(row);
                        }
                        matrizSize = +lines.shift();
                    }