• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
    • Preguntas
    • Profesores
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Pruebas Online
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

184
Vistas
Escribiendo una función de calculadora - en la forma de programación más funcional (javascript)

Estoy probando una tarea de codewars y quería escribir de forma funcional en javascript. Tengo algunas preguntas con respecto a mis funciones y cómo se puede escribir el código de una mejor manera.

La tarea en sí es construir una función de calculadora. Aceptará una entrada en el formato:

 '..... + ...'

La calculadora debe dividir la cadena por el carácter del medio que significa la operación y luego las dos cadenas que quedan serán los dos valores. En el ejemplo anterior, el primer valor será 5 y el segundo 3. Una vez hecho esto, según el operador, realice la acción, ya sea suma, multiplicación, etc.

Aquí está mi código:

 function dotCalculator(equation) { function returnSymbol(input) { if (input.includes(' + ')) { return ' + '; } else if (input.includes(' - ')) { return ' - '; } else if (input.includes(' * ')) { return ' * '; } else if (input.includes(' / ')) { return ' / '; } } let symbolOf = returnSymbol; let result = equation.split(symbolOf(equation)).map(x => x.length); // Array.prototype.add = function(){ // return this[0] + this[1]; // } }

Sé que mi código aún no está terminado. Estoy tratando de entender cómo terminarlo correctamente teniendo en mente la forma de pensar de la programación funcional. Tal vez la herencia prototípica sería un poco exagerada. Estoy buscando algunas ideas de cualquiera que pueda echar una mano. Intenté escribir una reducción más compleja después

 let arrMine = equation.split(symbolOf(equation)).map((x) => x.length);

pero parecía demasiado desordenado. Cualquier ayuda sería muy apreciada.

almost 3 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Soy un novato en programación funcional, la función de tubería que está aquí es probablemente un poco gratuita y podría haber tomado el ejemplo ..... + ... demasiado literalmente, pero aquí hay un intento:

 const arith = { '+': (a, b) => a + b, '-': (a, b) => a - b, '*': (a, b) => a * b, '/': (a, b) => a / b, }; const pipe = (...fns) => (arg) => fns.reduce((res, fn) => fn(res), arg); const get_input_elements = (input) => input.split(' '); const get_number = (dots) => dots.length; const get_numbers = ([str_a, op, str_b]) => [get_number(str_a), op, get_number(str_b)]; const apply_arith = ([a, op, b]) => arith[op](a, b); const calc = pipe( get_input_elements, get_numbers, apply_arith ); console.log(calc('..... + ...')); console.log(calc('..... - ...')); console.log(calc('...... / ..'));

almost 3 years ago · Juan Pablo Isaza Denunciar

0

En este ejemplo hay programas funcionales que pueden evaluar aritmética simple: sumar, restar, multiplicar o dividir dos números.

Los detalles se comentan en el ejemplo a continuación.
Nota: prefije cualquier número negativo que se pase a calc() con un guión bajo _ en lugar de un guión -

 // Utility function const log = data => console.log(JSON.stringify(data)); // Arithmetic functions const sum = (a, b) => (+a) + (+b); const dif = (a, b) => a - b; const pro = (a, b) => a * b; const quo = (a, b) => a / b; /** * Calculate a simple formula a+b, ab, a*b, or a/b. * @param {string} formula - Pattern: * "numberOPERANDnumber" ex. "5+5" * Use an underscore to prefix negative numbers. * @returns {number} Result of formula */ const calc = formula => { // Declare variables let result, f, a, b, op; /* Convert string into an array of strings. [number, operand, number] Replace any _ with - (see @param) */ f = formula.split(/([+\-*/])/) .map(ab => ab.replace('_', '-')); /* Convert string of numbers into real numbers. */ a = parseFloat(f[0]); b = parseFloat(f[2]); op = f[1]; /* Check if >a< and >b< are real numbers and if the input string was split into 3 strings. */ if (Number.isNaN(a) || Number.isNaN(b) || f.length != 3) { return; } // >op< determines the method of resolving the formula switch (op) { case '+': result = sum(a, b); break; case '-': result = dif(a, b); break; case '*': result = pro(a, b); break; case '/': result = quo(a, b); break; default: return; } return result; }; log(calc('5+5')); log(calc('_10-7')); // That's a -10 (see @param) log(calc('5*9')); log(calc('51/3'));

almost 3 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda