summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Smeding <tom@tomsmeding.com>2021-12-13 23:06:49 +0100
committerTom Smeding <tom@tomsmeding.com>2021-12-13 23:06:49 +0100
commita2badabe58116509960ad3406b2126e6d3c500c2 (patch)
treef950984051e518ed7136f13fde1bec8d526f5aad
parent43c9eeb5cfa3007d61883b32f30766e381516560 (diff)
13
-rw-r--r--2021/13.hs49
-rw-r--r--2021/13.in987
2 files changed, 1036 insertions, 0 deletions
diff --git a/2021/13.hs b/2021/13.hs
new file mode 100644
index 0000000..8e6c664
--- /dev/null
+++ b/2021/13.hs
@@ -0,0 +1,49 @@
+{-# LANGUAGE TupleSections #-}
+module Main where
+
+import qualified Data.Array as A
+import Data.List
+
+import Input
+import Util
+
+
+uniq :: Eq a => [a] -> [a]
+uniq (x : y : xs) | x == y = uniq (y : xs)
+ | otherwise = x : uniq (y : xs)
+uniq l = l
+
+generate :: A.Ix i => (i, i) -> (i -> a) -> A.Array i a
+generate bounds f = A.listArray bounds (map f (A.range bounds))
+
+main :: IO ()
+main = do
+ inp <- getInput 13
+ let pointstrs :| foldstrs:_ = splitOn null inp
+ points :: [(Int, Int)]
+ points = map (\s -> let [a,b] = toList (splitOn (== ',') s) in (read a, read b)) pointstrs
+ folds :: [(Char, Int)]
+ folds = map (\s -> let [a,b] = toList (splitOn (== '=') s) in (last a, read b)) foldstrs
+ minmax = (,) <$> minimum <*> maximum
+ arr0 = let (x1, x2) = minmax (map fst points)
+ (y1, y2) = minmax (map snd points)
+ in A.accumArray (+) 0 ((x1, y1), (x2, y2)) (map (,1::Int) points)
+ at arr idx | A.inRange (A.bounds arr) idx = arr A.! idx
+ | otherwise = 0
+ doFold 'x' lim arr =
+ let ((x1, y1), (x2, y2)) = A.bounds arr
+ in generate ((min x1 (lim - (x2 - lim)), y1), (lim - 1, y2)) $ \(x, y) ->
+ arr `at` (x, y) + arr `at` (lim + (lim - x), y)
+ doFold 'y' lim arr =
+ let ((x1, y1), (x2, y2)) = A.bounds arr
+ in generate ((x1, min y1 (lim - (y2 - lim))), (x2, lim - 1)) $ \(x, y) ->
+ arr `at` (x, y) + arr `at` (x, lim + (lim - y))
+ doFold _ _ _ = error "rip"
+ nvisible = length . filter (>0) . A.elems
+ draw arr =
+ let ((x1, y1), (x2, y2)) = A.bounds arr
+ in unlines [concat [if arr A.! (x, y) > 0 then "█" else "·"
+ | x <- [x1..x2]]
+ | y <- [y1..y2]]
+ print (nvisible (let (dir, lim) = head folds in doFold dir lim arr0))
+ putStr (draw (foldl' (\arr (dir, lim) -> doFold dir lim arr) arr0 folds))
diff --git a/2021/13.in b/2021/13.in
new file mode 100644
index 0000000..792ffa5
--- /dev/null
+++ b/2021/13.in
@@ -0,0 +1,987 @@
+982,10
+1094,887
+895,815
+1216,453
+1258,747
+162,663
+552,568
+271,662
+333,863
+1252,65
+1009,687
+900,887
+199,273
+254,352
+345,787
+688,502
+825,325
+137,879
+1258,467
+547,42
+251,275
+446,628
+108,84
+1257,668
+1141,316
+679,548
+930,831
+463,700
+785,393
+485,578
+678,78
+1047,37
+1123,613
+586,535
+65,275
+1233,665
+137,15
+1115,210
+306,890
+946,234
+959,122
+518,814
+229,204
+985,439
+44,534
+48,838
+1258,483
+237,250
+763,852
+1134,117
+857,324
+674,310
+1032,537
+1148,809
+900,623
+549,178
+157,137
+721,247
+244,623
+584,351
+438,518
+527,674
+1292,86
+977,618
+420,667
+1170,812
+445,627
+438,887
+224,814
+1263,197
+738,409
+1262,504
+393,199
+1302,16
+259,50
+934,357
+470,451
+460,414
+552,684
+585,789
+1131,367
+23,346
+1089,245
+827,42
+200,819
+917,666
+1295,807
+58,289
+678,816
+1201,497
+176,320
+269,716
+130,602
+826,854
+758,344
+1009,262
+499,60
+1191,329
+905,453
+1262,761
+180,82
+162,309
+189,658
+547,341
+460,793
+1285,434
+162,809
+189,684
+48,761
+708,147
+378,884
+15,807
+751,395
+1163,831
+708,35
+484,40
+827,597
+1243,789
+15,620
+281,381
+944,773
+221,875
+1203,456
+1126,3
+1272,325
+137,572
+518,528
+171,297
+1073,644
+711,753
+137,836
+902,210
+90,318
+976,532
+185,546
+1272,345
+681,465
+796,82
+826,317
+208,628
+1255,680
+77,665
+1183,526
+181,647
+857,570
+290,884
+294,406
+974,767
+974,575
+596,381
+1148,757
+1164,28
+1215,340
+850,190
+89,740
+661,651
+1310,75
+893,602
+999,870
+1113,379
+1300,135
+925,551
+596,737
+770,404
+662,653
+184,136
+6,294
+930,483
+713,579
+803,24
+763,135
+585,105
+694,325
+179,611
+699,278
+82,572
+147,831
+661,549
+18,361
+1164,448
+976,362
+1205,492
+663,54
+912,127
+1240,44
+813,345
+740,243
+1014,10
+530,121
+1222,308
+218,702
+710,341
+1057,250
+0,317
+961,124
+57,271
+585,278
+1190,627
+671,172
+716,579
+1081,432
+782,422
+179,472
+1101,388
+263,597
+1226,651
+982,458
+796,760
+467,579
+1146,663
+1228,322
+914,217
+382,894
+872,518
+363,99
+209,53
+1148,585
+475,646
+38,345
+458,852
+319,278
+200,747
+1141,662
+648,241
+140,642
+887,453
+120,179
+623,679
+1283,539
+508,28
+383,5
+1170,642
+716,331
+420,543
+262,807
+237,154
+927,835
+857,122
+1019,795
+753,652
+518,808
+140,700
+996,789
+719,149
+127,220
+890,799
+768,393
+253,250
+1091,365
+1036,707
+45,211
+1079,117
+57,789
+845,98
+977,326
+751,843
+320,824
+397,434
+140,194
+448,235
+1146,585
+60,255
+1251,605
+594,331
+597,346
+1213,652
+1111,273
+82,85
+619,289
+89,74
+1021,558
+18,808
+376,357
+415,815
+137,711
+647,54
+619,605
+1061,441
+425,690
+905,217
+216,875
+555,73
+671,807
+1310,317
+1273,425
+1136,494
+1200,824
+527,560
+1258,259
+775,329
+1101,53
+288,325
+206,101
+67,423
+473,602
+806,768
+1221,740
+699,502
+453,122
+1279,175
+557,320
+877,649
+251,619
+474,84
+1203,553
+217,688
+1130,476
+557,126
+214,477
+293,449
+714,157
+749,117
+549,850
+333,774
+925,445
+600,362
+1305,91
+934,628
+326,877
+1192,259
+582,576
+68,117
+301,499
+596,157
+883,796
+599,889
+766,287
+982,595
+468,312
+430,219
+1041,716
+649,243
+1116,345
+768,865
+412,355
+1052,105
+1198,571
+497,773
+1081,14
+1084,309
+293,445
+542,865
+1119,86
+930,747
+716,315
+1034,10
+1278,406
+934,852
+514,760
+164,232
+497,809
+1155,644
+1304,294
+1173,15
+600,782
+187,281
+852,42
+1056,352
+763,589
+185,98
+80,747
+1238,318
+140,252
+818,679
+80,658
+499,698
+95,51
+320,70
+984,877
+318,319
+234,227
+421,777
+187,21
+60,563
+1057,644
+395,641
+403,171
+458,70
+445,659
+597,623
+60,479
+37,105
+820,309
+32,392
+1086,366
+353,744
+82,124
+507,24
+474,866
+1079,441
+273,194
+1170,252
+416,572
+326,429
+1052,329
+562,239
+689,841
+591,149
+1089,651
+826,488
+274,383
+959,469
+1292,310
+719,597
+990,308
+673,471
+686,10
+1102,259
+1208,326
+17,23
+761,626
+1166,422
+328,884
+278,852
+1241,278
+263,37
+244,53
+843,579
+990,362
+755,423
+446,259
+335,610
+393,703
+1108,569
+836,84
+170,742
+765,170
+970,105
+465,658
+714,737
+763,813
+303,469
+992,575
+1145,567
+10,135
+12,264
+792,534
+810,575
+209,235
+52,35
+537,627
+1123,281
+517,183
+1033,208
+343,696
+1245,275
+991,616
+596,605
+1228,533
+656,436
+950,831
+880,770
+781,234
+1153,549
+1130,364
+380,595
+365,660
+185,12
+474,810
+547,852
+726,351
+639,172
+334,756
+69,168
+1304,742
+1184,422
+231,453
+1213,242
+856,299
+288,569
+636,584
+1104,101
+835,611
+1081,515
+1241,504
+1153,773
+156,40
+662,488
+544,287
+1310,10
+1153,345
+137,183
+1163,876
+1121,731
+518,360
+473,647
+1255,214
+242,355
+970,341
+333,618
+180,250
+716,663
+380,511
+776,627
+380,747
+802,0
+1295,620
+925,343
+636,86
+246,7
+874,362
+333,887
+75,198
+261,666
+793,836
+827,149
+130,292
+1146,309
+793,711
+974,127
+1134,544
+796,812
+989,618
+430,80
+497,85
+1009,150
+80,595
+343,847
+740,651
+629,520
+1163,422
+363,347
+984,429
+1253,579
+341,498
+435,789
+1207,294
+492,348
+127,674
+549,47
+661,354
+622,502
+759,294
+930,595
+1218,655
+144,757
+910,749
+1203,135
+796,816
+1253,693
+693,336
+874,282
+649,578
+334,653
+380,63
+656,765
+560,553
+457,1
+237,644
+984,884
+542,323
+55,589
+770,40
+512,218
+112,393
+1036,187
+219,38
+837,247
+360,392
+1253,5
+808,46
+631,346
+782,248
+37,10
+301,262
+87,463
+781,525
+803,831
+179,367
+229,880
+1004,442
+1126,891
+147,63
+381,418
+32,502
+483,490
+954,518
+1084,361
+52,427
+545,497
+408,371
+827,404
+1211,423
+528,248
+135,497
+436,362
+52,707
+713,623
+462,824
+1285,15
+187,613
+825,578
+130,490
+495,441
+237,602
+508,194
+393,666
+1037,476
+1121,796
+1036,511
+1193,625
+982,884
+1064,147
+725,12
+291,617
+919,597
+108,560
+328,877
+403,723
+484,294
+627,355
+763,81
+109,2
+691,289
+453,570
+190,814
+271,232
+1278,488
+907,171
+1015,231
+945,201
+1221,74
+1086,120
+254,542
+1081,686
+826,294
+393,695
+504,126
+836,810
+1130,530
+749,329
+5,540
+1267,145
+1125,546
+766,824
+572,389
+1295,422
+1051,844
+88,124
+1230,595
+890,95
+169,680
+164,214
+1094,7
+930,35
+1094,831
+813,773
+753,320
+525,515
+290,635
+25,744
+629,15
+1076,799
+1089,875
+1173,711
+880,124
+181,602
+103,294
+930,299
+542,193
+95,395
+0,877
+340,630
+599,441
+864,259
+1129,602
+364,187
+890,667
+929,220
+865,501
+1202,84
+877,243
+18,533
+792,814
+1272,569
+873,276
+155,834
+853,1
+1148,886
+764,670
+1230,236
+585,385
+108,670
+1088,605
+436,702
+818,546
+15,870
+551,294
+410,299
+810,319
+1081,242
+975,610
+1066,361
+333,467
+1215,395
+432,289
+408,147
+639,807
+305,124
+152,232
+602,187
+1053,49
+244,85
+191,86
+1096,234
+82,147
+782,646
+1081,208
+852,852
+928,58
+43,278
+57,665
+1217,609
+437,838
+462,376
+525,893
+524,292
+738,837
+52,187
+872,159
+261,247
+873,504
+169,662
+1129,647
+385,178
+200,595
+562,655
+249,453
+1262,56
+103,600
+278,357
+930,147
+229,275
+48,504
+229,462
+547,135
+1089,467
+761,492
+15,274
+1228,847
+383,423
+609,795
+880,568
+811,250
+888,399
+927,59
+1139,597
+192,518
+977,887
+483,404
+1037,504
+1253,229
+448,101
+522,380
+545,728
+95,340
+864,266
+1292,808
+142,676
+1215,843
+401,708
+880,331
+162,886
+967,422
+1175,497
+157,533
+1295,274
+48,56
+547,813
+898,539
+1126,443
+932,458
+1059,619
+184,539
+547,387
+274,411
+925,178
+484,317
+589,320
+589,23
+915,105
+1171,794
+459,684
+1245,890
+217,618
+828,15
+57,5
+469,546
+967,696
+674,533
+475,395
+361,561
+165,567
+699,33
+676,4
+761,268
+863,257
+200,75
+396,217
+470,193
+929,418
+124,345
+162,585
+60,639
+376,728
+43,145
+37,425
+751,106
+318,767
+570,243
+656,129
+508,0
+528,24
+80,819
+555,471
+1036,383
+1027,705
+599,141
+195,210
+157,361
+586,105
+364,707
+1305,757
+1072,348
+711,305
+959,91
+381,674
+1015,679
+311,198
+222,605
+528,870
+1180,602
+1165,740
+499,834
+229,242
+1037,838
+1118,824
+1064,684
+679,133
+1285,744
+192,376
+196,70
+710,500
+1006,101
+1131,472
+632,78
+1119,808
+902,371
+691,347
+159,5
+378,436
+594,31
+758,568
+962,679
+257,105
+425,652
+328,465
+1020,635
+433,649
+1121,658
+1071,82
+1093,56
+755,471
+761,21
+93,609
+179,646
+100,585
+295,231
+1283,91
+1173,431
+557,652
+396,341
+992,319
+320,308
+1146,231
+216,600
+1258,635
+700,360
+94,341
+913,789
+1068,91
+1250,639
+502,232
+1115,658
+102,98
+1203,507
+1191,565
+401,260
+599,453
+602,147
+60,679
+706,169
+114,854
+1141,680
+360,831
+738,505
+1086,80
+1170,700
+946,707
+1064,7
+126,422
+1004,890
+544,607
+1170,526
+801,824
+117,267
+1267,189
+928,894
+701,795
+865,267
+274,467
+31,719
+43,705
+396,553
+484,630
+758,684
+107,456
+542,501
+365,201
+572,837
+144,137
+333,7
+77,229
+1243,105
+1165,824
+194,414
+333,455
+172,431
+1086,774
+765,497
+1128,86
+328,299
+892,318
+504,768
+545,892
+157,757
+565,74
+753,59
+773,267
+1215,51
+383,59
+710,112
+1235,143
+895,79
+1104,316
+31,175
+517,611
+1203,387
+544,635
+872,887
+1201,28
+1037,390
+460,190
+835,248
+438,691
+677,348
+277,208
+1056,542
+765,688
+985,455
+340,105
+1039,507
+1019,347
+703,88
+88,586
+589,275
+639,759
+1051,50
+1121,684
+23,735
+52,483
+1125,12
+492,585
+840,539
+
+fold along x=655
+fold along y=447
+fold along x=327
+fold along y=223
+fold along x=163
+fold along y=111
+fold along x=81
+fold along y=55
+fold along x=40
+fold along y=27
+fold along y=13
+fold along y=6