Dia 4: Descifrar el PIN de Santa

Los elfos han encontrado el código cifrado que protege la puerta del taller de Santa 🔐. El PIN tiene 4 dígitos, y está escondido dentro de bloques como estos:

[1++][2-][3+][<] Escribe una función que descifre el PIN a partir del código.

El código está formado por bloques entre corchetes […] y cada bloque genera un dígito del PIN.

Un bloque normal tiene la forma [nOP…], donde n es un número (0-9) y después puede haber una lista de operaciones (opcionales).

Las operaciones se aplican en orden al número y son:

También existe el bloque especial [<], que repite el dígito del bloque anterior.

Si al final hay menos de 4 dígitos, se debe devolver null.

🧩 Ejemplos

decodeSantaPin('[1++][2-][3+][<]')
// "3144"

decodeSantaPin('[9+][0-][4][<]')
// "0944"

decodeSantaPin('[1+][2-]')
// null (solo 2 dígitos)

Solution

/**
 * @param {string} code - The code to decipher
 * @returns {string} The deciphered PIN
 */
function decodeSantaPin(code: string): string | null {
  if (!code || code.length <= 2) return null

  const code_array = code.match(/[^[\]]+/g)
  if (!code_array || code_array.length < 4) return null

  let lock = ''

  for (const fragment of code_array) {
    if (fragment === '<') {
      if (lock.length === 0) return null
      lock += lock[lock.length - 1]
      continue
    }

    let number = parseInt(fragment[0])
    if (isNaN(number)) return null

    for (let i = 1; i < fragment.length; i++) {
      if (fragment[i] === '+') {
        number = (number + 1) % 10
      } else if (fragment[i] === '-') {
        number = (number - 1 + 10) % 10
      }
    }

    lock += number.toString()
  }

  return lock.length === 4 ? lock : null
}

decodeSantaPin('[1+][2+][3+][4+]')