add day 14

[?]
Dec 14, 2020, 10:08 PM
WKDYPIFFZEJJMOSHO762UWJRDLFI5K4W2EOJA2JT3TBLKFCSS4CAC

Dependencies

Change contents

  • file addition: 14 (dxwrx-rx-r)
    [1.0]
  • file addition: small2.txt (-xw-x--x--)
    [0.5]
    mask = 000000000000000000000000000000X1001X
    mem[42] = 100
    mask = 00000000000000000000000000000000X0XX
    mem[26] = 1
  • file addition: small.txt (-xw-x--x--)
    [0.5]
    mask = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X
    mem[8] = 11
    mem[7] = 101
    mem[8] = 0
  • file addition: mask.hs (-xw-x--x--)
    [0.5]
    import Control.Applicative
    import Data.List
    import qualified Data.Map.Strict as M
    data Bit = Zero | One deriving (Show)
    type Mask = [Maybe Bit]
    data State = St
    { getMemory :: M.Map Integer [Bit],
    getMask :: Mask
    }
    parseMask :: String -> Mask
    parseMask = map indiv
    where
    indiv 'X' = Nothing
    indiv '1' = Just One
    indiv '0' = Just Zero
    applyMask :: Mask -> [Bit] -> [Bit]
    applyMask = zipWith maskBit
    where
    maskBit Nothing x = x
    maskBit (Just y) _ = y
    intToBits :: Integer -> [Bit]
    intToBits = leftpad 36 . reverse . go
    where
    go 0 = []
    go n = (if n `mod` 2 == 1 then One else Zero) : go (n `div` 2)
    leftpad m xs = replicate (m - length xs) Zero ++ xs
    bitsToInt :: [Bit] -> Integer
    bitsToInt = go . reverse
    where
    go [] = 0
    go (Zero : xs) = 2 * go xs
    go (One : xs) = 1 + 2 * go xs
    runInstr :: State -> String -> State
    runInstr (St mem mask) s =
    case words s of
    "mask" : "=" : rest -> St mem (parseMask $ concat rest)
    ('m' : 'e' : 'm' : '[' : num) : "=" : rest ->
    let index = read $ take (length num - 1) num
    n = intToBits $ read $ concat $ rest
    mem' = M.insert index (applyMask mask n) mem
    in St mem' mask
    _ -> undefined
    solveOne :: String -> Integer
    solveOne =
    M.foldr ((+) . bitsToInt) 0
    . getMemory
    . foldl runInstr (St M.empty (replicate 36 Nothing))
    . lines
    applyMaskV2 :: Mask -> [Bit] -> [Integer]
    applyMaskV2 m = map bitsToInt . foldr (liftA2 (:)) [[]] . zipWith maskBit m
    where
    maskBit Nothing _ = [Zero, One]
    maskBit (Just One) _ = [One]
    maskBit (Just Zero) n = [n]
    runInstrV2 :: State -> String -> State
    runInstrV2 (St mem mask) s =
    case words s of
    "mask" : "=" : rest -> St mem (parseMask $ concat rest)
    ('m' : 'e' : 'm' : '[' : num) : "=" : rest ->
    let index = intToBits $ read $ take (length num - 1) num
    indices = applyMaskV2 mask index
    n = intToBits $ read $ concat $ rest
    mem' = foldr (flip M.insert n) mem indices
    in St mem' mask
    _ -> undefined
    solveTwo :: String -> Integer
    solveTwo =
    M.foldr ((+) . bitsToInt) 0
    . getMemory
    . foldl runInstrV2 (St M.empty (replicate 36 Nothing))
    . lines
  • file addition: input.txt (-xw-x--x--)
    [0.5]
    mask = 0101111110011010X110100010X100000XX0
    mem[46424] = 216719
    mem[43628] = 6647
    mem[21582] = 4737255
    mem[62945] = 25540
    mem[14304] = 1226
    mask = X100010101X111100X1000000000X1X01101
    mem[61719] = 43
    mem[29889] = 539182
    mem[20432] = 81037
    mem[19130] = 84833888
    mem[62957] = 257066
    mask = 1100110100000X01011100X011X10111101X
    mem[23466] = 760341642
    mem[52847] = 2953
    mem[19579] = 337454817
    mask = 11000100X00X101X0101000X101011X10010
    mem[11088] = 486068
    mem[20832] = 1783932
    mem[40903] = 22837
    mem[52523] = 916767
    mem[33536] = 69899
    mem[29213] = 922168
    mem[19898] = 2527744
    mask = 0X0000010X011X100000011XX1XX10001000
    mem[30153] = 10168
    mem[10353] = 99745
    mem[64464] = 228084499
    mask = 01X0XX010011X1100X11010010X0X100100X
    mem[39767] = 183317
    mem[8681] = 31397
    mem[26082] = 214138
    mem[7692] = 1784975
    mask = 0100X1X01X010011X1110000011001100000
    mem[37247] = 260760
    mem[14360] = 2426139
    mem[47677] = 7192080
    mask = 00001XX1100X0010110011X0XX0001X0010X
    mem[4309] = 297242075
    mem[64075] = 893494359
    mask = 110X1011100000X0XX00110100X00001XXXX
    mem[55914] = 438425130
    mem[49344] = 16510528
    mem[2674] = 28909
    mem[35317] = 238296302
    mem[18530] = 109875262
    mask = X10X01010011101X0X1000101X1111X0X0X0
    mem[12244] = 2199
    mem[56582] = 2862764
    mem[8393] = 3831
    mem[54761] = 16511
    mem[23804] = 311190
    mem[2775] = 28757
    mem[2635] = 1816435
    mask = 0X001X11100X10100X10X1X010X1101X0011
    mem[39770] = 124269
    mem[42638] = 52020
    mem[19450] = 864925
    mem[6838] = 8985514
    mem[17628] = 1212
    mask = 010001110111000111X0X01X00000000X001
    mem[18199] = 1424733
    mem[32849] = 234584243
    mem[6180] = 1017017
    mask = 0100000100X1X110X0000001XX0010X01X00
    mem[56497] = 6674
    mem[30862] = 13749640
    mem[24832] = 3266046
    mem[7480] = 19674454
    mem[50124] = 475830721
    mem[41122] = 59014242
    mem[56513] = 2403
    mask = 010010010001X00011100100000XX10100X0
    mem[50501] = 591395
    mem[34019] = 18696205
    mem[53288] = 5905
    mem[61133] = 92733
    mem[22325] = 13533198
    mem[36300] = 298891
    mem[59419] = 27121
    mask = 0X0001011001100XX11001000X1XX0001100
    mem[50238] = 46859845
    mem[65438] = 42469
    mem[23966] = 416
    mem[5730] = 15529
    mem[61033] = 194705034
    mem[54747] = 467381
    mem[38123] = 1472
    mask = 01000X010X011X100XX001X1010X11001XX0
    mem[50501] = 3572
    mem[4293] = 3456022
    mem[19192] = 1372334
    mem[11565] = 326290168
    mem[51595] = 18690
    mask = XX00X0X11000X01011001100X00011X1X0X0
    mem[51539] = 768
    mem[20597] = 12720
    mem[23426] = 324
    mem[39084] = 50404
    mask = 11X011011001X00XX111X00X10001X111000
    mem[18530] = 29878596
    mem[22804] = 347574684
    mem[22057] = 84333
    mem[2158] = 181745
    mask = 00XX00X110001010110X1101101001100010
    mem[9903] = 188600558
    mem[34677] = 15095860
    mem[44413] = 28541
    mem[35346] = 3955
    mem[58279] = 3413218
    mem[16962] = 9299049
    mask = 0100010101X11010X1000X0100X01X0010X1
    mem[42770] = 92786
    mem[29697] = 41035
    mem[37048] = 76494
    mask = 1000XX0X000011111X00110010XX10X1X110
    mem[38455] = 14997231
    mem[13916] = 191608
    mem[42447] = 37002175
    mem[50769] = 11134486
    mask = 11000100X0001XX0110XX1X11110X100X01X
    mem[27059] = 70716919
    mem[20721] = 24389442
    mem[6528] = 20075
    mem[22804] = 530695189
    mask = 1100X1X0X0X11100X1110110010111000000
    mem[34446] = 6853
    mem[6030] = 22765
    mem[33379] = 2375
    mem[5227] = 752687947
    mask = 1X000100X0001X10110000X000101XXX0110
    mem[21606] = 262401340
    mem[60001] = 1568637
    mem[19993] = 4349
    mask = 1X0X10000011X0001X1001101100000X1100
    mem[10542] = 217555392
    mem[14979] = 509322
    mem[59366] = 750
    mem[27370] = 541
    mem[8868] = 218418760
    mem[34962] = 5044
    mask = 1110X001X01010X11X10XX01000X1XX11101
    mem[58614] = 5182291
    mem[58120] = 1120048
    mem[23196] = 3963
    mem[42638] = 8965505
    mem[40895] = 4284430
    mask = 11X1100000111000X110X1X001110XX11X10
    mem[63215] = 8080556
    mem[61017] = 32038853
    mem[16644] = 944501
    mask = 1100X10X100X101XX1X10001X01011110000
    mem[52847] = 3803671
    mem[20850] = 7808415
    mem[8712] = 144288
    mem[58787] = 6
    mem[64997] = 445837702
    mem[41100] = 37513016
    mem[13520] = 973
    mask = 1X100X0X00XX1X011X1000001X0110X01110
    mem[32333] = 1744
    mem[56029] = 299
    mem[25784] = 31286
    mem[43862] = 51049
    mem[58782] = 2944
    mem[17428] = 75751931
    mask = X100X10X00X11000111X0000100X010X1X11
    mem[12260] = 6122
    mem[48663] = 460
    mem[64075] = 183608631
    mem[63027] = 13796
    mask = X10001X1000010XX11000X11011110X10001
    mem[49801] = 67831561
    mem[54914] = 10434056
    mask = 11X0X1X10001100X111XX10X010110011000
    mem[7898] = 458939
    mem[23966] = 79878872
    mem[19878] = 3625210
    mem[58431] = 540
    mem[3348] = 7862654
    mem[3412] = 118574
    mask = 1100010X100X1XX0110X0X10XX0010101011
    mem[12015] = 731
    mem[8185] = 209550192
    mem[29616] = 17919178
    mem[6158] = 1618787
    mem[31085] = 2050168
    mem[49943] = 905915
    mask = 01X0X00XX0X11011X1000X00XX0011010010
    mem[7308] = 2041
    mem[2769] = 264056059
    mem[52380] = 7334932
    mem[53511] = 2554
    mask = XX0001X10001100X1110X10X100110011100
    mem[26838] = 5813
    mem[50268] = 264384570
    mem[130] = 87338
    mem[413] = 1000391
    mem[17628] = 65356685
    mem[55309] = 165547
    mask = 01X0X10X11011X100XX001X00101X11X1001
    mem[16368] = 4140505
    mem[44899] = 1721205
    mem[27560] = 133
    mask = 01000X01011X0001111001111XXX01110X0X
    mem[11565] = 13877443
    mem[28465] = 66870471
    mem[5232] = 537178
    mem[62602] = 27657281
    mask = 1100110010011X00111X000011XXX0X010XX
    mem[2576] = 971803
    mem[36877] = 5560
    mem[40103] = 643868
    mask = X100110X1X01X01X11110X110X00X1111000
    mem[56749] = 81
    mem[15008] = 182232225
    mem[3329] = 11184975
    mask = 01X001X10111X0011X10001100000001X0X1
    mem[24430] = 874925389
    mem[33402] = 23932396
    mem[7393] = 2756629
    mem[45138] = 974627
    mask = 0X000X0100011X1XX1100X0000X111X01000
    mem[16564] = 811253
    mem[23329] = 81876
    mem[17685] = 43268701
    mem[27546] = 1472091
    mem[2102] = 445258
    mask = 0X00X101XX01111000X0100011X10X00011X
    mem[61642] = 3296
    mem[61163] = 162776570
    mem[59415] = 3057
    mask = 01X00001X01X111X00000X0X0XX1100X0010
    mem[51782] = 103
    mem[37951] = 1911
    mem[38455] = 1691
    mask = 1X0001XX00001X1X1100X10101101XX1X010
    mem[39885] = 350996156
    mem[2248] = 1302
    mem[4174] = 1746120
    mem[7046] = 387007
    mem[7898] = 200
    mem[62427] = 219368
    mask = 1100110X100110001110000X101X00010X00
    mem[52738] = 3017585
    mem[60907] = 274499319
    mem[44127] = 198066
    mem[7008] = 15737
    mem[5838] = 24930
    mem[1196] = 626
    mem[760] = 125926
    mask = 110X11X1001X1000111010101X1X001101X1
    mem[58787] = 131362883
    mem[63206] = 1662
    mem[16764] = 29008042
    mem[44650] = 11562940
    mask = 010001X00001XX100XX0111011X000101101
    mem[20597] = 8035
    mem[24694] = 21315464
    mem[21329] = 25433146
    mem[11666] = 501845791
    mem[13072] = 46538
    mask = 00001X1XX0001010011X0100XX111X11010X
    mem[34466] = 17022332
    mem[43116] = 759445
    mem[49228] = 1468
    mem[50795] = 905170
    mask = X10X01010X11100110101001X00XX1X10011
    mem[14354] = 44435828
    mem[13870] = 57828837
    mem[46810] = 9681
    mem[55942] = 12919869
    mem[30769] = 1601943
    mem[55514] = 966
    mem[37519] = 77989
    mask = 010001010XX11X10XX1X0X0X1X0111001001
    mem[31633] = 642267
    mem[31180] = 256848
    mem[3262] = 53074205
    mem[4176] = 27542042
    mem[30177] = 660
    mem[16257] = 7236
    mask = X100110110X110X0111X0XX0001010X010X0
    mem[6360] = 92130236
    mem[28850] = 46594
    mem[15985] = 397101
    mem[49228] = 80
    mask = X100110010011X00111X10X0X11000X0X1X0
    mem[55502] = 6202150
    mem[26082] = 314
    mem[39594] = 6635685
    mem[60628] = 186878
    mem[26354] = 26627
    mask = 11001101000X100XX11X0100010001XX0001
    mem[32489] = 421676
    mem[54747] = 776369
    mem[5568] = 161
    mem[56323] = 46
    mem[21580] = 513
    mem[22504] = 425
    mem[16855] = 840
    mask = 1110110X100X0X0X01111X11011001001X0X
    mem[45789] = 637584
    mem[30970] = 1057424
    mem[23657] = 22302
    mem[26082] = 877466
    mask = 0X000101100110100X100100XX0110X01000
    mem[24512] = 9678
    mem[54196] = 187
    mem[5120] = 4093605
    mem[24945] = 751
    mem[44317] = 1926
    mask = X10XX101X101100101X0X10110XX110X1100
    mem[26837] = 164343201
    mem[27917] = 7656
    mem[38564] = 513678
    mem[50795] = 76758852
    mem[43436] = 377041
    mask = X11X111X0X011000111X01000X011X001010
    mem[62853] = 7257
    mem[64609] = 3359628
    mem[19612] = 7400536
    mask = X1000101111XXX10001100011101010010X1
    mem[11544] = 19164015
    mem[89] = 15427
    mem[7510] = 177830
    mem[38182] = 3493289
    mem[38761] = 98839912
    mem[41629] = 36133346
    mem[64464] = 11351848
    mask = 01000101X1011010X100X11X01001X0X1001
    mem[62024] = 6787
    mem[37961] = 239020169
    mem[11048] = 30241
    mem[12021] = 37370
    mem[7504] = 130958613
    mem[15985] = 547735
    mem[24593] = 26754
    mask = 11X01101X00XX001X111010001XXX01010X1
    mem[2769] = 36617
    mem[15841] = 32395988
    mem[14184] = 1230
    mem[53415] = 192565609
    mem[65353] = 1103
    mem[21988] = 93037470
    mem[5899] = 318043
    mask = 110101XX01111X0X1010X00X0X110X0110X0
    mem[61629] = 8487
    mem[22606] = 229956
    mem[4869] = 2889
    mem[22702] = 2964611
    mem[51436] = 1447
    mem[39022] = 218429
    mask = 1100X10XX0X1100X1X10101X111001X11111
    mem[44127] = 28480880
    mem[23797] = 7200980
    mem[42770] = 134215352
    mask = 0100000X000X101X010001X011X010X11X10
    mem[14052] = 2132
    mem[54344] = 283
    mem[50501] = 228
    mask = 11XX100X100110X0111011100X0000100X11
    mem[3096] = 56107
    mem[41528] = 136050659
    mem[61642] = 27190672
    mem[14184] = 2443414
    mask = 0X0X0011100X1010110X0101001XX11100X0
    mem[61017] = 579168
    mem[13520] = 753
    mem[8723] = 1450259
    mem[62331] = 40126
    mem[41759] = 150938
    mem[35794] = 7868
    mem[8688] = 11717126
    mask = X1001X0010011XX0X110101XX1000X111X11
    mem[61163] = 2017
    mem[59484] = 365949812
    mem[18300] = 7976052
    mask = 01001001100X101011XX110X100111000000
    mem[57866] = 98060156
    mem[50268] = 945963
    mem[2775] = 50053
    mem[47406] = 154534009
    mask = 010000010101X110XX1001XX010111001001
    mem[18692] = 129964
    mem[15203] = 10499
    mem[46399] = 62751
    mem[21701] = 409829
    mask = 0100000100XX10100XX00010110010001XX0
    mem[53321] = 237286923
    mem[6885] = 12836105
    mask = 0100010X100X101001100X100000111X1XX1
    mem[56749] = 20323
    mem[24754] = 3110
    mem[6549] = 6911933
    mem[19817] = 902749
    mem[41862] = 141653872
    mask = 01X0000100X1111X0X000XX1000010111100
    mem[62817] = 24212
    mem[47588] = 88272
    mem[40843] = 15421
    mem[2344] = 84933
    mem[58787] = 39045
    mask = 11XX1X00X01110X01110011X0X00001011XX
    mem[26894] = 267
    mem[21329] = 105884
    mem[47335] = 199007575
    mem[45542] = 42702501
    mask = 010X01X1000111101X1000001X1X110X00X0
    mem[54035] = 250
    mem[18530] = 817
    mem[817] = 6197248
    mem[24075] = 70967
    mem[3138] = 1757
    mem[11977] = 3139118
    mem[27233] = 62004
    mask = X100X1XX110111100X101000100101000010
    mem[36703] = 321859730
    mem[28466] = 1329578
    mem[63529] = 841665
    mem[25621] = 86565892
    mem[19817] = 22768
    mask = 11100XX100X110011111110101011001X110
    mem[21830] = 63889233
    mem[27233] = 111377
    mem[31085] = 16480896
    mem[34637] = 2351346
    mem[44889] = 251
    mem[50401] = 130227708
    mem[52668] = 1684548
    mask = 0100011XXX011010X1X001101X00XX111010
    mem[7480] = 10145
    mem[28850] = 10692762
    mem[43245] = 50413255
    mem[39257] = 1768041
    mask = 0100X1X1100X1010011001X1X00111101000
    mem[41148] = 4200404
    mem[6369] = 25745796
    mem[44881] = 111919
    mem[5128] = 535961743
    mask = 010011011001X00011XX00000100100XX000
    mem[20676] = 267025408
    mem[6180] = 251317
    mask = 0100010101X11XXX011X001100011010100X
    mem[14528] = 256867985
    mem[6360] = 27062543
    mem[60004] = 291
    mask = 01X00101X11X1010001X0000X001X101XX01
    mem[24593] = 262
    mem[3272] = 132
    mem[32191] = 20587
    mem[7172] = 51454362
    mem[11375] = 6051
    mask = 11001X0X00010001XX11010010000X1010X1
    mem[6831] = 11190
    mem[14841] = 2503
    mem[60207] = 36858958
    mem[21151] = 29467
    mem[46209] = 22081
    mask = 010001010X11X1100110X0001X0001011001
    mem[38897] = 46352057
    mem[7175] = 46467491
    mem[219] = 17121502
    mem[38980] = 3723671
    mem[457] = 671215
    mem[30417] = 156865588
    mask = 110101110X1X110X10100X00001100110110
    mem[18104] = 454788463
    mem[19452] = 18162
    mask = 110X11001X0110001111X000X1001001X001
    mem[46488] = 1260
    mem[3329] = 426654
    mem[46810] = 3870
    mem[8621] = 12925
    mask = 110001011000X0X1X11X1011X0001011110X
    mem[60718] = 34740816
    mem[60977] = 709578014
    mem[37624] = 93226078
    mem[6054] = 1887
    mem[26175] = 430
    mask = 0101111110X1X01001X000110100X110X110
    mem[1214] = 57810
    mem[28249] = 143169
    mem[44390] = 112
    mask = 01XX0101000110001X10000000XX1XX10X00
    mem[48350] = 16212
    mem[29573] = 238
    mem[40903] = 1795848
    mask = 011000X10011111X010X01XX01X1101X111X
    mem[47677] = 182253
    mem[23334] = 68758
    mask = 0100XX01X00110X0X110010000X011X0010X
    mem[29649] = 105432234
    mem[53208] = 792257
    mem[21582] = 658154042
    mem[56134] = 1972
    mem[21732] = 4324466
    mem[17340] = 2613
    mem[57866] = 1243
    mask = 01X01001100XXX1011001X00000111010X01
    mem[18530] = 586
    mem[23426] = 1429648
    mem[15985] = 24011949
    mem[57590] = 360529
    mask = 010000010001100X01100001X0000X000X10
    mem[8249] = 920087
    mem[19925] = 1290454
    mem[49639] = 70486
    mem[22798] = 564
    mem[50238] = 1879
    mem[62463] = 16312
    mem[21732] = 5818962
    mask = 1XX0110010X1100011X00XX01XX1001X1010
    mem[12606] = 27185
    mem[7401] = 6832
    mem[46415] = 1438965
    mem[9614] = 229076295
    mem[62024] = 851916
    mem[3371] = 41841107
    mask = X11011X01X01111000000000101111000X01
    mem[25319] = 731128
    mem[32664] = 118900
    mem[38482] = 42385058
    mem[19832] = 2590687
    mem[33249] = 165555036
    mask = 1110XX01XXX0101X11100X1001101X011110
    mem[20621] = 726479117
    mem[4685] = 120830
    mem[12606] = 1154853
    mask = X100X1XX100X101X1111X00001010X100100
    mem[53048] = 5427
    mem[45481] = 167379930
    mem[15481] = 4434
    mask = 1100100X1001X0X01110111X1X10101X1011
    mem[43851] = 74972
    mem[16171] = 495748
    mem[35546] = 1035895
    mem[8868] = 8088024
    mem[15153] = 1779573
    mask = 010X11X110X1101011101000001XX1000100
    mem[25292] = 672982926
    mem[53441] = 37
    mem[60907] = 5981763
    mem[43566] = 1207
    mask = 0X00010101X111101X11010011111100100X
    mem[34938] = 10429
    mem[20850] = 78396156
    mem[11841] = 13100745
    mask = 0100X1X1100X1010011000X000XX11111XX1
    mem[16764] = 7659044
    mem[51446] = 24687135
    mem[413] = 522098
    mask = 1100010X1X0111X0011000X011100101011X
    mem[40985] = 27938
    mem[33039] = 2705710