2018-09-30 23:01:58 +01:00
---
id: 595608ff8bcd7a50bd490181
2020-11-27 19:02:05 +01:00
title: Hailstone sequence
2018-09-30 23:01:58 +01:00
challengeType: 5
2019-08-05 09:17:33 -07:00
forumTopicId: 302279
2021-01-13 03:31:00 +01:00
dashedName: hailstone-sequence
2018-09-30 23:01:58 +01:00
---
2020-11-27 19:02:05 +01:00
# --description--
The Hailstone sequence of numbers can be generated from a starting positive integer, `n` by:
2019-03-05 18:37:06 +09:00
< ul >
2019-06-14 20:04:16 +09:00
< li > If < code > n< / code > is < code > 1< / code > then the sequence ends< / li >
< li > If < code > n< / code > is < code > even< / code > then the next < code > n< / code > of the sequence < code > = n/2< / code > < / li >
< li > If < code > n< / code > is < code > odd< / code > then the next < code > n< / code > of the sequence < code > = (3 * n) + 1< / code > < / li >
2019-03-05 18:37:06 +09:00
< / ul >
2020-11-27 19:02:05 +01:00
The (unproven) [Collatz conjecture ](<https://en.wikipedia.org/wiki/Collatz conjecture> "wp: Collatz conjecture" ) is that the hailstone sequence for any starting number always terminates.
2019-03-05 18:37:06 +09:00
The hailstone sequence is also known as hailstone numbers (because the values are usually subject to multiple descents and ascents like hailstones in a cloud), or as the Collatz sequence.
2018-09-30 23:01:58 +01:00
2020-11-27 19:02:05 +01:00
# --instructions--
2019-03-05 18:37:06 +09:00
< ol >
2019-06-14 20:04:16 +09:00
< li > Create a routine to generate the hailstone sequence for a number< / li >
2019-03-05 18:37:06 +09:00
< li > Use the routine to show that the hailstone sequence for the number 27 has 112 elements starting with < code > 27, 82, 41, 124< / code > and ending with < code > 8, 4, 2, 1< / code > < / li >
< li > Show the number less than 100,000 which has the longest hailstone sequence together with that sequence's length. (But don't show the actual sequence!)< / li >
< / ol >
2020-11-27 19:02:05 +01:00
**See also:**
2019-03-05 18:37:06 +09:00
< ul >
2020-11-27 19:02:05 +01:00
< li > < a href = 'https://xkcd.com/710' target = '_blank' > xkcd< / a > (humourous).< / li >
2019-03-05 18:37:06 +09:00
< / ul >
2018-09-30 23:01:58 +01:00
2020-11-27 19:02:05 +01:00
# --hints--
2018-09-30 23:01:58 +01:00
2020-11-27 19:02:05 +01:00
`hailstoneSequence` should be a function.
2018-09-30 23:01:58 +01:00
2020-11-27 19:02:05 +01:00
```js
assert(typeof hailstoneSequence === 'function');
2018-09-30 23:01:58 +01:00
```
2020-11-27 19:02:05 +01:00
`hailstoneSequence()` should return `[[27,82,41,124,8,4,2,1], [351, 77031]]`
2018-09-30 23:01:58 +01:00
```js
2020-11-27 19:02:05 +01:00
assert.deepEqual(hailstoneSequence(), res);
2018-09-30 23:01:58 +01:00
```
2020-11-27 19:02:05 +01:00
# --seed--
2018-09-30 23:01:58 +01:00
2020-11-27 19:02:05 +01:00
## --after-user-code--
2018-09-30 23:01:58 +01:00
```js
2018-10-20 21:02:47 +03:00
const res = [[27, 82, 41, 124, 8, 4, 2, 1], [351, 77031]];
2018-09-30 23:01:58 +01:00
```
2020-11-27 19:02:05 +01:00
## --seed-contents--
```js
function hailstoneSequence() {
const res = [];
2018-09-30 23:01:58 +01:00
2020-11-27 19:02:05 +01:00
return res;
}
```
2018-09-30 23:01:58 +01:00
2020-11-27 19:02:05 +01:00
# --solutions--
2018-09-30 23:01:58 +01:00
```js
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;
}
```