A daily game
at main 58 lines 1.5 kB view raw
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}