diff --git a/2021/15.js b/2021/15.js index 9174310..1a1faa9 100644 --- a/2021/15.js +++ b/2021/15.js @@ -1,17 +1,52 @@ +function encodePoint(pt) { + return (pt.x << 9) | pt.y +} + +function decodePoint(num) { + return new Point((num >> 9) & 0b111111111, num & 0b111111111) +} + function day15(input, part2) { - let g = Grid.fromStr(input).num() + let grid = Grid.fromStr(input).num() if (part2) { - g = new Grid(g.width * 5, g.height * 5).mapMut((e, pt) => ((g.get(new Pt(pt.x % g.width, pt.y % g.height)) + (pt.x / g.width | 0) + (pt.y / g.height | 0) - 1) % 9) + 1) + grid = new Grid(grid.width * 5, grid.height * 5) + .mapMut((e, pt) => grid.get(new Pt(pt.x % grid.width, pt.y % grid.height)) + (pt.x / grid.width | 0) + (pt.y / grid.height | 0)) + .mapMut((e) => ((e - 1) % 9) + 1) } - g.graphify() + let start = encodePoint(new Point(0, 0)) - let start = g.get(new Pt(0, 0)) - let end = g.get(new Pt(g.width - 1, g.height - 1)) - start.dijkstraTo(end) + let visited = {} + visited[start] = true - return end.searchData.dist + let heap = new BinHeap((a, b) => a.risk < b.risk) + heap.insert({ pt: start, risk: 0 }) + + while (true) { + let top = heap.extract() + let decoded = decodePoint(top.pt) + + if (decoded.x == grid.width - 1 && decoded.y == grid.height - 1) { + return top.risk + } + + for (let pt of grid.getAdjNeighbors(decoded)) { + let encoded = encodePoint(pt) + let risk = top.risk + grid.get(pt) + + if (encoded in visited) { + let idx = heap.data.findIndex((e) => e.pt == encoded) + if (idx > -1 && risk < heap.data[idx].risk) { + heap.data[idx].risk = risk + heap.up(idx) + } + } else { + visited[encoded] = true + heap.insert({ pt: encoded, risk: risk }) + } + } + } } if (typeof window == "undefined") { diff --git a/out.txt b/out.txt index 3898051..f1a2a2b 100644 --- a/out.txt +++ b/out.txt @@ -1,79 +1,79 @@ -2021 day 1 part 1: 0.676ms +2021 day 1 part 1: 1.109ms 2021 day 1 part 1: Got 1292, expected 1292 2021 day 1 part 1: SUCCESS -2021 day 1 part 2: 0.528ms +2021 day 1 part 2: 0.793ms 2021 day 1 part 2: Got 1262, expected 1262 2021 day 1 part 2: SUCCESS -2021 day 2 part 1: 3.227ms +2021 day 2 part 1: 4.772ms 2021 day 2 part 1: Got 1813801, expected 1813801 2021 day 2 part 1: SUCCESS -2021 day 2 part 2: 2.964ms +2021 day 2 part 2: 3.947ms 2021 day 2 part 2: Got 1960569556, expected 1960569556 2021 day 2 part 2: SUCCESS -2021 day 3 part 1: 18.032ms +2021 day 3 part 1: 20.185ms 2021 day 3 part 1: Got 3882564, expected 3882564 2021 day 3 part 1: SUCCESS -2021 day 3 part 2: 8.503ms +2021 day 3 part 2: 8.059ms 2021 day 3 part 2: Got 3385170, expected 3385170 2021 day 3 part 2: SUCCESS -2021 day 4 part 1: 23.852ms +2021 day 4 part 1: 26.341ms 2021 day 4 part 1: Got 54275, expected 54275 2021 day 4 part 1: SUCCESS -2021 day 4 part 2: 12.691ms +2021 day 4 part 2: 13.878ms 2021 day 4 part 2: Got 13158, expected 13158 2021 day 4 part 2: SUCCESS -2021 day 5 part 1: 391.71ms +2021 day 5 part 1: 441.852ms 2021 day 5 part 1: Got 6856, expected 6856 2021 day 5 part 1: SUCCESS -2021 day 5 part 2: 632.048ms +2021 day 5 part 2: 585.404ms 2021 day 5 part 2: Got 20666, expected 20666 2021 day 5 part 2: SUCCESS -2021 day 6 part 1: 0.284ms +2021 day 6 part 1: 0.291ms 2021 day 6 part 1: Got 353274, expected 353274 2021 day 6 part 1: SUCCESS -2021 day 6 part 2: 0.188ms +2021 day 6 part 2: 0.164ms 2021 day 6 part 2: Got 1609314870967, expected 1609314870967 2021 day 6 part 2: SUCCESS -2021 day 7 part 1: 100.926ms +2021 day 7 part 1: 98.546ms 2021 day 7 part 1: Got 347011, expected 347011 2021 day 7 part 1: SUCCESS -2021 day 7 part 2: 105.171ms +2021 day 7 part 2: 79.007ms 2021 day 7 part 2: Got 98363777, expected 98363777 2021 day 7 part 2: SUCCESS -2021 day 8 part 1: 6.436ms +2021 day 8 part 1: 3.982ms 2021 day 8 part 1: Got 525, expected 525 2021 day 8 part 1: SUCCESS -2021 day 8 part 2: 14.37ms +2021 day 8 part 2: 10.151ms 2021 day 8 part 2: Got 1083859, expected 1083859 2021 day 8 part 2: SUCCESS -2021 day 9 part 1: 70.799ms +2021 day 9 part 1: 68.991ms 2021 day 9 part 1: Got 585, expected 585 2021 day 9 part 1: SUCCESS -2021 day 9 part 2: 280.214ms +2021 day 9 part 2: 267.771ms 2021 day 9 part 2: Got 827904, expected 827904 2021 day 9 part 2: SUCCESS -2021 day 10 part 1: 6.514ms +2021 day 10 part 1: 3.615ms 2021 day 10 part 1: Got 469755, expected 469755 2021 day 10 part 1: SUCCESS -2021 day 10 part 2: 2.933ms +2021 day 10 part 2: 1.869ms 2021 day 10 part 2: Got 2762335572, expected 2762335572 2021 day 10 part 2: SUCCESS -2021 day 11 part 1: 22.393ms +2021 day 11 part 1: 24.176ms 2021 day 11 part 1: Got 1691, expected 1691 2021 day 11 part 1: SUCCESS -2021 day 11 part 2: 31.511ms +2021 day 11 part 2: 36.7ms 2021 day 11 part 2: Got 216, expected 216 2021 day 11 part 2: SUCCESS -2021 day 12 part 1: 30.518ms +2021 day 12 part 1: 30.264ms 2021 day 12 part 1: Got 4241, expected 4241 2021 day 12 part 1: SUCCESS -2021 day 12 part 2: 802.008ms +2021 day 12 part 2: 817.695ms 2021 day 12 part 2: Got 122134, expected 122134 2021 day 12 part 2: SUCCESS -2021 day 13 part 1: 22.782ms +2021 day 13 part 1: 24.692ms 2021 day 13 part 1: Got 695, expected 695 2021 day 13 part 1: SUCCESS -2021 day 13 part 2: 76.13ms +2021 day 13 part 2: 75.562ms 2021 day 13 part 2: Got ## ## #### ## # # # ### ## # # # # # # # # # # # # # # # # # # # # # # @@ -86,306 +86,34 @@ # # # # # # # # # # # # # ### ## #### ### #### ## # ## 2021 day 13 part 2: SUCCESS -2021 day 14 part 1: 1.787ms +2021 day 14 part 1: 1.777ms 2021 day 14 part 1: Got 2068, expected 2068 2021 day 14 part 1: SUCCESS -2021 day 14 part 2: 4.071ms +2021 day 14 part 2: 4.107ms 2021 day 14 part 2: Got 2158894777814, expected 2158894777814 2021 day 14 part 2: SUCCESS -99 -heap gen: 36.683ms -9000 -8000 -7000 -6000 -5000 -4000 -3000 -2000 -1000 -search: 78.713ms -2021 day 15 part 1: 235.476ms +2021 day 15 part 1: 129.921ms 2021 day 15 part 1: Got 498, expected 498 2021 day 15 part 1: SUCCESS -101 -201 -301 -401 -499 -399 -299 -199 -99 -heap gen: 681.953ms -249000 -248000 -247000 -246000 -245000 -244000 -243000 -242000 -241000 -240000 -239000 -238000 -237000 -236000 -235000 -234000 -233000 -232000 -231000 -230000 -229000 -228000 -227000 -226000 -225000 -224000 -223000 -222000 -221000 -220000 -219000 -218000 -217000 -216000 -215000 -214000 -213000 -212000 -211000 -210000 -209000 -208000 -207000 -206000 -205000 -204000 -203000 -202000 -201000 -200000 -199000 -198000 -197000 -196000 -195000 -194000 -193000 -192000 -191000 -190000 -189000 -188000 -187000 -186000 -185000 -184000 -183000 -182000 -181000 -180000 -179000 -178000 -177000 -176000 -175000 -174000 -173000 -172000 -171000 -170000 -169000 -168000 -167000 -166000 -165000 -164000 -163000 -162000 -161000 -160000 -159000 -158000 -157000 -156000 -155000 -154000 -153000 -152000 -151000 -150000 -149000 -148000 -147000 -146000 -145000 -144000 -143000 -142000 -141000 -140000 -139000 -138000 -137000 -136000 -135000 -134000 -133000 -132000 -131000 -130000 -129000 -128000 -127000 -126000 -125000 -124000 -123000 -122000 -121000 -120000 -119000 -118000 -117000 -116000 -115000 -114000 -113000 -112000 -111000 -110000 -109000 -108000 -107000 -106000 -105000 -104000 -103000 -102000 -101000 -100000 -99000 -98000 -97000 -96000 -95000 -94000 -93000 -92000 -91000 -90000 -89000 -88000 -87000 -86000 -85000 -84000 -83000 -82000 -81000 -80000 -79000 -78000 -77000 -76000 -75000 -74000 -73000 -72000 -71000 -70000 -69000 -68000 -67000 -66000 -65000 -64000 -63000 -62000 -61000 -60000 -59000 -58000 -57000 -56000 -55000 -54000 -53000 -52000 -51000 -50000 -49000 -48000 -47000 -46000 -45000 -44000 -43000 -42000 -41000 -40000 -39000 -38000 -37000 -36000 -35000 -34000 -33000 -32000 -31000 -30000 -29000 -28000 -27000 -26000 -25000 -24000 -23000 -22000 -21000 -20000 -19000 -18000 -17000 -16000 -15000 -14000 -13000 -12000 -11000 -10000 -9000 -8000 -7000 -6000 -5000 -4000 -3000 -2000 -1000 -search: 17.139s -2021 day 15 part 2: 19.590s +2021 day 15 part 2: 2.225s 2021 day 15 part 2: Got 2901, expected 2901 2021 day 15 part 2: SUCCESS -2021 day 16 part 1: 45.673ms +2021 day 16 part 1: 33.304ms 2021 day 16 part 1: Got 1038, expected 1038 2021 day 16 part 1: SUCCESS -2021 day 16 part 2: 18.143ms +2021 day 16 part 2: 16.105ms 2021 day 16 part 2: Got 246761930504, expected 246761930504 2021 day 16 part 2: SUCCESS -2021 day 17 part 1: 75.612ms +2021 day 17 part 1: 66.646ms 2021 day 17 part 1: Got 4656, expected 4656 2021 day 17 part 1: SUCCESS -2021 day 17 part 2: 64.137ms +2021 day 17 part 2: 69.26ms 2021 day 17 part 2: Got 1908, expected 1908 2021 day 17 part 2: SUCCESS -2021 day 18 part 1: 27.594ms +2021 day 18 part 1: 24.475ms 2021 day 18 part 1: Got 3494, expected 3494 2021 day 18 part 1: SUCCESS -2021 day 18 part 2: 260.408ms +2021 day 18 part 2: 234.266ms 2021 day 18 part 2: Got 4712, expected 4712 2021 day 18 part 2: SUCCESS linked 0<->5 (0 point 0 == 5 point 9 with rotation 8) @@ -423,7 +151,7 @@ linked 35<->9 (35 point 0 == 9 point 11 with rotation 9) linked 9<->25 (9 point 0 == 25 point 18 with rotation 5) linked 25<->29 (25 point 0 == 29 point 7 with rotation 23) linked 29<->21 (29 point 0 == 21 point 6 with rotation 3) -2021 day 19 part 1: 39.537s +2021 day 19 part 1: 36.350s 2021 day 19 part 1: Got 447, expected 447 2021 day 19 part 1: SUCCESS linked 0<->5 (0 point 0 == 5 point 9 with rotation 8) @@ -461,25 +189,25 @@ linked 35<->9 (35 point 0 == 9 point 11 with rotation 9) linked 9<->25 (9 point 0 == 25 point 18 with rotation 5) linked 25<->29 (25 point 0 == 29 point 7 with rotation 23) linked 29<->21 (29 point 0 == 21 point 6 with rotation 3) -2021 day 19 part 2: 37.936s +2021 day 19 part 2: 35.935s 2021 day 19 part 2: Got 15672, expected 15672 2021 day 19 part 2: SUCCESS -2021 day 20 part 1: 79.639ms +2021 day 20 part 1: 80.972ms 2021 day 20 part 1: Got 4873, expected 4873 2021 day 20 part 1: SUCCESS -2021 day 20 part 2: 2.031s +2021 day 20 part 2: 2.015s 2021 day 20 part 2: Got 16394, expected 16394 2021 day 20 part 2: SUCCESS -2021 day 21 part 1: 0.554ms +2021 day 21 part 1: 0.616ms 2021 day 21 part 1: Got 597600, expected 597600 2021 day 21 part 1: SUCCESS -2021 day 21 part 2: 336.981ms +2021 day 21 part 2: 334.911ms 2021 day 21 part 2: Got 634769613696613, expected 634769613696613 2021 day 21 part 2: SUCCESS -2021 day 22 part 1: 37.315ms +2021 day 22 part 1: 42.349ms 2021 day 22 part 1: Got 589411, expected 589411 2021 day 22 part 1: SUCCESS -2021 day 22 part 2: 117.885ms +2021 day 22 part 2: 119.896ms 2021 day 22 part 2: Got 1130514303649907, expected 1130514303649907 2021 day 22 part 2: SUCCESS iteration 0 heap size 28 min energy 0 @@ -489,7 +217,7 @@ iteration 30000 heap size 14414 min energy 7695 iteration 40000 heap size 15108 min energy 8555 iteration 50000 heap size 14881 min energy 9425 iteration 60000 heap size 12860 min energy 10003 -2021 day 23 part 1: 2.730s +2021 day 23 part 1: 2.517s 2021 day 23 part 1: Got 10607, expected 10607 2021 day 23 part 1: SUCCESS iteration 0 heap size 28 min energy 0 @@ -501,15 +229,15 @@ iteration 50000 heap size 11889 min energy 9313 iteration 60000 heap size 11552 min energy 10455 iteration 70000 heap size 7414 min energy 12084 iteration 80000 heap size 3371 min energy 14557 -2021 day 23 part 2: 2.763s +2021 day 23 part 2: 2.722s 2021 day 23 part 2: Got 59071, expected 59071 2021 day 23 part 2: SUCCESS -2021 day 24 part 1: 0.294ms +2021 day 24 part 1: 0.303ms 2021 day 24 part 1: Got 99691891979938, expected 99691891979938 2021 day 24 part 1: SUCCESS -2021 day 24 part 2: 0.258ms +2021 day 24 part 2: 0.103ms 2021 day 24 part 2: Got 27141191213911, expected 27141191213911 2021 day 24 part 2: SUCCESS -2021 day 25: 2.289s +2021 day 25: 2.281s 2021 day 25: Got 534, expected 534 2021 day 25: SUCCESS