2.9 KiB
2.9 KiB
title, id, localeTitle, challengeType
title | id | localeTitle | challengeType |
---|---|---|---|
Hailstone sequence | 595608ff8bcd7a50bd490181 | 595608ff8bcd7a50bd490181 | 5 |
Description
La secuencia de números de Hailstone se puede generar a partir de un entero positivo inicial, n mediante:
Si n es 1, la secuencia termina. Si n es par, entonces el siguiente n de la secuencia= n/2
Si n es impar, entonces el siguiente n de la secuencia = (3 * n) + 1
La conjetura (no probada) de Collatz es que la secuencia de granizo para cualquier número inicial siempre termina.
La secuencia de granizo también se conoce como números de granizo (porque los valores suelen estar sujetos a múltiples descensos y ascensos como granizos en una nube), o como la secuencia de Collatz.
Tarea: Crea una rutina para generar la secuencia de granizo para un número. Use la rutina para mostrar que la secuencia de granizo para el número 27 tiene 112 elementos que comienzan con27, 82, 41, 124
y que terminan con 8, 4, 2, 1
Muestre el número menos de 100,000 que tiene la secuencia de granizo más larga en conjunto con la longitud de esa secuencia. (¡Pero no muestres la secuencia real!) Ver también:
xkcd (humorístico).
Instructions
Tests
tests:
- text: <code>hailstoneSequence</code> es una función.
testString: 'assert(typeof hailstoneSequence === "function", "<code>hailstoneSequence</code> is a function.");'
- text: ' <code>hailstoneSequence()</code> debe devolver <code>[[27,82,41,124,8,4,2,1], [351, 77031]]</code> '
testString: 'assert.deepEqual(hailstoneSequence(), res, "<code>hailstoneSequence()</code> should return <code>[[27,82,41,124,8,4,2,1], [351, 77031]]</code>");'
Challenge Seed
// noprotect
function hailstoneSequence () {
const res = [];
// Good luck!
return res;
}
After Test
console.info('after the test');
Solution
// noprotect
function hailstoneSequence () {
const res = [];
function hailstone(n) {
const seq = [n];
while (n > 1) {
n = n % 2 ? 3 * n + 1 : n / 2;
seq.push(n);
}
return seq;
}
const h = hailstone(27);
const hLen = h.length;
res.push([...h.slice(0, 4), ...h.slice(hLen - 4, hLen)]);
let n = 0;
let max = 0;
for (let i = 100000; --i;) {
const seq = hailstone(i);
const sLen = seq.length;
if (sLen > max) {
n = i;
max = sLen;
}
}
res.push([max, n]);
return res;
}