Skip to content

Instantly share code, notes, and snippets.

@eugene70
Created March 12, 2021 13:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eugene70/82689315bf137fe3c27a8dc1b058662e to your computer and use it in GitHub Desktop.
Save eugene70/82689315bf137fe3c27a8dc1b058662e to your computer and use it in GitHub Desktop.
package aoc2020
import scala.math.pow
object Day14:
type InputType = String
@main def day14: Unit =
val testData = time("testReady", () => ready(testInput))
time("testPart1", () => part1(testData))
time("testPart2", () => part2(testData))
val data = time("ready", () => ready(input))
time("part1", () => part1(data))
//time("part2", () => part2(data))
private def ready(input: String): InputType =
input
case class Op(mask: String, ops: Seq[String])
case class Memory(address: Int, value: Int)
def newMemory(command: String): Memory = {
val comm = command.split(" = ")
Memory(
comm(0).replaceAll("[^0-9]", "").toInt,
comm(1).toInt)
}
def part1(data: InputType): Long =
val map = collection.mutable.Map[Int, Int]()
Seq.from(data.split("""mask = """))
.flatMap(
_.linesIterator.map(_.trim).toSeq match
case mask +: ops => Some(Op(mask, ops))
case _ => None
)
.flatMap(mask)
.foreach(mem => map.put(mem.address, mem.value))
println(map)
map.map(_._2).reduce(_ + _)
def mask(op: Op): Seq[Memory] =
val map: Map[Int, Int] = Map()
op.ops.map(maskEach(op.mask, _))
def maskEach(mask: String, command: String): Memory = {
val org = newMemory(command)
val binStr = org.value.toBinaryString
val result =
String.valueOf(mask.reverse.zipAll(binStr.reverse, '0', '0')
.map(_ match
case ('X', v) => v
case ('0', v) => '0'
case ('1', v) => '1'
).reverse.toArray)
println(result)
Memory(org.address, Integer.valueOf(result, 2))
}
def part2(data: InputType): Long =
0
private val testInput =
"""mask = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX1XXXX0X
|mem[8] = 11
|mem[7] = 101
|mem[8] = 0
|""".stripMargin
private val input =
"""mask = 1100X10X01001X111001X00010X00100X011
|mem[24821] = 349
|mem[34917] = 13006
|mem[53529] = 733
|mem[50289] = 245744
|mem[23082] = 6267
|mask = 011X1X00X100100XXXX11100X0000100X010
|mem[21316] = 14188354
|mem[53283] = 7137
|mem[57344] = 62358
|mem[63867] = 9443
|mask = XXX00X0X0X000101000010001001X011X100
|mem[24644] = 116
|mem[48236] = 73606120
|mem[10510] = 38322
|mask = X1X110000X0X100X1101X00111010X011X10
|mem[34997] = 31342
|mem[26072] = 2268501
|mem[5252] = 632
|mem[7236] = 22768
|mem[49071] = 551093395
|mask = 01XX100001001X00XX1XX101100X00101001
|mem[54837] = 244218
|mem[21783] = 11585
|mem[21099] = 76905
|mem[2378] = 53200
|mem[26270] = 417292
|mem[45806] = 620
|mask = X11X0111X100X10100X0X1X011X10100111X
|mem[58750] = 183290
|mem[43104] = 86138
|mem[19509] = 11175103
|mem[49328] = 267886858
|mask = 000X110X01X0110100101X0X00XX00010001
|mem[59931] = 59583
|mem[32104] = 883
|mem[15538] = 243291
|mask = 001X1101010X11010XXX01010111101X00X1
|mem[8242] = 108187354
|mem[65087] = 38969853
|mem[48863] = 63153
|mem[25959] = 230061422
|mem[43740] = 368377
|mem[58841] = 4055593
|mem[59380] = 59386
|mask = 110110010100XX11XX010100100110001100
|mem[7020] = 447178
|mem[36813] = 2655
|mem[31309] = 1748
|mem[24822] = 5683403
|mem[60917] = 6812
|mask = 0XX1010X01X011X1X010X001110110100010
|mem[44478] = 1586539
|mem[39782] = 949
|mem[54286] = 96566
|mem[14466] = 99
|mem[20192] = 18086
|mem[3717] = 79648
|mem[58752] = 40328
|mask = 100X1X001X00111111X1100100X11XX0X101
|mem[18878] = 2450507
|mem[5564] = 1664611
|mem[9704] = 116868
|mem[21119] = 102749
|mem[25549] = 2173
|mem[63519] = 7948355
|mem[9402] = 29593133
|mask = X1101100110X10001111101X0X00X1000010
|mem[24578] = 16594035
|mem[12855] = 62817
|mem[19754] = 204831
|mem[39912] = 587039668
|mem[20004] = 1492295
|mem[17243] = 5531
|mem[1316] = 28121178
|mask = 001111XX01001X01001X111110X1101010X1
|mem[29079] = 3819301
|mem[43580] = 3021873
|mem[12717] = 91478
|mask = 111XX10X010X1011XX0100000000X0001X0X
|mem[21612] = 1342337
|mem[13794] = 6460
|mem[63974] = 79096
|mem[61231] = 79
|mem[52748] = 548989
|mask = 110X1X01010XXXX1X0010000101X011001X0
|mem[7150] = 129613326
|mem[2629] = 19221
|mem[34913] = 5720809
|mask = 0XX0X0X00100X1X00111011X111X10X11101
|mem[14506] = 808939
|mem[22097] = 3682116
|mem[45143] = 70886840
|mem[11000] = 823928
|mem[45922] = 709192
|mem[38124] = 21830062
|mask = 00XXX10X01001101X010XX10X1X100100010
|mem[54703] = 154976
|mem[12855] = 187248782
|mem[65457] = 28101
|mem[15696] = 2295684
|mem[30880] = 1247718
|mem[45160] = 515441
|mask = 1X110101010011X1100110X0001X01001100
|mem[57318] = 100074
|mem[47449] = 4621
|mem[59319] = 50563
|mem[41125] = 37890243
|mask = X11X0101010011X11001X010110100000010
|mem[50289] = 5524
|mem[42244] = 3206413
|mem[56334] = 869121
|mem[38672] = 1475
|mem[15747] = 203
|mem[24920] = 87767798
|mask = X111110X000010X1X00100011100X0011X11
|mem[21588] = 451
|mem[23953] = 46630
|mem[14775] = 49711378
|mem[50858] = 2467
|mask = 1101100001001X0110011001XXX11111X001
|mem[55659] = 1545765
|mem[6437] = 31978856
|mem[39782] = 14103777
|mem[36553] = 11829098
|mem[381] = 1092062
|mem[8934] = 730472
|mem[2555] = 1825500
|mask = 0XX0100X010010001X111X00100X01001X11
|mem[2219] = 43334
|mem[22560] = 1622449
|mem[43084] = 947441529
|mask = 110X1000010X1X1X100101010110000XX0X0
|mem[36928] = 489523
|mem[28368] = 13289
|mask = X111X10101001101X0XX1X0011X0000001XX
|mem[18457] = 3703
|mem[3623] = 32246635
|mem[24559] = 80719
|mem[58118] = 8905129
|mem[16253] = 45786863
|mem[40870] = 495305
|mem[9309] = 259478546
|mask = 01111100X1001XX10010X1100X1010010000
|mem[5294] = 197088
|mem[44504] = 10557956
|mem[59142] = 116862
|mask = 1X01X10100XXX0101XX1101X1000001011X1
|mem[16259] = 434323408
|mem[62326] = 739075
|mem[46819] = 13021
|mem[60917] = 2384
|mask = X1X01X0001001000001011010000X1101100
|mem[21341] = 70959125
|mem[62908] = 762
|mem[34493] = 484
|mem[17428] = 31
|mask = 01011011010110X10111110X00X1110010XX
|mem[18984] = 3776829
|mem[57419] = 6347092
|mask = 01X11101010011010010X0XX11X101X01100
|mem[3581] = 47227
|mem[15034] = 148249156
|mem[39328] = 32020553
|mem[45580] = 921
|mask = 1X11110X0000X0111001XX001X01100X1010
|mem[65437] = 31942299
|mem[41279] = 52981019
|mem[22939] = 30
|mask = 11011X0X01001XX11X010X01001111XX1X00
|mem[49334] = 2124
|mem[3052] = 75699
|mem[56099] = 206
|mask = X10X110001XX1011100X1001X0000XX01110
|mem[16214] = 194247445
|mem[5064] = 6545
|mem[24889] = 334318
|mem[60668] = 613191688
|mem[13452] = 2759371
|mask = XXX001X1010001010X0000X001X1X11011X0
|mem[41278] = 202539349
|mem[17818] = 6496568
|mem[51738] = 793135
|mask = 01110X1X0X00X10000X000X1011110001X00
|mem[54203] = 102262453
|mem[47434] = 11948539
|mem[4065] = 1955823
|mem[5838] = 116726352
|mem[22858] = 770
|mask = 1X0111010X10X01X100110001111X0X00X11
|mem[2486] = 828784
|mem[45704] = 52334
|mem[25505] = 7455952
|mem[35622] = 2191372
|mem[43475] = 1724531
|mem[51269] = 231866
|mask = 10011000XX001X1111XXXX0X00111000010X
|mem[1849] = 42419
|mem[4574] = 1532276
|mem[24053] = 414769
|mask = 1111X1X1XX0X10X110XX10001101101X1111
|mem[50131] = 380577
|mem[14034] = 324
|mem[43433] = 468143
|mem[57359] = 918
|mem[32101] = 671267
|mem[10229] = 779186
|mask = 110X1100010X11X110XX1101X01101011000
|mem[50062] = 1717353
|mem[44599] = 213984
|mem[2474] = 270288
|mem[25959] = 947
|mem[14725] = 59
|mem[43580] = 1510
|mask = 011XX10101001101X00111001101X0001100
|mem[56933] = 226
|mem[13318] = 4614
|mem[30661] = 15820
|mask = X1011100XX0X10111000X001110X00010X10
|mem[43263] = 15614563
|mem[58584] = 4208089
|mem[44934] = 1045
|mem[8892] = 7322
|mask = 1X011000X10010X111010001XX111001XX1X
|mem[49868] = 246
|mem[5838] = 22365009
|mem[41002] = 23308
|mem[20933] = 135967
|mem[28178] = 191447
|mem[12921] = 12366
|mask = 111X0X0X0100110100XX00000X0001000000
|mem[37981] = 3749401
|mem[26391] = 5633
|mem[32104] = 36834
|mem[44124] = 3460632
|mem[5838] = 491004585
|mask = 01000X1101X0010X0100X11011011111X0X0
|mem[23993] = 9267350
|mem[51536] = 1866241
|mem[40301] = 264185
|mem[65174] = 1500904
|mem[30449] = 2040
|mem[11574] = 31366391
|mask = X1X11101X1X010111X01100X0X100X00X101
|mem[51781] = 12168
|mem[39202] = 21507
|mask = 11011X00010X1X1X10011000XX1X01X00X10
|mem[14042] = 2091313
|mem[54126] = 926
|mem[54056] = 380624
|mem[4492] = 58611931
|mem[14287] = 2682945
|mask = 011000000X0X1X010X1101X0100000111000
|mem[37035] = 8382057
|mem[5086] = 105635
|mem[59782] = 287247
|mem[59842] = 261015
|mem[55905] = 427749005
|mem[38951] = 116871701
|mask = 011XXXX001001X0X001011X10100X0010100
|mem[37224] = 240173934
|mem[7233] = 4620173
|mem[11642] = 53937442
|mem[25130] = 31578
|mem[27305] = 19855
|mask = 01110111010011010X101X010X01111X10X0
|mem[9117] = 80452
|mem[45949] = 66133382
|mem[58118] = 431847
|mem[45227] = 31859837
|mem[12227] = 12785
|mem[10370] = 3992241
|mask = 011X01010X00X101X000101XX100X100X0X0
|mem[3584] = 98035933
|mem[48508] = 24604
|mask = 01101110010010X1001011X1X10000XX1X00
|mem[32223] = 13600
|mem[17788] = 30410813
|mask = 11X0110X0X00100000X011110101X1010000
|mem[54352] = 3305565
|mem[33020] = 56159
|mem[58750] = 3553365
|mask = 01110X0X010011010010100000000001X10X
|mem[45320] = 86117954
|mem[56412] = 32488
|mem[44120] = 27915
|mask = 1111110X0100X0010001X0101X0110111111
|mem[1600] = 3494
|mem[15191] = 8051858
|mem[4831] = 514
|mem[52749] = 3554802
|mem[14870] = 5452
|mask = X0X110X011001011110111000X11XX011010
|mem[32924] = 343831204
|mem[37938] = 206
|mem[29100] = 4279
|mask = 111X1101X11X101110X1110010100000000X
|mem[51565] = 21744022
|mem[17959] = 984
|mem[51269] = 546739474
|mask = X11X11000100110100100100010X110XX100
|mem[60489] = 1801861
|mem[10306] = 661
|mem[51002] = 1120331
|mem[4803] = 21542674
|mem[26350] = 878
|mem[42540] = 79468437
|mem[56396] = 6518705
|mask = 01XXX0XX010011X1X11111000X0011101X00
|mem[22955] = 1087
|mem[24644] = 31210240
|mem[11638] = 1408
|mem[22097] = 31493533
|mem[61231] = 2476899
|mask = X1011X011100101X11011100X010X0001101
|mem[56933] = 112988
|mem[60092] = 16076531
|mem[55659] = 668286721
|mem[56710] = 8215281
|mem[49668] = 5991824
|mem[49216] = 2918850
|mask = X001010101001111X010100X111X00100111
|mem[37025] = 17025
|mem[42119] = 410077231
|mask = 111X1101010X10011010X0X1011010001X11
|mem[31309] = 15349
|mem[47328] = 245527268
|mem[29215] = 1790
|mem[54165] = 6329067
|mem[11618] = 1311552
|mem[11994] = 15416
|mem[43900] = 4424
|mask = 00110X00X1011X000010X01100010101100X
|mem[31645] = 471
|mem[41596] = 13507488
|mem[11528] = 25929919
|mem[5643] = 56515
|mem[52143] = 74146
|mask = 0X11X1XX0100110X0010101011X1X1X01X00
|mem[4526] = 129045325
|mem[16253] = 15510
|mem[58841] = 114430082
|mem[63068] = 1155009
|mem[24644] = 95502013
|mask = 0110111001XX11000X1011001100XX0000X1
|mem[5333] = 7007
|mem[10355] = 3824
|mem[55659] = 33270617
|mem[61541] = 64962
|mem[51738] = 5209
|mem[44372] = 408
|mask = 0XX0111X01001X00011000101X0X00100010
|mem[42157] = 28376452
|mem[28513] = 51126906
|mem[43084] = 5419180
|mem[1997] = 54636
|mem[55504] = 3986
|mem[53253] = 14463148
|mask = X1110101X1000101100XX010010101110100
|mem[42226] = 3486504
|mem[54837] = 3033
|mem[15314] = 2651212
|mask = 0111001X010X110000X0110100110001X001
|mem[19828] = 38571
|mem[55362] = 120
|mem[41125] = 297069
|mem[63867] = 760277
|mem[22858] = 1756
|mem[54703] = 2820113
|mask = 0011X10101001101X0101X0110X0X0XX1111
|mem[56317] = 14975
|mem[60301] = 27507
|mem[17408] = 929
|mem[30115] = 7362
|mem[51269] = 13459
|mem[4803] = 162982952
|mask = 0111X1110100110100100110X1X0100011X1
|mem[2066] = 1018
|mem[9704] = 3359
|mem[17252] = 1200
|mem[11567] = 452882913
|mem[55807] = 420485632
|mask = 01011001110010111X011101XX1001XX1100
|mem[5641] = 7642797
|mem[18280] = 394199
|mem[55988] = 3777121
|mem[16857] = 75304
|mem[31220] = 17483158
|mask = X1011X01010100X110010000X00000101100
|mem[6958] = 73282287
|mem[6856] = 10312
|mem[1997] = 225131
|mem[36291] = 3200306
|mem[53139] = 6364
|mem[52857] = 488
|mask = 0X111100010X1X01001X010110X1X0111000
|mem[32210] = 44165292
|mem[61837] = 742353
|mem[47689] = 217901
|mask = 1111X10101001101X01111001X011000X111
|mem[1600] = 5283945
|mem[31412] = 227843745
|mem[3623] = 4853
|mem[21537] = 390
|mem[4405] = 1966
|mem[20470] = 18461
|mem[11567] = 393918381
|mask = 011001XX0X00X101X0X010100X0100111110
|mem[11528] = 1832756
|mem[43104] = 3039
|mem[21774] = 17789
|mem[47052] = 55655944
|mem[8626] = 3587
|mem[19085] = 735520
|mem[33906] = 1155
|mask = 1X0111000100X0011001X100101XX100101X
|mem[22097] = 46921
|mem[44609] = 12686579
|mem[37643] = 642
|mask = 0X001111010011X00XXX1010110000101011
|mem[54063] = 68442463
|mem[40578] = 7777
|mem[42404] = 355257
|mem[35709] = 440
|mem[61541] = 256096
|mask = 01001101011XX1X1101110001001X0000001
|mem[3584] = 16367
|mem[34903] = 7097
|mem[15295] = 238225
|mask = 00011011X1X0X001011XX110001101010001
|mem[47295] = 354843
|mem[23995] = 2140
|mem[57817] = 5421
|mem[41082] = 1355669
|mask = 1111X10101001X01X00XX01X1X1101X111X1
|mem[47377] = 172432
|mem[33686] = 52658909
|mask = 00X101X1010X1X000X1X01011101010X100X
|mem[60202] = 123593
|mem[46408] = 224836575
|mem[32157] = 8489804
|mem[30035] = 833772
|mem[10370] = 115684
|mask = 0X110000X1001XX100X01101110000010100
|mem[20388] = 32592482
|mem[53340] = 1787
|mem[55220] = 59958
|mem[6882] = 1363889
|mask = X00X010X01011XXXX0X101111100X1000001
|mem[56171] = 14491218
|mem[6723] = 143479
|mem[3167] = 466068
|mask = 1111110101X01XX110X11X00101000000101
|mem[17959] = 37575
|mem[64234] = 28252682
|mem[49216] = 434
|mask = 01111111X10011010010111X10X1001X0X0X
|mem[30726] = 5341
|mem[15854] = 1712
|mem[28248] = 492
|mask = 01011011X10X1101X11X1XX0X000X01001X0
|mem[49829] = 780701
|mem[9292] = 2918293
|mem[25072] = 247151
|mask = 0101100X01XX1101011XXX010010X1111001
|mem[19232] = 8569
|mem[54272] = 75036
|mem[54165] = 5018
|mem[31355] = 75073
|mem[9949] = 577427
|mem[30208] = 7439
|mask = 1X11XX01XX001X0110001010100001011000
|mem[9223] = 278171
|mem[14010] = 7098
|mask = 011111010X00110110X1XX00011X00000111
|mem[52261] = 52124331
|mem[39202] = 206235
|mem[45806] = 927
|mask = 0100X101X1X1XX0110X110001000X1000X11
|mem[58118] = 560
|mem[33171] = 204326670
|mem[51319] = 67953886
|mem[51237] = 10958
|mem[56614] = 7267273
|mask = 1XX0XX000101101X10X1X110100100001101
|mem[43771] = 2817
|mem[27887] = 274574
|mem[63850] = 107
|mask = X010111101001100011000XX1011X1101X10
|mem[30088] = 63233721
|mem[30726] = 605150
|mem[56614] = 48162
|mem[11271] = 2038084
|mask = X0X10110X100110100101X1111000001X10X
|mem[24920] = 989
|mem[59782] = 151549707
|mem[22082] = 7033941
|mem[22671] = 330574441
|mem[5252] = 1859
|mask = 0011110001X01100001XXX10111101X1X001
|mem[12192] = 47533
|mem[18902] = 118818
|mem[24826] = 19391580
|mem[3918] = 710
|mem[53370] = 19365460
|mem[49665] = 14466588
|mask = 0X11X101010011011011X110101100X001X0
|mem[23829] = 31936270
|mem[15854] = 13849536
|mem[29208] = 3999149
|mem[37128] = 13918
|mem[3328] = 259186933
|mask = 1X1X1X01010X110110111X000X0001000100
|mem[2629] = 55317
|mem[49216] = 881
|mem[40870] = 1619590
|mask = X1001XX10101000110011X0010X00110001X
|mem[3918] = 16125795
|mem[2919] = 13852
|mem[18470] = 7583882
|mask = 001101000X0X110XX0101011110X01001001
|mem[51858] = 157
|mem[4120] = 103247344
|mem[13914] = 423240
|mem[61736] = 159857
|mask = 0X011011010X1X0101111110XX0010XX00X1
|mem[61289] = 75040
|mem[43263] = 107031474
|mask = 11111X010100110X0X0010X011X100011101
|mem[29419] = 4825
|mem[16760] = 16715
|mem[42563] = 1981
|mem[40827] = 616757
|mem[51565] = 353
|mask = 010X10X00X00110X111X110X000XX0111101
|mem[2967] = 442177
|mem[18301] = 37578
|mem[56358] = 682
|mem[39237] = 59986049
|mem[2456] = 108546
|mask = 00100X0XX10011X1XX101X111100000XX001
|mem[6578] = 469499
|mem[60824] = 1460
|mem[50713] = 7725506
|""".stripMargin
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment