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.

Facebooktwitterredditlinkedinby feather

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>