Kaynağa Gözat

Adding day 5 - WIP

bodicsek 4 yıl önce
ebeveyn
işleme
7dc61bec06
3 değiştirilmiş dosya ile 599 ekleme ve 0 silme
  1. 89 0
      day05/day05.ts
  2. 10 0
      day05/input.test.ts
  3. 500 0
      day05/input.ts

+ 89 - 0
day05/day05.ts

@@ -0,0 +1,89 @@
+import * as A from "fp-ts/Array";
+import * as N from "fp-ts/number";
+
+import { pipe } from "fp-ts/lib/function";
+import { contramap, max, min } from "fp-ts/lib/Ord";
+import { Eq, struct } from 'fp-ts/Eq'
+
+import { vectors as testVetctors } from "./input.test";
+import { vectors as inputVectors } from "./input";
+
+type Point = { x: number, y: number };
+type Vector = { from: Point, to: Point };
+
+const parseVectors = (input: string) => pipe(
+    input.split("\n"),
+    A.map<string, Vector>(v => {
+        const points = pipe(
+            v.split(" -> "),
+            A.map<string, Point>(p => {
+                const coords = pipe(
+                    p.split(","),
+                    A.map(parseInt)
+                );
+                return {
+                    x: coords[0],
+                    y: coords[1]
+                };
+            })
+        );
+        return {
+            from: points[0],
+            to: points[1]
+        };
+    })
+);
+
+const vectors = parseVectors(
+    // testVetctors
+    inputVectors
+);
+
+const maxNum = max(N.Ord);
+const minNum = min(N.Ord);
+
+const expand = (vector: Vector): Point[] => pipe(
+    vector.from.x === vector.to.x
+        ? A.replicate(maxNum(vector.to.y, vector.from.y) - minNum(vector.to.y, vector.from.y) + 1, vector.from.x)
+        : A.makeBy(
+            maxNum(vector.to.x, vector.from.x) - minNum(vector.to.x, vector.from.x) + 1,
+            n => (vector.to.x > vector.from.x ? vector.from.x : vector.to.x) + n
+        ),
+    A.zip(vector.from.y === vector.to.y
+        ? A.replicate(maxNum(vector.to.x, vector.from.x) - minNum(vector.to.x, vector.from.x) + 1, vector.from.y)
+        : A.makeBy(
+            maxNum(vector.to.y, vector.from.y) - minNum(vector.to.y, vector.from.y) + 1,
+            n => (vector.to.y > vector.from.y ? vector.from.y : vector.to.y) + n
+        )),
+    A.map(([x, y]) => ({ x, y }))
+);
+
+const byX = pipe(N.Ord, contramap((p: Point) => p.x));
+const byY = pipe(N.Ord, contramap((p: Point) => p.y));
+const eqPoint: Eq<Point> = struct({
+    x: N.Eq,
+    y: N.Eq
+});
+
+const group = (points: Point[]): Point[][] => {
+    const iterator = (points: Point[], grouppedPoints: Point[][]): Point[][] => {
+        if (A.isEmpty(points)) {
+            return grouppedPoints;
+        }
+        const { init, rest } = pipe(points, A.spanLeft(p => eqPoint.equals(points[0], p)));
+        return iterator(rest, pipe([init], A.concat(grouppedPoints)))
+    }
+    return iterator(points, [[]]);
+}
+
+const result = pipe(
+    vectors,
+    A.filter(v => v.from.x === v.to.x || v.from.y === v.to.y),
+    A.map(expand),
+    A.flatten,
+    A.sortBy([byX, byY]),
+    group,
+    // A.reduce(0, (count, ps) => ps.length > 1 ? count + 1 : count)
+);
+
+console.log(result);

+ 10 - 0
day05/input.test.ts

@@ -0,0 +1,10 @@
+export const vectors = `0,9 -> 5,9
+8,0 -> 0,8
+9,4 -> 3,4
+2,2 -> 2,1
+7,0 -> 7,4
+6,4 -> 2,0
+0,9 -> 2,9
+3,4 -> 1,4
+0,0 -> 8,8
+5,5 -> 8,2`

+ 500 - 0
day05/input.ts

@@ -0,0 +1,500 @@
+export const vectors = `432,708 -> 432,160
+579,594 -> 579,448
+351,791 -> 351,595
+520,836 -> 564,880
+30,443 -> 666,443
+868,157 -> 563,157
+112,186 -> 853,927
+493,387 -> 456,424
+846,165 -> 160,165
+811,805 -> 292,805
+454,333 -> 885,333
+32,407 -> 32,933
+907,590 -> 368,51
+117,904 -> 375,904
+913,145 -> 913,798
+245,402 -> 245,755
+855,910 -> 427,482
+677,252 -> 189,252
+65,30 -> 956,921
+808,114 -> 808,76
+62,946 -> 92,946
+478,756 -> 581,756
+387,812 -> 495,812
+197,606 -> 413,390
+173,640 -> 515,640
+456,26 -> 456,345
+888,69 -> 888,436
+157,959 -> 824,959
+832,519 -> 43,519
+891,258 -> 660,258
+929,176 -> 815,176
+309,893 -> 309,831
+841,825 -> 914,825
+168,260 -> 168,389
+264,969 -> 763,969
+527,553 -> 118,962
+251,413 -> 228,413
+163,759 -> 550,759
+776,650 -> 914,650
+178,99 -> 887,808
+368,92 -> 646,92
+705,583 -> 394,583
+547,278 -> 597,328
+24,941 -> 264,941
+599,588 -> 597,588
+308,668 -> 308,369
+462,335 -> 462,251
+109,343 -> 594,343
+928,980 -> 727,980
+955,955 -> 100,100
+655,716 -> 688,716
+797,64 -> 354,64
+100,633 -> 100,39
+639,757 -> 630,757
+22,962 -> 878,106
+236,687 -> 130,687
+117,881 -> 404,881
+590,334 -> 590,984
+864,888 -> 864,126
+648,164 -> 396,164
+749,446 -> 191,446
+41,973 -> 955,59
+247,725 -> 193,725
+736,136 -> 736,545
+919,33 -> 122,830
+66,986 -> 735,317
+262,989 -> 262,440
+25,86 -> 59,86
+329,151 -> 953,151
+387,105 -> 310,105
+216,197 -> 307,106
+568,574 -> 681,574
+982,801 -> 982,853
+965,606 -> 634,606
+901,854 -> 72,25
+875,278 -> 569,584
+500,240 -> 355,240
+790,448 -> 438,96
+922,863 -> 559,863
+772,727 -> 129,84
+25,11 -> 897,883
+568,609 -> 318,859
+876,875 -> 453,452
+181,471 -> 544,834
+323,377 -> 655,377
+418,20 -> 418,963
+449,392 -> 401,440
+601,958 -> 296,653
+527,343 -> 519,343
+763,328 -> 290,328
+889,262 -> 499,262
+390,478 -> 879,478
+298,764 -> 25,764
+753,86 -> 40,799
+311,350 -> 353,350
+132,817 -> 504,817
+34,121 -> 837,924
+535,27 -> 535,539
+932,257 -> 932,983
+44,833 -> 596,833
+141,34 -> 910,803
+781,61 -> 453,389
+929,28 -> 449,508
+679,958 -> 679,618
+894,273 -> 894,778
+735,697 -> 735,395
+266,693 -> 561,988
+402,586 -> 402,983
+141,459 -> 368,459
+721,723 -> 721,914
+845,69 -> 871,95
+196,370 -> 728,902
+110,725 -> 110,391
+901,670 -> 664,433
+542,601 -> 244,899
+365,386 -> 365,655
+647,738 -> 197,738
+292,250 -> 292,29
+441,603 -> 571,603
+847,146 -> 847,941
+629,282 -> 629,700
+132,44 -> 805,44
+972,31 -> 17,986
+437,303 -> 186,303
+982,416 -> 245,416
+498,258 -> 752,258
+300,815 -> 228,743
+10,69 -> 925,984
+26,275 -> 227,275
+969,358 -> 969,833
+19,593 -> 136,593
+436,451 -> 436,364
+181,847 -> 199,865
+559,409 -> 902,409
+664,570 -> 749,485
+170,176 -> 170,254
+469,908 -> 635,742
+94,496 -> 341,743
+142,913 -> 142,987
+968,143 -> 552,559
+577,847 -> 629,847
+888,354 -> 214,354
+756,769 -> 756,835
+117,696 -> 756,696
+966,297 -> 699,297
+187,800 -> 504,800
+467,739 -> 264,942
+952,83 -> 85,950
+167,478 -> 167,480
+846,257 -> 814,225
+427,787 -> 867,787
+287,886 -> 287,256
+538,594 -> 838,594
+987,989 -> 11,13
+205,825 -> 876,154
+433,437 -> 29,437
+954,943 -> 105,94
+53,143 -> 615,143
+116,438 -> 116,136
+31,48 -> 826,843
+522,637 -> 522,976
+201,322 -> 146,322
+873,214 -> 873,564
+719,460 -> 719,295
+879,886 -> 12,19
+688,723 -> 688,677
+769,779 -> 962,586
+109,887 -> 940,56
+359,57 -> 147,57
+809,857 -> 22,857
+239,860 -> 239,523
+329,907 -> 67,907
+796,165 -> 979,348
+661,385 -> 661,606
+638,685 -> 53,100
+727,787 -> 883,943
+324,414 -> 229,414
+323,363 -> 323,357
+201,440 -> 201,316
+778,54 -> 68,764
+528,151 -> 528,549
+909,970 -> 20,81
+978,12 -> 17,973
+944,574 -> 944,499
+625,85 -> 452,258
+708,618 -> 148,618
+40,957 -> 40,31
+113,288 -> 113,424
+262,109 -> 262,982
+90,359 -> 319,359
+635,21 -> 635,433
+337,310 -> 918,891
+512,701 -> 100,289
+830,946 -> 60,176
+233,959 -> 257,959
+460,702 -> 156,702
+587,96 -> 508,17
+954,552 -> 906,552
+359,268 -> 324,268
+571,416 -> 422,416
+147,684 -> 379,684
+817,274 -> 631,88
+722,85 -> 527,85
+845,457 -> 288,457
+50,687 -> 282,919
+368,310 -> 704,310
+156,20 -> 920,784
+888,89 -> 347,89
+173,27 -> 173,984
+659,450 -> 507,298
+144,857 -> 671,857
+575,976 -> 455,856
+452,531 -> 452,67
+858,506 -> 858,205
+903,486 -> 610,193
+936,165 -> 498,165
+864,336 -> 875,336
+113,15 -> 113,492
+153,892 -> 153,20
+65,401 -> 669,401
+261,743 -> 261,693
+511,401 -> 241,401
+272,683 -> 875,683
+630,871 -> 630,868
+249,68 -> 249,500
+242,532 -> 111,532
+140,125 -> 220,125
+878,457 -> 435,457
+18,723 -> 693,48
+853,234 -> 853,953
+285,507 -> 155,507
+139,873 -> 139,339
+965,327 -> 965,696
+68,616 -> 68,484
+886,659 -> 701,659
+162,836 -> 886,112
+119,281 -> 119,776
+445,706 -> 430,706
+420,705 -> 420,263
+941,764 -> 941,442
+910,932 -> 910,289
+24,11 -> 249,11
+476,296 -> 564,296
+960,822 -> 450,312
+802,852 -> 272,852
+527,127 -> 527,408
+928,132 -> 382,678
+102,297 -> 109,297
+308,586 -> 308,894
+35,913 -> 99,977
+950,392 -> 950,405
+96,531 -> 892,531
+700,451 -> 291,42
+219,197 -> 219,201
+863,861 -> 267,265
+104,55 -> 944,895
+309,909 -> 165,909
+732,458 -> 790,458
+877,959 -> 45,959
+30,902 -> 907,25
+314,36 -> 974,36
+665,580 -> 665,882
+526,288 -> 865,288
+312,166 -> 312,464
+556,380 -> 820,644
+870,959 -> 602,959
+273,69 -> 726,69
+161,885 -> 882,164
+251,332 -> 251,989
+853,962 -> 348,962
+523,47 -> 577,47
+559,503 -> 128,934
+625,681 -> 477,533
+179,352 -> 800,973
+609,847 -> 609,218
+249,521 -> 249,930
+237,903 -> 299,903
+59,373 -> 59,127
+788,558 -> 377,147
+242,792 -> 421,792
+449,874 -> 449,901
+821,263 -> 964,263
+162,121 -> 561,520
+31,35 -> 600,604
+622,649 -> 622,97
+33,967 -> 985,15
+877,745 -> 56,745
+688,688 -> 688,385
+227,137 -> 728,638
+839,54 -> 593,54
+662,36 -> 88,610
+845,500 -> 163,500
+131,579 -> 131,592
+632,28 -> 632,387
+335,79 -> 979,79
+33,95 -> 302,95
+981,13 -> 28,966
+737,165 -> 170,732
+869,751 -> 14,751
+420,367 -> 420,949
+623,618 -> 558,553
+964,34 -> 15,983
+567,75 -> 553,75
+674,835 -> 674,886
+374,727 -> 199,552
+880,953 -> 579,953
+320,664 -> 777,207
+290,198 -> 290,689
+405,778 -> 405,253
+801,164 -> 801,766
+722,572 -> 722,721
+704,890 -> 905,890
+80,909 -> 974,909
+50,643 -> 371,964
+903,810 -> 42,810
+451,102 -> 13,102
+944,151 -> 337,758
+781,514 -> 417,514
+875,828 -> 77,30
+551,210 -> 728,210
+280,447 -> 484,447
+934,926 -> 144,136
+341,182 -> 485,182
+611,748 -> 321,458
+135,483 -> 22,483
+590,577 -> 590,307
+962,48 -> 962,95
+285,770 -> 395,880
+740,804 -> 362,426
+942,72 -> 530,484
+750,893 -> 750,725
+707,916 -> 769,978
+424,344 -> 47,344
+267,891 -> 267,955
+718,112 -> 367,463
+917,148 -> 80,985
+679,682 -> 51,682
+72,641 -> 72,729
+717,760 -> 153,196
+600,341 -> 600,312
+530,258 -> 747,258
+703,434 -> 703,266
+381,291 -> 34,291
+889,645 -> 640,645
+488,877 -> 958,407
+263,375 -> 43,155
+865,33 -> 408,33
+373,337 -> 412,337
+584,15 -> 76,15
+431,447 -> 263,447
+176,644 -> 176,875
+603,487 -> 257,487
+857,45 -> 144,758
+833,108 -> 64,877
+23,173 -> 23,156
+175,434 -> 330,434
+988,22 -> 28,982
+26,793 -> 26,680
+164,221 -> 901,958
+832,672 -> 250,90
+805,537 -> 805,600
+393,302 -> 871,302
+633,709 -> 171,247
+833,118 -> 990,118
+806,943 -> 806,447
+348,345 -> 967,964
+825,747 -> 399,321
+976,339 -> 371,339
+857,26 -> 857,737
+348,474 -> 715,474
+260,678 -> 820,678
+735,301 -> 347,689
+150,591 -> 150,838
+538,285 -> 19,804
+845,904 -> 60,119
+440,963 -> 440,586
+500,72 -> 500,819
+772,742 -> 772,828
+737,452 -> 113,452
+238,818 -> 941,115
+123,343 -> 123,639
+927,370 -> 635,78
+373,745 -> 235,745
+140,77 -> 140,262
+517,375 -> 178,714
+72,423 -> 821,423
+437,251 -> 210,251
+170,51 -> 941,822
+135,467 -> 515,467
+886,920 -> 89,123
+374,302 -> 550,478
+289,592 -> 289,557
+79,112 -> 944,977
+303,831 -> 419,831
+369,32 -> 348,53
+404,13 -> 890,499
+377,781 -> 260,781
+288,769 -> 981,76
+924,188 -> 628,188
+399,313 -> 959,313
+970,52 -> 196,826
+623,984 -> 169,984
+572,644 -> 749,644
+426,533 -> 343,533
+94,155 -> 721,782
+328,268 -> 544,268
+878,124 -> 89,913
+966,170 -> 610,526
+108,841 -> 766,183
+115,808 -> 688,235
+45,835 -> 806,74
+152,932 -> 152,938
+229,814 -> 634,409
+649,647 -> 649,850
+437,904 -> 321,904
+115,116 -> 784,785
+19,657 -> 19,415
+831,833 -> 616,833
+88,954 -> 970,72
+11,981 -> 707,285
+261,255 -> 909,903
+883,875 -> 97,89
+872,21 -> 872,820
+34,229 -> 34,690
+10,10 -> 989,989
+986,178 -> 986,963
+413,933 -> 413,907
+897,756 -> 897,88
+771,408 -> 771,468
+327,198 -> 327,421
+938,900 -> 938,721
+533,629 -> 533,661
+177,701 -> 489,389
+601,839 -> 40,278
+969,38 -> 70,937
+797,698 -> 140,41
+794,107 -> 156,745
+730,410 -> 730,727
+115,14 -> 358,14
+608,382 -> 608,959
+457,788 -> 393,788
+592,729 -> 363,500
+742,964 -> 87,309
+230,790 -> 433,587
+302,878 -> 725,455
+353,722 -> 353,512
+219,856 -> 824,856
+92,44 -> 938,890
+547,179 -> 458,90
+953,368 -> 193,368
+767,26 -> 932,26
+883,96 -> 883,311
+679,136 -> 679,656
+32,117 -> 393,478
+619,704 -> 260,704
+101,96 -> 985,980
+169,61 -> 800,692
+545,902 -> 306,902
+948,16 -> 52,912
+546,691 -> 546,887
+611,294 -> 611,324
+942,89 -> 942,688
+34,838 -> 34,734
+68,98 -> 68,876
+485,73 -> 485,779
+573,976 -> 573,364
+331,233 -> 729,631
+616,116 -> 616,432
+909,947 -> 904,947
+901,139 -> 864,102
+289,511 -> 289,371
+269,845 -> 269,597
+934,86 -> 80,940
+18,883 -> 790,111
+154,436 -> 154,464
+628,901 -> 96,901
+573,154 -> 159,154
+118,475 -> 118,339
+12,12 -> 989,989
+44,760 -> 512,760
+45,859 -> 888,16
+103,826 -> 827,102
+41,22 -> 945,926
+769,339 -> 188,339
+136,658 -> 748,46
+297,37 -> 297,160
+261,575 -> 293,543
+910,724 -> 910,634
+30,31 -> 962,963
+747,285 -> 122,910
+451,976 -> 32,976
+558,524 -> 165,524
+631,395 -> 631,48
+584,382 -> 874,382
+246,838 -> 246,980
+750,460 -> 577,460
+736,747 -> 560,747
+604,889 -> 604,150
+206,819 -> 18,819
+989,974 -> 116,101`