import 'package:any_base/any_base.dart'; import 'package:aoc2020/aocbase.dart'; import 'package:aoc2020/model/readdata.dart'; import 'package:tuple/tuple.dart'; class AOC20201214 extends AOCBase { var mylist = []; var rawMask = ''; Tuple2 mask; var mem = {}; static const max = 274877906943; static const dec2bin = AnyBase(AnyBase.dec, AnyBase.bin); static const bin2dec = AnyBase(AnyBase.bin, AnyBase.dec); void init(bool test) async { mylist = await ReadData.readFile(classString, test: test); } void setMem(int address, int val) => mem[address] = applyMask(val); int applyMask(int val) => (val | mask.item1) & mask.item2; void setMask(String _rawMask) { rawMask = _rawMask; var _orMask = int.parse(bin2dec.convert(_rawMask.replaceAll('X', '0'))); var _andMask = int.parse(bin2dec.convert(_rawMask.replaceAll('X', '1'))); mask = Tuple2(_orMask, _andMask); } void setMaskSection2(String _rawMask) { // find all 'X's // find position of all X's // binarily cycle through all binary numbers posible make a list of masks } int applyMaskSection2(int val) => (val | mask.item1) & mask.item2; void setMemSection2(int address, int val) { mem[address] = applyMask(val); } @override Future a({bool test}) async { await init(test); mem.clear(); for (var line in mylist) { var split1 = line.split(' = '); var cmd = split1[0]; var val = split1[1]; if (cmd == 'mask') { setMask(val); } else { var address = int.parse(cmd.split('[')[1].split(']')[0]); var value = int.parse(val); setMem(address, value); } } answerA = mem.values.reduce((a,b) => a + b); } @override Future b({bool test}) async { await init(test); } }