@@ -2,16 +2,47 @@ import path from "node:path";
22import { readInputLineByLine } from "@utils/io" ;
33
44export async function part1 ( inputFile : string ) {
5- return await day2 ( inputFile ) ;
5+ return await day2 ( inputFile , findInvalidIds ) ;
66}
77
88export async function part2 ( inputFile : string ) {
99 return await day2 ( inputFile ) ;
1010}
1111
12- async function day2 ( inputFile : string , calcFn ?: ( lines : string [ ] ) => number ) {
12+ type NumRange = { from : number ; to : number } ;
13+
14+ async function day2 ( inputFile : string , calcFn ?: ( ranges : NumRange [ ] ) => number ) {
1315 const inputPath = path . join ( __dirname , inputFile ) ;
1416 const lines = await readInputLineByLine ( inputPath ) ;
1517
16- return calcFn ?.( lines ) ;
18+ const rangeStrings = lines [ 0 ] . split ( ',' ) ;
19+ const ranges : NumRange [ ] = rangeStrings . map ( range => {
20+ const res = range . split ( '-' ) ;
21+ return {
22+ from : Number . parseInt ( res [ 0 ] ) ,
23+ to : Number . parseInt ( res [ 1 ] ) ,
24+ }
25+ } )
26+ return calcFn ?.( ranges ) ;
27+ }
28+
29+ function findInvalidIds ( ranges : NumRange [ ] ) : number {
30+ let invalidIdSum = 0 ;
31+ ranges . forEach ( ( { from, to } ) => {
32+
33+ for ( let n = from ; n <= to ; n ++ ) {
34+ const numAsString = `${ n } ` ;
35+ if ( numAsString . length % 2 !== 0 )
36+ continue ;
37+
38+ const mid = numAsString . length / 2 ;
39+
40+ const firstHalf = numAsString . slice ( 0 , mid ) ;
41+ const secondHalf = numAsString . slice ( mid ) ;
42+ if ( firstHalf === secondHalf )
43+ invalidIdSum += n ;
44+ }
45+ } )
46+
47+ return invalidIdSum ;
1748}
0 commit comments