Think Big Challenge – Solución al desafío «214089142012»
El 2 de mayo lanzamos en nuestro canal de Facebook, nuestro primer Think Big Challenge. En esta ocasión, el desafío se llamó «214089142012» y muchos participaron y enviaron sus respuestas.
El Desafio original era:
Cuando alguien tiene que leer un número largo como un RUT, 214089142012, usualmente no lo lee como un solo número, sino que agrupa dígitos («veintiuno cuarenta ochenta y nueve ciento cuarenta y dos cero doce»). El problema es que puede haber ambigüedad en la interpretación: «veintiuno cuatrocientos ocho novecientos catorce doscientos uno dos» podría ser 214008900142012, o 21408900142012, o 214089001420012, etc.
PROBLEMA: dada una descripción textual de un número, y sabiendo que el número descripto tiene N cifras (en el caso de un RUT, 12), hallar todas las interpretaciones válidas, de la longitud correcta.
SOLUCION:
A continuación, les dejamos una de las posibles soluciones:
/*
Todo lo siguiente son datos que se usarán en la búsqueda
Son, básicamente, nombres de números (de 1, 2, y 3 cifras) en castellano
*/
const UNA_CIFRA_ACOMP = {
UNO: 1,
DOS: 2,
TRES: 3,
CUATRO: 4,
CINCO: 5,
SEIS: 6,
SIETE: 7,
OCHO: 8,
NUEVE: 9
};
const UNA_CIFRA_SOLA = Object.assign({}, { CERO: 0 }, UNA_CIFRA_ACOMP);
const DOS_CIFRAS = {
ONCE: 11,
DOCE: 12,
TRECE: 13,
CATORCE: 14,
QUINCE: 15,
DIECISEIS: 16,
DIECISIETE: 17,
DIECIOCHO: 18,
DIECINUEVE: 19,
VEINTE: 20,
VEINTIUNO: 21,
VEINTIDOS: 22,
VEINTITRES: 23,
VEINTICUATRO: 24,
VEINTICINCO: 25,
VEINTISEIS: 26,
VEINTISIETE: 27,
VEINTIOCHO: 28,
VEINTINUEVE: 29
};
const DECENAS = {
TREINTA: 30,
CUARENTA: 40,
CINCUENTA: 50,
SESENTA: 60,
SETENTA: 70,
OCHENTA: 80,
NOVENTA: 90
};
DOS_CIFRAS[‘DIEZ’] = 10;
DOS_CIFRAS[‘VEINTE’] = 20;
Object.keys(DECENAS).forEach(d => {
DOS_CIFRAS[d] = DECENAS[d];
});
Object.keys(DECENAS).forEach(d => {
Object.keys(UNA_CIFRA_ACOMP).forEach(u => {
DOS_CIFRAS[d + ‘ Y ‘ + u] = DECENAS[d] + UNA_CIFRA_ACOMP[u];
});
});
const CENTENAS = {
CIENTO: 100,
DOSCIENTOS: 200,
TRESCIENTOS: 300,
CUATROCIENTOS: 400,
QUINIENTOS: 500,
SEISCIENTOS: 600,
SETECIENTOS: 700,
OCHOCIENTOS: 800,
NOVECIENTOS: 900
};
const TRES_CIFRAS = {
CIEN: 100
};
const UNA_Y_DOS = Object.assign({}, UNA_CIFRA_ACOMP, DOS_CIFRAS);
TRES_CIFRAS[‘CIEN’] = 100;
Object.keys(CENTENAS).forEach(c => {
TRES_CIFRAS[c] = CENTENAS[c];
Object.keys(UNA_Y_DOS).forEach((u, uv, ua) => {
TRES_CIFRAS[c + ‘ ‘ + u] = CENTENAS[c] + UNA_Y_DOS[u];
});
});
delete TRES_CIFRAS[‘CIENTO’];
const NUMEROS = Object.assign({}, UNA_CIFRA_SOLA, DOS_CIFRAS, TRES_CIFRAS);
/*
Todo lo anterior es inicializacion…
Ahora viene la rutina de búsqueda en sí
La solución provista busca números de una, dos, o tres cifras
No maneja «mil» o «millones»: queda como ejercicio para el lector!
*/
const resolverNumero = (texto, numeroGenerado, soluciones) => {
if (!texto.length) {
return [numeroGenerado];
} else {
Object.keys(NUMEROS).forEach(n => {
if ((texto + » «).startsWith(n + » «)) {
let ss = resolverNumero(texto.replace(n,»»).trimLeft(), numeroGenerado + «» + NUMEROS[n], soluciones);
soluciones = soluciones.concat(ss);
}
});
return [ … new Set(soluciones)];
}
};
/*
Un ejemplo de prueba
*/
const NUMERO = «TRESCIENTOS OCHENTA Y SIETE DOS DOSCIENTOS DIECIOCHO CUARENTA Y CUATRO UNO QUINIENTOS CINCUENTA Y CINCO»;
const EXPECTED_LENGTH = 15;
const respuestas = resolverNumero(NUMERO, «», []);
console.log(«Respuestas:», respuestas.filter(x => x.length===EXPECTED_LENGTH));
console.log(«Rechazadas:», respuestas.filter(x => x.length!==EXPECTED_LENGTH));
/*
Respuestas: (3) [«300872218441555», «387220018441555», «387221844150055»]
Rechazadas: (5) [«3008722001844150055», «30087220018441555», «30087221844150055», «38722001844150055», «3872218441555»]
*/
Gracias por su interés en nuestros desafíos. Seguí atento que vendrán más.




