Berlin Clock Kata
Wix Grow Activity
Berlin Clock (cont.)
- Round light blinks to denote odd (on) or even (off) seconds.
- 1st row denotes five full hours each. 2nd row denotes one hour each.
- 3rd row eleven lights, which denote five full minutes each.
- 4th row indicates one full.
Kata
A code kata is an exercise in programming which helps programmers hone their skills through practice and repetition.
Theme of the day
Purely functional style.
Constraints
- Only
const, nolet. - No re-assignment or mutation.
- Recursion for iteration.
- Avoid built-ins.
No re-assignment
array[0] = 1; object.x = 2;
No mutation
Given this
const a = [1, 2, 3];
None of this
a.push(4); a.reverse(); a.sort() a.splice(1, 3);
Destruct & construct
function withFirst(x, array) {
const [_, ...rest] = array;
return [x, ...rest];
}
function withKey(object, key, value) {
return { ...object, [key]: value };
}
Recursion to iterate
No for, while, or .forEach.
a.map(n => n + 1);
a.filter(n => n % 2);
a.reduce((acc, n) => acc + n);
function range(n, m) {
return Array.from({length: m - n})
.map((_, index) => n + index);
}
Bonus: avoid built-ins
Replace .map, .reduce, .slice(1).
function tail(xs) {
const [, ...rest] = xs;
return rest;
}
function reduce(fn, xs, acc) {
return xs.length > 0
? reduce(fn, tail(xs), fn(acc, xs[0]))
: acc;
}
function map(fn, xs) {
return reduce((acc, x) => [...acc, fn(x)], xs, []);
}
Without Array.from.
function range(n, m) {
return n < m ? [n, ...range(n + 1, m)] : [];
}
Specification
S H×5 H M×5 M
00:00:00 . .... .... ........... ....
00:00:01 X .... .... ........... ....
22:23:18 . XXXX XX.. XX|X....... XXX.
Template
require('readline')
.createInterface({ input: process.stdin })
.on('line', line => console.log(`${line} => ${toBerlinClock(line)}`));
function toBerlinClock(line) {
return '. .... .... ........... ....';
}
$ echo 10:15:00 | node main.js 10:15:00 => . XX.. .... XX|........ .... $ node main.js < example.txt 00:00:00 => . .... .... ........... .... 23:59:59 => X XXXX XXX. XX|XX|XX|XX XXXX 18:48:02 => . XXX. XXX. XX|XX|XX|.. XXX.