|
|
|
|
@ -2,15 +2,61 @@ import 'package:aoc2020/aocbase.dart';
|
|
|
|
|
import 'package:aoc2020/model/readdata.dart';
|
|
|
|
|
|
|
|
|
|
class AOC20201209 extends AOCBase {
|
|
|
|
|
int testpreamble = 5;
|
|
|
|
|
int runpreamble = 25;
|
|
|
|
|
int preamble;
|
|
|
|
|
int index;
|
|
|
|
|
var mylist = <num>[];
|
|
|
|
|
|
|
|
|
|
void init(String filename, bool test) async {
|
|
|
|
|
mylist = await ReadData.readFileNum(filename);
|
|
|
|
|
preamble = test ?? false ? testpreamble : runpreamble;
|
|
|
|
|
index = preamble;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool testGroup(int index) {
|
|
|
|
|
var val = mylist[index];
|
|
|
|
|
var sublist = Set.from(mylist.sublist(index - preamble, index));
|
|
|
|
|
var testset = Set.from(sublist.map((elem) => val - elem));
|
|
|
|
|
return testset.intersection(sublist).isNotEmpty;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<num> sumTest(num testcase, num start) {
|
|
|
|
|
var sum = 0;
|
|
|
|
|
var end = start;
|
|
|
|
|
var group = <num>[];
|
|
|
|
|
do {
|
|
|
|
|
end++;
|
|
|
|
|
group = mylist.sublist(start, end);
|
|
|
|
|
sum = group.fold(0, (prev, element) => prev + element);
|
|
|
|
|
} while (sum < testcase);
|
|
|
|
|
return sum == testcase ? group : [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Future<void> a({bool test}) async {
|
|
|
|
|
var filename = (test ?? false) ? classStringTest : classString;
|
|
|
|
|
var mylist = await ReadData.readFileString(filename);
|
|
|
|
|
await init(filename, test);
|
|
|
|
|
for (index = preamble; index < mylist.length && testGroup(index); index++);
|
|
|
|
|
if (index < mylist.length) {
|
|
|
|
|
answerA = mylist[index];
|
|
|
|
|
} else {
|
|
|
|
|
print('past end');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Future<void> b({bool test}) async {
|
|
|
|
|
var filename = (test ?? false) ? classStringTest : classString;
|
|
|
|
|
var mylist = await ReadData.readFileString(filename);
|
|
|
|
|
await init(filename, test);
|
|
|
|
|
index = 0;
|
|
|
|
|
for (index = 0; index < mylist.length; index++) {
|
|
|
|
|
var mysum = sumTest(answerA, index);
|
|
|
|
|
if (mysum. isNotEmpty) {
|
|
|
|
|
mysum.sort();
|
|
|
|
|
answerB = mysum.first + mysum.last;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|