@@ -2,47 +2,42 @@ import path from "node:path";
22import { readInputLineByLine } from "@utils/io" ;
33
44export async function part1 ( inputFile : string ) : Promise < number > {
5- return await day1 ( inputFile , calcDistanceChecksum ) ;
5+ return await day1 ( inputFile , countZeroPositions ) ;
66}
77
88export async function part2 ( inputFile : string ) : Promise < number > {
9- return await day1 ( inputFile , calcSimilarityScore ) ;
9+ return await day1 ( inputFile , countZeroPositions ) ;
1010}
1111
12- async function day1 ( inputFile : string , calcFn : ( list1 : number [ ] , list2 : number [ ] ) => number ) : Promise < number > {
12+ type MovementType = { dir : string , value : number } ;
13+
14+ async function day1 ( inputFile : string , calcFn : ( movements : MovementType [ ] ) => number ) : Promise < number > {
1315 const inputPath = path . join ( __dirname , inputFile ) ;
1416 const lines = await readInputLineByLine ( inputPath ) ;
1517
16- const leftList : number [ ] = [ ] ;
17- const rightList : number [ ] = [ ] ;
18-
19- lines . forEach ( line => {
20- const numbers = line . split ( / \s + / ) . map ( str => Number . parseInt ( str ) ) ;
21- leftList . push ( numbers [ 0 ] ) ;
22- rightList . push ( numbers [ 1 ] ) ;
23- } ) ;
24-
25- leftList . sort ( ) ;
26- rightList . sort ( ) ;
18+ const movements = lines . map ( line => {
19+ const dir = line . slice ( 0 , 1 ) ;
20+ const value = Number . parseInt ( line . slice ( 1 ) ) ;
21+ return { dir, value } ;
22+ } )
2723
28- return calcFn ( leftList , rightList ) ;
24+ return calcFn ( movements ) ;
2925}
3026
31- function calcSimilarityScore ( leftList : number [ ] , rightList : number [ ] ) : number {
32- let totalSimilarityScore = 0 ;
33- leftList . forEach ( ( num ) => {
34- const occurrences = rightList . filter ( rightNum => rightNum === num ) . length ;
35- totalSimilarityScore += num * occurrences ;
36- } ) ;
3727
38- return totalSimilarityScore ;
39- }
28+ function countZeroPositions ( movements : MovementType [ ] ) : number {
29+ let zeroPassages = 0 ;
30+ let position = 50 ;
31+
32+ movements . forEach ( movement => {
33+ const newPosition = movement . dir === 'R' ? position + movement . value : position - movement . value ;
34+ position = ( ( newPosition % 100 ) + 100 ) % 100 ; // handles all cases: positive, negative, multiple wraps
4035
41- function calcDistanceChecksum ( leftList : number [ ] , rightList : number [ ] ) : number {
42- let distanceChecksum = 0 ;
43- leftList . forEach ( ( num , index ) => {
44- distanceChecksum += Math . abs ( num - rightList [ index ] ) ;
45- } ) ;
36+ if ( position === 0 ) {
37+ zeroPassages ++ ;
38+ }
39+ } )
4640
47- return distanceChecksum ;
41+ return zeroPassages ;
4842}
43+
0 commit comments