You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
1.8 KiB
Dart

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
Future<void> b({bool test}) async {
await init(test);
}
}