@@ -14,13 +14,15 @@ class Solve14 extends FileReader {
14
14
super ( ) ;
15
15
this . readData ( "src/14/input.data" )
16
16
. then ( ( data ) => {
17
- this . process ( data . split ( "\n" ) ) ;
17
+ this . process ( data . split ( "\n" ) , false ) ;
18
+ this . process ( data . split ( "\n" ) , true ) ;
18
19
} )
19
20
. catch ( ( err ) => console . log ( err ) ) ;
20
21
}
21
22
22
23
rocks : Map < string , boolean > = new Map ( )
23
24
blocksByX : Map < number , number [ ] > = new Map ( )
25
+ maxY = 0
24
26
25
27
addToMap = ( map : Map < number , number [ ] > , index : number , value : number ) => {
26
28
const arr = map . get ( index ) || [ ]
@@ -34,6 +36,12 @@ class Solve14 extends FileReader {
34
36
key = ( x : number , y : number ) => `${ x } _${ y } `
35
37
36
38
addPoints = ( x1 : number , y1 : number , x2 : number , y2 : number ) => {
39
+ if ( y1 > this . maxY ) {
40
+ this . maxY = y1
41
+ }
42
+ if ( y2 > this . maxY ) {
43
+ this . maxY = y2
44
+ }
37
45
if ( x1 === x2 ) {
38
46
const diff = Math . abs ( y2 - y1 ) + 1
39
47
const it = Math . sign ( y2 - y1 )
@@ -63,29 +71,11 @@ class Solve14 extends FileReader {
63
71
64
72
blockedNext = ( point : Point , left : boolean ) => this . blocksByX . get ( point . x + ( left ? - 1 : 1 ) ) ?. includes ( point . y + 1 )
65
73
66
- print = ( ) => {
67
- // for (let y=0;y<=9;y++) {
68
- for ( let y = 150 ; y <= 170 ; y ++ ) {
69
- let line = ""
70
- // for (let x=494;x<=503;x++) {
71
- for ( let x = 500 ; x <= 550 ; x ++ ) {
72
- const r = this . rocks . get ( this . key ( x , y ) )
73
- if ( r !== undefined ) {
74
- line += "#"
75
- continue
76
- }
77
- const s = this . blocksByX . get ( x ) ?. includes ( y )
78
- if ( s ) {
79
- line += "o"
80
- continue
81
- }
82
- line += "."
83
- }
84
- console . log ( line )
85
- }
86
- }
74
+ process = ( data : string [ ] , part2 : boolean ) => {
75
+ this . rocks = new Map ( )
76
+ this . blocksByX = new Map ( )
77
+ this . maxY = 0
87
78
88
- process = ( data : string [ ] ) => {
89
79
data . forEach ( row => {
90
80
const segments = row . split ( ' -> ' )
91
81
let last = segments [ 0 ] . split ( ',' )
@@ -101,9 +91,16 @@ class Solve14 extends FileReader {
101
91
let sand = new Point ( 500 , 0 )
102
92
103
93
while ( true ) {
94
+ if ( part2 && this . blocksByX . get ( 500 ) ?. includes ( 0 ) ) {
95
+ done = true
96
+ }
104
97
const newYarr = this . blocksByX . get ( sand . x ) ?. filter ( y => y >= sand . y )
105
98
if ( newYarr === undefined || newYarr . length === 0 ) {
106
- done = true
99
+ if ( part2 ) {
100
+ this . addToMap ( this . blocksByX , sand . x , this . maxY + 1 )
101
+ } else {
102
+ done = true
103
+ }
107
104
break
108
105
}
109
106
newYarr . sort ( ( a : number , b : number ) => a - b )
0 commit comments