|
|
|
|
@ -1,16 +1,62 @@
|
|
|
|
|
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 = <String>[];
|
|
|
|
|
var rawMask = '';
|
|
|
|
|
Tuple2<int, int> mask;
|
|
|
|
|
var mem = <int, int>{};
|
|
|
|
|
|
|
|
|
|
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<String>(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<void> 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
|
|
|
|
|
|