A daily game
1export function arrayOfSize(size: number) {
2 return new Array<null>(size).fill(null);
3}
4
5export function groupIntoRows<T>(items: T[], columns: number) {
6 return items.reduce((acc, cur, i) => {
7 if (i % columns === 0) {
8 return [...acc, [cur]];
9 }
10
11 acc[acc.length - 1] = [...acc[acc.length - 1]!, cur];
12 return acc;
13 }, [] as T[][]);
14}
15
16export function groupIntoCols<T>(items: T[], columns: number) {
17 const rows = groupIntoRows(items, columns);
18 return arrayOfSize(rows[0]!.length).map((_, x) =>
19 rows.map((row) => row[x] as T),
20 );
21}
22
23// Given a row or column, return an array containing the
24// number of contiguous values grouped by variant.
25// E.g. given the block [0, 1, 1, 0, 2, 1], return [2, 1] for variant 1.
26export function groupByValue<T extends Array<any>>(block: T, value: T[number]) {
27 const [first, ...rest] = block;
28
29 const grouped = rest
30 .reduce<T[number][][]>(
31 (acc, cur) => {
32 if (acc.at(acc.length - 1)![0] === cur) {
33 acc[acc.length - 1] = [...acc[acc.length - 1]!, cur];
34 return acc;
35 }
36
37 return [...acc, [cur]];
38 },
39 [[first]],
40 )
41 .reduce<number[]>((acc, cur) => {
42 if (cur[0] === value) {
43 return [...acc, cur.length];
44 }
45
46 return acc;
47 }, []);
48
49 if (grouped.length === 0) {
50 return [0];
51 }
52
53 return grouped;
54}
55
56export function generateSeedForDay(day: Date) {
57 return `${day.getFullYear()}${day.getMonth().toString().padStart(2, "0")}${day.getDate().toString().padStart(2, "0")}`;
58}