Dia 18: Buscar en la agenda mágica

Santa Claus tiene una agenda mágica 📇 donde guarda las direcciones de los niños para entregar los regalos. El problema: la información de la agenda está mezclada y malformateada. Las líneas contienen un número de teléfono mágico, el nombre de un niño y su dirección, pero todo está rodeado de caracteres extraños.

Santa necesita tu ayuda para encontrar información específica de la agenda. Escribe una función que, dado el contenido de la agenda y un número de teléfono, devuelva el nombre del niño y su dirección.

Ten en cuenta que en la agenda:

Los números de teléfono están formateados como +X-YYY-YYY-YYY (donde X es uno o dos dígitos, e Y es un dígito).
El nombre de cada niño está siempre entre < y >

La idea es que escribas una funcióna que, pasándole el teléfono completo o una parte, devuelva el nombre y dirección del niño. Si no encuentra nada o hay más de un resultado, debes devolver null.

const agenda = `+34-600-123-456 Calle Gran Via 12 <Juan Perez>
Plaza Mayor 45 Madrid 28013 <Maria Gomez> +34-600-987-654
<Carlos Ruiz> +1-800-555-0199 Fifth Ave New York`

findInAgenda(agenda, '34-600-123-456')
// { name: "Juan Perez", address: "Calle Gran Via 12" }

findInAgenda(agenda, '600-987')
// { name: "Maria Gomez", address: "Plaza Mayor 45 Madrid 28013" }

findInAgenda(agenda, '111')
// null
// Explicación: No hay resultados

findInAgenda(agenda, '1')
// null
// Explicación: Demasiados resultados

Solution

function findInAgenda(agenda, phone) {
  const entries = agenda.split('\n').map((line) => {
    const phoneMatch = line.match(/\+\d{1,2}-\d{3}-\d{3}-\d{3}/)
    const phone = phoneMatch ? phoneMatch[0] : ''
    const nameMatch = line.match(/<([^>]+)>/)
    const name = nameMatch ? nameMatch[1] : ''

    // regex asked to ai
    let address = line
      .replace(/\+\d{1,2}-\d{3}-\d{3}-\d{3}/, '')
      .replace(/<[^>]+>/, '')
      .trim()

    return { phone, name, address }
  })

  const matches = entries.filter(entry =>
    entry.phone.includes(phone)
  )

  if (matches.length !== 1) return null

  return {
    name: matches[0].name,
    address: matches[0].address
  }
}

// pending optimization

findInAgenda(`+1-541-754-3010 156 Alphand_St. <J Steeve>
  +1-541-914-3010 156 Alphand_St. <Peter Reedgrave>
  +1-541-984-3012 156 Alphand_St. <Anastasia>
  +1-541-984-3012 156 Alphand_St. <P Salinger>
  +1-541-914-3010 156 Alphand_St. <P Salinger>`, '+1-541-984-3012')