+966
2021/day13.txt
+966
2021/day13.txt
···
1
+
428,532
2
+
925,404
3
+
882,362
4
+
44,836
5
+
191,714
6
+
412,36
7
+
688,523
8
+
522,842
9
+
1054,359
10
+
523,413
11
+
388,638
12
+
60,495
13
+
758,148
14
+
381,42
15
+
1017,80
16
+
279,696
17
+
848,508
18
+
922,638
19
+
381,852
20
+
887,822
21
+
500,672
22
+
969,526
23
+
986,760
24
+
102,187
25
+
1232,303
26
+
758,596
27
+
412,820
28
+
320,296
29
+
935,715
30
+
310,308
31
+
129,422
32
+
383,485
33
+
919,786
34
+
261,318
35
+
745,863
36
+
279,179
37
+
628,266
38
+
1185,798
39
+
388,190
40
+
790,788
41
+
775,254
42
+
771,491
43
+
1034,513
44
+
147,689
45
+
1215,178
46
+
1263,739
47
+
949,228
48
+
152,852
49
+
536,444
50
+
359,705
51
+
946,780
52
+
21,863
53
+
395,864
54
+
527,603
55
+
167,856
56
+
877,516
57
+
1046,586
58
+
1146,287
59
+
651,604
60
+
32,383
61
+
75,800
62
+
364,780
63
+
306,470
64
+
689,332
65
+
310,362
66
+
759,451
67
+
70,198
68
+
748,639
69
+
937,795
70
+
515,453
71
+
1113,24
72
+
873,819
73
+
706,99
74
+
1031,179
75
+
60,88
76
+
211,786
77
+
1051,626
78
+
518,490
79
+
341,722
80
+
413,598
81
+
301,772
82
+
238,38
83
+
159,318
84
+
1265,547
85
+
572,803
86
+
557,241
87
+
947,250
88
+
490,781
89
+
1054,191
90
+
1158,148
91
+
388,358
92
+
575,191
93
+
961,826
94
+
723,268
95
+
314,402
96
+
208,612
97
+
433,348
98
+
549,515
99
+
361,814
100
+
410,4
101
+
618,324
102
+
109,75
103
+
1190,599
104
+
207,864
105
+
78,79
106
+
1151,455
107
+
701,362
108
+
135,266
109
+
1250,399
110
+
1072,808
111
+
616,298
112
+
1163,653
113
+
1200,19
114
+
951,789
115
+
518,404
116
+
698,890
117
+
1029,249
118
+
820,781
119
+
930,555
120
+
92,479
121
+
739,367
122
+
623,677
123
+
252,108
124
+
372,612
125
+
668,884
126
+
842,880
127
+
36,794
128
+
395,30
129
+
1305,742
130
+
987,380
131
+
1164,66
132
+
922,582
133
+
1019,512
134
+
678,273
135
+
187,389
136
+
1136,479
137
+
243,527
138
+
209,476
139
+
446,810
140
+
1245,656
141
+
1068,372
142
+
341,526
143
+
770,635
144
+
92,150
145
+
852,175
146
+
619,473
147
+
195,77
148
+
229,464
149
+
218,705
150
+
887,110
151
+
206,519
152
+
684,333
153
+
221,378
154
+
31,217
155
+
477,498
156
+
967,448
157
+
907,551
158
+
947,306
159
+
1072,114
160
+
1153,71
161
+
987,828
162
+
472,504
163
+
937,520
164
+
952,656
165
+
795,291
166
+
795,697
167
+
1120,14
168
+
1019,382
169
+
279,248
170
+
1181,444
171
+
699,833
172
+
535,254
173
+
629,424
174
+
1176,508
175
+
515,155
176
+
1022,359
177
+
253,123
178
+
701,84
179
+
498,72
180
+
1228,834
181
+
65,689
182
+
470,847
183
+
216,875
184
+
836,756
185
+
1279,229
186
+
1221,703
187
+
406,806
188
+
699,285
189
+
415,373
190
+
154,448
191
+
612,331
192
+
632,173
193
+
67,142
194
+
492,172
195
+
512,120
196
+
1185,350
197
+
537,28
198
+
1079,9
199
+
95,379
200
+
231,254
201
+
398,807
202
+
219,816
203
+
189,333
204
+
386,301
205
+
858,456
206
+
361,142
207
+
242,336
208
+
1103,864
209
+
1165,282
210
+
957,794
211
+
256,817
212
+
743,584
213
+
412,372
214
+
261,211
215
+
65,459
216
+
13,789
217
+
1190,410
218
+
1124,61
219
+
681,526
220
+
31,677
221
+
585,304
222
+
679,155
223
+
13,626
224
+
594,120
225
+
415,521
226
+
951,105
227
+
179,848
228
+
895,231
229
+
960,497
230
+
1237,568
231
+
77,374
232
+
678,173
233
+
1222,562
234
+
565,863
235
+
33,218
236
+
1116,432
237
+
559,110
238
+
658,87
239
+
947,25
240
+
43,61
241
+
937,732
242
+
464,880
243
+
969,78
244
+
622,819
245
+
406,634
246
+
796,61
247
+
736,387
248
+
681,470
249
+
641,341
250
+
1144,820
251
+
544,875
252
+
626,701
253
+
1215,640
254
+
1218,479
255
+
192,834
256
+
1031,226
257
+
437,819
258
+
467,837
259
+
570,134
260
+
1260,795
261
+
760,276
262
+
259,864
263
+
877,277
264
+
135,42
265
+
36,548
266
+
31,789
267
+
147,205
268
+
840,847
269
+
269,861
270
+
509,612
271
+
259,101
272
+
1028,164
273
+
423,784
274
+
1020,873
275
+
490,315
276
+
492,378
277
+
412,558
278
+
375,491
279
+
564,399
280
+
324,606
281
+
740,894
282
+
594,806
283
+
812,72
284
+
102,707
285
+
989,857
286
+
460,550
287
+
412,858
288
+
457,24
289
+
663,11
290
+
184,159
291
+
457,712
292
+
616,477
293
+
348,47
294
+
239,455
295
+
279,198
296
+
385,705
297
+
587,414
298
+
1118,386
299
+
929,747
300
+
1235,416
301
+
900,4
302
+
786,623
303
+
36,570
304
+
281,700
305
+
1034,717
306
+
303,453
307
+
50,795
308
+
776,372
309
+
572,333
310
+
863,618
311
+
622,607
312
+
395,133
313
+
1260,39
314
+
937,645
315
+
139,645
316
+
798,679
317
+
281,697
318
+
428,362
319
+
467,603
320
+
604,263
321
+
734,634
322
+
551,451
323
+
1102,58
324
+
164,579
325
+
1006,497
326
+
616,701
327
+
53,241
328
+
872,427
329
+
1302,726
330
+
576,602
331
+
324,288
332
+
216,467
333
+
45,547
334
+
1049,766
335
+
243,303
336
+
53,721
337
+
78,558
338
+
13,618
339
+
609,621
340
+
1062,806
341
+
305,68
342
+
1136,191
343
+
887,885
344
+
157,71
345
+
70,696
346
+
244,442
347
+
949,142
348
+
47,739
349
+
880,596
350
+
45,697
351
+
2,830
352
+
744,758
353
+
1196,187
354
+
296,572
355
+
179,400
356
+
256,369
357
+
912,646
358
+
1290,47
359
+
304,397
360
+
160,306
361
+
290,138
362
+
443,633
363
+
947,158
364
+
43,462
365
+
1094,331
366
+
845,122
367
+
867,633
368
+
31,705
369
+
324,746
370
+
508,138
371
+
607,646
372
+
937,84
373
+
735,255
374
+
1200,875
375
+
1192,276
376
+
349,68
377
+
408,91
378
+
229,502
379
+
229,397
380
+
525,24
381
+
793,561
382
+
932,177
383
+
647,11
384
+
706,263
385
+
50,487
386
+
1225,547
387
+
673,264
388
+
1089,378
389
+
773,756
390
+
986,148
391
+
242,558
392
+
1290,847
393
+
97,379
394
+
731,106
395
+
238,114
396
+
875,78
397
+
850,717
398
+
67,480
399
+
975,683
400
+
95,672
401
+
1089,617
402
+
1171,645
403
+
53,465
404
+
1275,645
405
+
895,663
406
+
10,255
407
+
160,484
408
+
703,646
409
+
1240,807
410
+
1012,197
411
+
523,553
412
+
1290,582
413
+
735,252
414
+
865,583
415
+
872,467
416
+
646,56
417
+
668,458
418
+
13,520
419
+
1009,772
420
+
1034,316
421
+
965,182
422
+
726,817
423
+
1308,87
424
+
540,259
425
+
735,642
426
+
997,78
427
+
92,253
428
+
734,196
429
+
221,635
430
+
576,303
431
+
77,520
432
+
1031,198
433
+
1059,551
434
+
545,523
435
+
447,618
436
+
401,120
437
+
378,401
438
+
1081,877
439
+
281,249
440
+
169,185
441
+
820,315
442
+
681,368
443
+
977,366
444
+
10,395
445
+
358,238
446
+
415,231
447
+
224,596
448
+
517,561
449
+
1267,432
450
+
398,646
451
+
438,467
452
+
293,114
453
+
1215,379
454
+
1257,465
455
+
612,779
456
+
525,444
457
+
25,526
458
+
345,264
459
+
1213,379
460
+
534,596
461
+
1208,806
462
+
716,774
463
+
944,87
464
+
887,784
465
+
957,346
466
+
480,36
467
+
1121,561
468
+
184,774
469
+
1279,189
470
+
790,386
471
+
443,338
472
+
1218,639
473
+
32,735
474
+
1019,420
475
+
562,422
476
+
334,30
477
+
33,80
478
+
965,264
479
+
1051,101
480
+
1279,665
481
+
1144,606
482
+
535,192
483
+
146,586
484
+
1265,473
485
+
33,814
486
+
67,515
487
+
801,282
488
+
1228,333
489
+
536,724
490
+
252,786
491
+
862,331
492
+
694,535
493
+
338,499
494
+
129,472
495
+
1068,336
496
+
88,758
497
+
962,424
498
+
1170,733
499
+
1250,358
500
+
282,164
501
+
698,779
502
+
1230,248
503
+
1150,858
504
+
187,827
505
+
537,583
506
+
845,781
507
+
810,0
508
+
435,78
509
+
20,586
510
+
333,528
511
+
313,301
512
+
256,191
513
+
455,43
514
+
415,567
515
+
1059,103
516
+
462,60
517
+
189,109
518
+
1150,306
519
+
559,603
520
+
549,281
521
+
856,794
522
+
1039,100
523
+
863,52
524
+
944,417
525
+
536,170
526
+
499,479
527
+
1000,308
528
+
283,14
529
+
515,697
530
+
552,124
531
+
1205,525
532
+
333,857
533
+
753,653
534
+
152,596
535
+
576,292
536
+
1278,287
537
+
485,295
538
+
269,705
539
+
1094,875
540
+
241,99
541
+
298,197
542
+
977,857
543
+
622,523
544
+
351,827
545
+
38,477
546
+
848,732
547
+
306,495
548
+
587,142
549
+
1111,851
550
+
514,733
551
+
1205,515
552
+
587,773
553
+
271,794
554
+
1068,36
555
+
706,631
556
+
164,287
557
+
189,785
558
+
925,267
559
+
70,421
560
+
1104,563
561
+
609,532
562
+
539,627
563
+
208,170
564
+
775,702
565
+
415,663
566
+
835,46
567
+
458,175
568
+
310,586
569
+
1113,450
570
+
1183,800
571
+
102,134
572
+
216,147
573
+
105,187
574
+
1266,388
575
+
1279,637
576
+
715,161
577
+
1205,826
578
+
522,550
579
+
783,458
580
+
354,350
581
+
576,784
582
+
734,740
583
+
1129,406
584
+
1226,760
585
+
935,198
586
+
1140,520
587
+
979,739
588
+
845,113
589
+
641,520
590
+
740,50
591
+
612,115
592
+
1232,558
593
+
987,66
594
+
105,707
595
+
378,347
596
+
324,8
597
+
944,872
598
+
425,464
599
+
682,875
600
+
1215,222
601
+
353,445
602
+
853,712
603
+
1205,379
604
+
1059,247
605
+
748,479
606
+
420,191
607
+
835,848
608
+
525,870
609
+
736,646
610
+
261,576
611
+
251,247
612
+
751,110
613
+
689,80
614
+
139,291
615
+
723,773
616
+
758,124
617
+
281,197
618
+
927,409
619
+
840,868
620
+
537,866
621
+
751,603
622
+
271,485
623
+
947,698
624
+
1151,318
625
+
688,819
626
+
907,654
627
+
109,819
628
+
197,892
629
+
35,645
630
+
734,154
631
+
790,60
632
+
401,351
633
+
313,520
634
+
1138,222
635
+
845,794
636
+
433,98
637
+
656,42
638
+
1099,786
639
+
1007,453
640
+
851,77
641
+
783,352
642
+
328,107
643
+
473,406
644
+
885,654
645
+
323,66
646
+
167,38
647
+
669,480
648
+
567,584
649
+
1308,830
650
+
1228,113
651
+
733,72
652
+
1019,474
653
+
2,298
654
+
363,25
655
+
575,703
656
+
363,158
657
+
137,100
658
+
259,416
659
+
242,50
660
+
738,289
661
+
1066,803
662
+
1020,780
663
+
331,439
664
+
957,445
665
+
743,663
666
+
380,339
667
+
371,61
668
+
222,618
669
+
468,432
670
+
535,842
671
+
1081,502
672
+
226,362
673
+
224,298
674
+
291,535
675
+
1195,871
676
+
725,304
677
+
734,751
678
+
23,739
679
+
535,397
680
+
447,842
681
+
448,331
682
+
291,158
683
+
1004,424
684
+
977,264
685
+
438,595
686
+
89,15
687
+
371,304
688
+
616,193
689
+
120,599
690
+
1240,817
691
+
281,362
692
+
383,346
693
+
388,582
694
+
406,536
695
+
1277,80
696
+
145,52
697
+
32,287
698
+
1235,800
699
+
912,87
700
+
32,299
701
+
893,792
702
+
765,75
703
+
962,343
704
+
1019,333
705
+
192,508
706
+
330,311
707
+
986,288
708
+
559,336
709
+
248,634
710
+
157,80
711
+
1071,455
712
+
276,401
713
+
594,658
714
+
281,795
715
+
470,420
716
+
843,603
717
+
313,78
718
+
711,393
719
+
1139,820
720
+
124,759
721
+
805,610
722
+
85,347
723
+
833,396
724
+
1190,779
725
+
93,366
726
+
1173,100
727
+
495,128
728
+
162,154
729
+
1073,123
730
+
562,639
731
+
291,561
732
+
1151,576
733
+
293,786
734
+
585,590
735
+
1307,738
736
+
1123,827
737
+
661,266
738
+
514,161
739
+
1066,386
740
+
570,894
741
+
725,142
742
+
792,404
743
+
259,478
744
+
36,52
745
+
251,240
746
+
43,432
747
+
190,462
748
+
917,576
749
+
244,4
750
+
259,268
751
+
1141,332
752
+
855,291
753
+
1004,47
754
+
162,68
755
+
502,820
756
+
95,178
757
+
1138,670
758
+
266,326
759
+
666,843
760
+
1084,84
761
+
1051,581
762
+
1220,847
763
+
1027,733
764
+
1153,103
765
+
437,75
766
+
708,299
767
+
1274,346
768
+
264,586
769
+
669,520
770
+
890,191
771
+
247,252
772
+
798,215
773
+
300,19
774
+
166,606
775
+
216,651
776
+
385,267
777
+
248,751
778
+
986,606
779
+
950,147
780
+
468,880
781
+
243,815
782
+
1201,819
783
+
423,110
784
+
939,164
785
+
761,505
786
+
1215,515
787
+
179,429
788
+
1233,374
789
+
551,443
790
+
137,337
791
+
1020,394
792
+
1063,642
793
+
1208,760
794
+
972,499
795
+
922,806
796
+
497,103
797
+
420,705
798
+
92,639
799
+
1081,430
800
+
771,788
801
+
654,225
802
+
751,178
803
+
375,179
804
+
1265,697
805
+
497,743
806
+
331,455
807
+
20,84
808
+
70,817
809
+
1192,450
810
+
835,465
811
+
415,788
812
+
1285,449
813
+
986,135
814
+
699,609
815
+
1222,786
816
+
629,526
817
+
291,512
818
+
1133,172
819
+
924,593
820
+
5,742
821
+
840,287
822
+
893,123
823
+
242,396
824
+
846,462
825
+
410,605
826
+
88,562
827
+
1215,626
828
+
1036,523
829
+
571,367
830
+
1079,885
831
+
425,465
832
+
1158,852
833
+
1218,641
834
+
692,394
835
+
1260,99
836
+
515,291
837
+
990,416
838
+
276,130
839
+
1161,284
840
+
935,226
841
+
843,505
842
+
738,803
843
+
1310,852
844
+
3,738
845
+
288,359
846
+
783,291
847
+
474,756
848
+
689,590
849
+
125,350
850
+
269,259
851
+
102,806
852
+
82,60
853
+
244,803
854
+
977,630
855
+
927,548
856
+
1274,570
857
+
1196,707
858
+
698,563
859
+
115,871
860
+
279,403
861
+
87,231
862
+
1068,74
863
+
652,746
864
+
1057,95
865
+
1282,417
866
+
485,709
867
+
1304,598
868
+
1282,193
869
+
95,515
870
+
647,435
871
+
433,277
872
+
895,106
873
+
70,807
874
+
244,91
875
+
646,838
876
+
748,33
877
+
587,827
878
+
641,480
879
+
1278,299
880
+
1171,301
881
+
1297,268
882
+
50,347
883
+
1089,169
884
+
701,25
885
+
211,338
886
+
1243,379
887
+
13,268
888
+
348,424
889
+
595,733
890
+
616,596
891
+
787,525
892
+
120,779
893
+
423,864
894
+
634,532
895
+
242,844
896
+
873,75
897
+
1267,730
898
+
502,746
899
+
281,173
900
+
822,750
901
+
402,108
902
+
694,701
903
+
206,666
904
+
927,841
905
+
341,816
906
+
594,47
907
+
1067,815
908
+
118,892
909
+
166,807
910
+
95,626
911
+
403,654
912
+
454,100
913
+
59,609
914
+
895,788
915
+
721,241
916
+
676,532
917
+
74,310
918
+
333,485
919
+
1029,84
920
+
830,36
921
+
599,501
922
+
1218,749
923
+
417,123
924
+
1057,123
925
+
694,193
926
+
324,512
927
+
179,494
928
+
842,432
929
+
979,439
930
+
155,479
931
+
1161,610
932
+
187,515
933
+
930,339
934
+
1183,291
935
+
393,318
936
+
1290,532
937
+
788,550
938
+
785,291
939
+
947,830
940
+
1186,759
941
+
867,556
942
+
748,861
943
+
460,177
944
+
713,852
945
+
358,572
946
+
507,633
947
+
1265,421
948
+
631,155
949
+
1243,414
950
+
1222,108
951
+
229,430
952
+
715,285
953
+
818,131
954
+
955
+
fold along x=655
956
+
fold along y=447
957
+
fold along x=327
958
+
fold along y=223
959
+
fold along x=163
960
+
fold along y=111
961
+
fold along x=81
962
+
fold along y=55
963
+
fold along x=40
964
+
fold along y=27
965
+
fold along y=13
966
+
fold along y=6
+92
2021/solutions.livemd
+92
2021/solutions.livemd
···
1067
1067
```output
1068
1068
98441
1069
1069
```
1070
+
1071
+
## Day 13
1072
+
1073
+
```elixir
1074
+
[input, folds] =
1075
+
File.read!("day13.txt")
1076
+
|> String.trim()
1077
+
|> String.split("\n\n")
1078
+
1079
+
input =
1080
+
input
1081
+
|> String.split("\n")
1082
+
|> Enum.map(fn line ->
1083
+
[x, y] = String.split(line, ",")
1084
+
1085
+
{String.to_integer(x), String.to_integer(y)}
1086
+
end)
1087
+
|> MapSet.new()
1088
+
1089
+
folds =
1090
+
folds
1091
+
|> String.split("\n")
1092
+
|> Enum.map(fn
1093
+
"fold along " <> <<c>> <> "=" <> rest ->
1094
+
{String.to_atom(<<c>>), String.to_integer(rest)}
1095
+
end)
1096
+
1097
+
defmodule Day13 do
1098
+
def fold({orientation, pos}, set) do
1099
+
Enum.reduce(set, MapSet.new(), fn point, acc ->
1100
+
new_point = folded_coords(orientation, pos, point)
1101
+
1102
+
MapSet.put(acc, new_point)
1103
+
end)
1104
+
end
1105
+
1106
+
defp folded_coords(:x, col, {x, y}) when x > col, do: {abs(2 * col - x), y}
1107
+
defp folded_coords(:y, row, {x, y}) when y > row, do: {x, abs(2 * row - y)}
1108
+
defp folded_coords(_, _, point), do: point
1109
+
1110
+
def draw(set) do
1111
+
set
1112
+
|> Enum.group_by(&elem(&1, 1))
1113
+
|> Enum.sort()
1114
+
|> Enum.map(fn {_, points} ->
1115
+
points
1116
+
|> Enum.map(&elem(&1, 0))
1117
+
|> Enum.sort()
1118
+
|> Enum.chunk_every(2, 1)
1119
+
|> Enum.map(fn
1120
+
[a, b] -> b - a
1121
+
_ -> 0
1122
+
end)
1123
+
|> Enum.map(&String.pad_trailing("█", &1, " "))
1124
+
end)
1125
+
|> Enum.join("\n")
1126
+
end
1127
+
end
1128
+
```
1129
+
1130
+
```output
1131
+
{:module, Day13, <<70, 79, 82, 49, 0, 0, 13, ...>>, {:draw, 1}}
1132
+
```
1133
+
1134
+
```elixir
1135
+
Day13.fold(hd(folds), input) |> MapSet.size()
1136
+
```
1137
+
1138
+
```output
1139
+
802
1140
+
```
1141
+
1142
+
```elixir
1143
+
Enum.reduce(folds, input, &Day13.fold/2)
1144
+
|> Day13.draw()
1145
+
|> IO.puts()
1146
+
```
1147
+
1148
+
```output
1149
+
███ █ █ █ █ ████ ████ ██ █ █ ███
1150
+
█ █ █ █ █ █ █ █ █ █ █ █ █ █
1151
+
█ █ ██ ████ ███ █ █ █ █ ███
1152
+
███ █ █ █ █ █ █ █ ██ █ █ █ █
1153
+
█ █ █ █ █ █ █ █ █ █ █ █ █ █
1154
+
█ █ █ █ █ █ █ ████ ███ ██ ███
1155
+
```
1156
+
1157
+
```output
1158
+
:ok
1159
+
```
1160
+
1161
+
## Day 14