Advent JS 2021 - Dias 11 a 15

Día 11: “¿Vale la pena la tarjeta de fidelidad?"

Dificultad: Normal

Este era el típico ejercicio que se podría resolver por iteraciones hasta conocer el porque no merecía la pena la tarjeta. Pero lo realmente interesante era darse cuenta que este tipo de ejercicios se pueden resolver de forma matemática y con una única operación.

La clave estaba en darse cuenta que queremos calcular el máximo valor de una serie geométrica por en el cual el coste de comprar tickets es mayor que la compra de una tarjeta:

const TICKET = 12;
const CARD = 250;
const FACTOR = 0.75;

// Sn = a(1-(r^n+1))/(1-r)
return TICKET * times > CARD + TICKET * FACTOR * (1-FACTOR**(times+1)) / (1-FACTOR)

Día 12: “La ruta perfecta para dejar los regalos”

Dificultad: Difícil

Posiblemente uno de los ejercicios más difíciles de todo el Advent.

El algoritmo básicamente detecta los valores de entrada, calcula el máximo y finalmente itera para verificar que no se cae en ningun obstaculo.

Lo que me gustaría destacar de este día es el método Array.from, el cual es super útil cuando queremos generar arrays de forma limpia y sencilla.

Array.from({ length: max }).fill(0).reduce(...)

Día 13: “Envuelve regalos con asteriscos”

Dificultad: Fácil

Ejercicio sencillo con el que podremos usar los métodos push y unshift para añadir elementos a un array en su inicio o en su final.

Día 14: “En busca del reno perdido”

Dificultad: Normal

Este ejercicio pese a no tener una dificultad alta fue uno de los más trickies ya que si no estabas al tanto de como funcionaba el metodo sort en Javascript ibas a tener un problema.

Y es que este método convierte los elementos a string, lo que implica que 10 ira antes que 2, SORPRESA!

[1, 2, 10].sort() // [1, 10, 2]

Día 15: “El salto perfecto”

Dificultad: Normal

El quiz del ejercicio estaba en detectar el valor máximo para saber su índice y jugar con él.

Mirando desde la primera posición hasta ese índice para validar que los números van creciendo y también que del valor hasta el final del array estos decrecen.

for (let i = 0; i < indexOfMax; i++) {
    if (heights[i] >= heights[i + 1]) {
      return false;
    }
  }

  for (let i = indexOfMax; i < heights.length; i++) {
    if (heights[i] <= heights[i + 1]) {
      return false;
    }
  }

…Continua aquí