You are given 3 parameters: int U, int L, and array C containing n ints. Find a matrix with 2 rows and n columns where:
– Each element is either 1 or 0.
– The sum of ints in the upper row is U.
– The sum of ints in the lower row is L.
– C is an array of ints of length n, where the sum of ints in k-th column is C[k].
Convert each matching matrix to a comma separated string and return them in an array. If there is no match, return “IMPOSSIBLE”.
For example, given:
U = 2 L = 2 C = [2, 0, 2, 0]
Its only valid matrix and result is:
1 0 1 0 1 0 1 0 [ "1010,1010" ]
To solve, simply increment through ints, convert them to binary arrays, and compare sums. Since C is of length n, the range of numbers to check is 0 to 2^n – 1.
function solution(U, L, C) { const max = Math.pow(2, C.length) const matches = [] for (let upper = 0; upper < max; upper++) { let upperArray = intToBinaryArray(upper, C.length) if (!isBitSumEqual(upperArray, U)) continue for (let lower = 0; lower < max; lower++) { let lowerArray = intToBinaryArray(lower, C.length) if (!isBitSumEqual(lowerArray, L)) continue if (isMatch(upperArray, lowerArray, U, L, C)) matches.push(${upperArray.join("")},${lowerArray.join("")}
) } } if (matches.length > 0) return matches return "IMPOSSIBLE" } function isMatch(upperArray, lowerArray, U, L, C) { for (let i = 0; i < C.length; i++) { let u = upperArray[i] let l = lowerArray[i] let c = C[i] if (u + l != c) return false } if (!isBitSumEqual(upperArray, U)) return false if (!isBitSumEqual(lowerArray, L)) return false return true } function isBitSumEqual(array, sum) { let total = 0 for (let i = 0; i < array.length; i++) { total += array[i] } return (total == sum) } function intToBinaryArray(n, length) { let binary = n.toString(2) let binaryPadded = binary.padStart(length, '0') let binStringArray = binaryPadded.split("") let binIntArray = binStringArray.map(Number) return binIntArray } let U = 2 let L = 2 let C = [2,0,2,0] console.log(U: ${U} L: ${L} C: ${C}
) let result = solution(U, L, C) console.log(result) U = 3 L = 2 C = [2,1,1,0,1] console.log(U: ${U} L: ${L} C: ${C}
) result = solution(U, L, C) console.log(result) U: 2 L: 2 C: 2,0,2,0 [ '1010,1010' ] U: 3 L: 2 C: 2,1,1,0,1 [ '10101,11000', '11001,10100', '11100,10001' ]