Se le asigna un número inicial y final y el número máximo de elementos de salida permitidos. ¿Cómo crearía una matriz de salida con una distribución lo más uniforme posible, sin dejar de incluir el primer y el último punto en la salida?
function generatePoints(startingNumber, endingNumber, maxPoints) {}
generatePoints(0, 8, 5) // [0, 2, 4, 6, 8]
function generatePoints(startingNumber, endingNumber, maxPoints) { const interval = Math.round((endingNumber - startingNumber) / maxPoints) let count = 0 let counter = 0 let points = [] while(count < maxPoints - 1) { points.push(counter) counter+=interval count++ } points.push(endingNumber) return points }Técnicamente, esto crea el resultado correcto para el caso simple, pero se queda corto cuando se compara con la mayoría de los otros casos extremos debido al hecho de que detengo una iteración antes y luego agrego el punto final. Estoy pensando que la mejor manera de hacer esto (para crear una mejor distribución) es construir desde el centro de la matriz hacia afuera, en lugar de construir desde el inicio de la matriz y luego detener un elemento temprano y agregar el número final.
Tenga en cuenta esto:
0 2 4 6 8 +-----+ +-----+ +-----+ +-----+ ABCD Al dividir nuestro rango en intervalos con 5 puntos, incluidos los puntos finales, tenemos solo cuatro intervalos. Siempre será uno menos que el número de puntos. Podemos dividir nuestro rango de manera uniforme en estos rangos más pequeños, simplemente agregando continuamente el ancho de un intervalo, que es solo (endingNumber - startingNumber) / (maxPoints - 1) . Podemos hacerlo así:
const generatePoints = (startingNumber, endingNumber, maxPoints) => Array .from ( {length: maxPoints}, (_, i) => startingNumber + i * (endingNumber - startingNumber) / (maxPoints - 1) ) console .log (generatePoints (0, 8, 5))Simplemente construimos una matriz de la longitud correcta, usando el parámetro de índice para contar la cantidad de intervalos más pequeños que estamos usando.
No verificamos errores aquí, y si maxPoints fuera solo 1 , podríamos tener un problema. Pero eso es bastante fácil de manejar como quieras.
Pero hay una preocupación aquí. ¿Por qué el parámetro se llama maxPoints en lugar de points ? Si el número de puntos permitidos es variable, creo que necesitamos más requisitos.
No Math.round(interval) . En cambio Math.round(counter) en ese último momento.
La razón es que si ha agregado k intervalos, el error en lo que está haciendo puede ser de hasta 0.5*k . Pero si redondeas en el último minuto, el error nunca es mayor a 0.5 .