Veo que tu lógica para intentar no comprobar directamente si el número es divisible por 6
está bien, estás comprobando si el último número es divisible entre 2
y si la suma de todos los dígitos es divisible entre 3
(quizás este es el propósito del ejercicio)
El problema que tienes intentando comprobar si los números son divisibles por 6
es que estás trabajando con números verdaderamente grandes que sobrepasan el número más grande con el que JavaScript
puede trabajar de manera segura, por lo que el resultado de cualquier cálculo que hagas con esos números va a estar representado en notación exponencial aparte de que no tendrías la seguridad de que el resultado sea correcto:
const num = 123456789012345678901234567800;
console.log( num > Number.MAX_SAFE_INTEGER );
// Resultados
console.log(num);
console.log( num === num + 5 );
console.log( num % 6 === 0 );
Como bien te recomendó @ordago, lo mejor es trabajar con algún método que trabaje con números de este tamaño de manera segura. El estándar ya cuenta con bigInt, pero su compatibilidad es muy baja todavía. Lo mejor es usar alguna librería que trate los números como cadenas. Normalmente en HackerRank es posible incluir en el código la librería big-number para manejar números grandes en JavaScript
(no sé si en CodeWars esté disponible, pero si no lo está, tu solución es la correcta siempre que la suma de los dígitos no sobrepase a Number.MAX_SAFE_INTEGER
).
Aquí te dejo los mismos cálculos anteriores usando una librería similar (big-integer):
const num = bigInt('123456789012345678901234567800');
console.log( num.toString() );
console.log( num.compare(num.add(5)) === 0 );
console.log( num.mod(6).isZero() );
<script src="https://unpkg.com/big-integer@1.6.47/BigInteger.js"></script>
Y aquí el código chequeando si los números son divisibles por 6
usando la misma librería:
function isDivisibleBy6(s) {
const nums = [];
for(let i = 0; i <= 9; i++){
nums.push(s.replace(/\*/, `${i}`));
}
return nums.filter(n => bigInt(n).mod(6).isZero());
}
console.log('para 41*: '+isDivisibleBy6('41*'));
console.log('para 34234*2: '+isDivisibleBy6('34234*2'));
console.log('para 1234567890123456789012345678*0: '+isDivisibleBy6('1234567890123456789012345678*0'));
<script src="https://unpkg.com/big-integer@1.6.47/BigInteger.js"></script>
Y aquí tu mismo código chequeando si el último número es divisible por 2
y utilizando big-integer
para la suma de los dígitos por si la suma resulta en un número muy grande (que es muy improbable que te den como input un número de este tamaño):
function isDivisibleBy6(s) {
const nums = [];
for(let i = 0; i <= 9; i++){
nums.push(s.replace(/\*/, `${i}`));
}
return nums.filter(b => +b.slice(-1) % 2 === 0 && b.split('').reduce((b, n) => b.add(+n), bigInt(0)).mod(3).isZero());
}
console.log('para 41*: '+isDivisibleBy6('41*'));
console.log('para 34234*2: '+isDivisibleBy6('34234*2'));
console.log('para 1234567890123456789012345678*0: '+isDivisibleBy6('1234567890123456789012345678*0'));
<script src="https://unpkg.com/big-integer@1.6.47/BigInteger.js"></script>