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')