const EAST_CAR = 0
const WEST_CAR = 1
function solution(A) {
const computations = A.reduce((acc, car) => {
let { cars, pairs, state } = acc
if (pairs === -1 || pairs > 1000000000) {
return { pairs: -1 }
}
switch (state) {
case 'initial':
if (car === EAST_CAR) {
return { ...acc, cars: ++cars, state: 'east' }
} else {
return acc
}
case 'east':
if (car === EAST_CAR) {
return { ...acc, cars: ++cars }
} else {
return { ...acc, pairs: pairs + cars, state: 'west' }
}
case 'west':
if (car === WEST_CAR) {
return { ...acc, pairs: pairs + cars }
} else {
return { ...acc, cars: ++cars, state: 'east' }
}
}
}, { cars: 0, pairs: 0, state: 'initial' })
return computations.pairs
}
const FACTORS = {
A: 1,
C: 2,
G: 3,
T: 4
}
function solution(S, P, Q) {
const prefixSums = [...S].reduce((acc, s, idx) => {
acc.A[idx + 1] = acc.A[idx] || 0
acc.C[idx + 1] = acc.C[idx] || 0
acc.G[idx + 1] = acc.G[idx] || 0
if (['A', 'C', 'G'].includes(s)) {
acc[s][idx + 1]++
}
return acc
}, { A: [0], C: [0], G: [0] })
return P.reduce((result, p, idx) => {
const q = Q[idx]
const nucleotide = ['A', 'C', 'G'].find(s => (prefixSums[s][q + 1] - prefixSums[s][p]) > 0)
result[idx] = nucleotide ? FACTORS[nucleotide] : FACTORS.T
return result
}, [])
}
// THIS SOLUTION PASSES THE TESTS ONLY
function solution(A) {
let result = 0
let minAvg = Number.MAX_VALUE
for (let i = 0; i < A.length - 1; i++) {
const avg2 = (A[i] + A[i + 1]) / 2
const avg3 = i === A.length - 2 ? avg2 : (A[i] + A[i + 1] + A[i + 2]) / 3
const avg = Math.min(avg2, avg3)
if (avg < minAvg) {
minAvg = avg
result = i
}
}
return result
}
function solution(A, B, K) {
const delta = B - A
const offset = A % K
if (offset === 0) {
return Math.floor(delta / K) + 1
}
return Math.floor((delta + offset) / K)
}