Interview question of the week #444
Se você gosta de desafios de lógica e algoritmos para aquecer os motores durante a semana, provavelmente conhece a newsletter da Cassidoo, onde toda semana ela envia uma questão de entrevista técnica.
Nesse meu repositório é possível encontrar as minhas soluções dos desafios anteriores:ebdonato/cassidoo-questions
Questão da semana
A proposta é escrever uma função que receba uma grade 2D de números e um fator de zoom k \ge 2. O objetivo é transformar cada célula original em um bloco de tamanho k \times k com o mesmo valor, retornando a grade expandida.
Exemplo
zoom([[1, 2], [3, 4]], 2)
// Resultado:
// [
// [1, 1, 2, 2],
// [1, 1, 2, 2],
// [3, 3, 4, 4],
// [3, 3, 4, 4]
// ]
zoom([[7, 8, 9]], 3)
// Resultado:
// [
// [7, 7, 7, 8, 8, 8, 9, 9, 9],
// [7, 7, 7, 8, 8, 8, 9, 9, 9],
// [7, 7, 7, 8, 8, 8, 9, 9, 9]
// ]
Minha solução
/**
* Zooms in on a 2D array by repeating each element k times both horizontally and vertically.
* @template T - The type of elements in the array
* @param arr - A 2D array to zoom in on
* @param k - The zoom factor (must be >= 2). Each element will be repeated k times in both dimensions
* @returns A new 2D array with each element repeated k times horizontally and vertically
* @throws {Error} If k is less than 2
* @example
* zoom([[1, 2], [3, 4]], 2)
* // Returns: [[1, 1, 2, 2], [1, 1, 2, 2], [3, 3, 4, 4], [3, 3, 4, 4]]
*/
export function zoom<T>(arr: T[][], k: number): T[][] {
if (k < 2) throw new Error("k must be greater than or equal to 2");
return arr.flatMap((row) =>
Array.from({ length: k }, () => row.flatMap((item) => Array(k).fill(item))),
);
}