Estoy haciendo un programa que toma cualquier entero aleatorio, suma sus valores individuales y crea una suma. Si la longitud de la suma cuando se convierte a forma de cadena es mayor que 1, continuamos el proceso de sumar los valores enteros hasta llegar a una suma con 1 dígito.
Mi problema con el código es que mi salida esperada para números aleatorios con un valor de 1 dígito ya devolverá el número inmediatamente, si los números con dígitos mayores que 1 se suman a otro número mayor que 1 dígito, no repetirá el bucle sino estar atrapado en un bucle infinito.
let digitalRoot = (n) => { let stringNum = n.toString(); let refArr = []; let result = 0; let iterator = refArr.values(); while (stringNum.length > 1) { for (let i = 0; i < stringNum.length; i++) { let stringVal = stringNum[i]; stringVal = parseInt(stringVal); refArr.push(stringVal) } for (let number of iterator) { if (result !== number) { result = result + number; } else { result = result + number; } } result = result.toString(); if (result.length === 1) { result = parseInt(result); return result; } refArr = []; stringNum = result.toString(); } if (stringNum.length === 1) { stringNum = parseInt(stringNum); return stringNum; } } la salida esperada para 1455 , por ejemplo, debería ser 6 , porque 1 + 4 + 5 + 5 = 15 ; 1 + 5 = 6
ACTUALIZAR
Sé que mi código original en la pregunta era ineficiente, pero pude obtener el resultado deseado editando algunas cosas, primero estaba moviendo las variables refArr & iterator al ciclo while, restableciendo el resultado a 0 y algunas otras modificaciones. Obviamente, mi código es una solución muy, muy ineficiente y no se recomienda, pero quería corregir mi código como ejercicio, etc.
let digitalRoot = (n) => { let stringNum = n.toString(); let result = 0; while (stringNum.length > 1) { let refArr = []; let iterator = refArr.values(); for (let i = 0; i < stringNum.length; i++) { let stringVal = stringNum[i]; stringVal = parseInt(stringVal); refArr.push(stringVal) } for (let number of iterator) { if (result !== number) { result = result + number; } else { result = result + number; } } let tester = result.toString(); if (tester.length === 1) { tester = parseInt(tester); return tester; } stringNum = result.toString(); result = 0; refArr = []; } if (stringNum.length === 1) { stringNum = parseInt(stringNum); return stringNum; } }Usted puede hacer eso...
const digitalRoot = n => { while (n > 10) n = [...n.toString(10)].reduce((s,v)=>s + +v,0) return n } console.log( digitalRoot( 1455 ))algunos puntos...
.Encadenar()
n.toString(10) cambia 12546 a '12546'
sintaxis extendida (...)
...'123456' cambia '12546' a '1','2','3','4','5','6' (iteracional)
asi que
[...'123456'] hacer una matriz = [ '1','2','3','4','5','6' ]
Array.reduce()
y
+v Unario más (+) justo antes de una cadena es: como está escrito en el documento:
El operador unario más (+) precede a su operando y se evalúa como su operando pero intenta convertirlo en un número.
para explicar el método de reducción utilizado aquí:
[ '1','2','3','4','5','6' ].reduce((s,v) => s + +v , 0)
hacer:
step 0 s = 0, v = '1' -> 0 + +'1' = 0 + 1 = 1 step 1 s = 1, v = '2' -> 1 + +'2' = 1 + 2 = 3 step 2 s = 3, v = '3' -> 3 + +'3' = 3 + 3 = 6 step 3 s = 6, v = '4' -> 3 + +'4' = 6 + 4 = 10 step 4 s = 10, v = '5' -> 10 + +'5' = 10 + 5 = 15 step 5 return 15¿Qué pasa si n es negativo? Supongamos que n >= 0 para esto. Realmente no está claro por qué tiene 2 bucles, y el segundo tiene una prueba para algo pero hace lo mismo independientemente.
"15" + 1 = "151" mientras que 15 + 1 = 16Una versión simplificada:
let digitalRoot = (n) => { while (n >= 10) { // convert to decimal let stringNum = n.toString(); let result = 0 for (let i = 0; i < stringNum.length; i++) { result += parseInt(stringNum[i]); } n = result } return n }Una forma mucho más simple sería usar reduce() , esta función superior itera sobre una matriz de valores y reduce la cantidad de esos valores con cada iteración mientras calcula el valor anterior acumulado con el siguiente valor en la matriz.
Divida la cadena en una matriz, luego vuelva a asignarla a un número y reduzca la adición del acumulador al valor devuelto en cada iteración.
const num = 1455; const num2 = 35714; const num3 = 11211; const sumUp = (num) => { return String(num).split('').map(Number).reduce((a, c) => a + c); } console.log(sumUp(num), sumUp(num2), sumUp(num3))