Skip to content

Instantly share code, notes, and snippets.

@mykdavies
Last active December 2, 2023 10:42
Show Gist options
  • Save mykdavies/203b3f0a9a1ad7a51daf14a1aeb6cf67 to your computer and use it in GitHub Desktop.
Save mykdavies/203b3f0a9a1ad7a51daf14a1aeb6cf67 to your computer and use it in GitHub Desktop.
AOC2023 day02
// AOC 2023, Day 2: Cube Conundrum
// Each lines holds a number of draws of coloured cubes from a bag.
// 1) Given some limits, how many lines contain valid draws.
// 2) Determine the minimum cubes needed for each line.
// https://dartpad.dev/?id=203b3f0a9a1ad7a51daf14a1aeb6cf67
import 'dart:math';
import 'package:collection/collection.dart';
MapEntry<int, List<Map<String, int>>> parseLine(String s) {
var game = s.split(': ');
var num = int.parse(game.first.split(' ').last);
var rounds = game.last.split('; ');
var cubes = [
for (var (e) in rounds)
{
for (var ee in e.split(', '))
ee.split(' ').last: int.parse(ee.split(' ').first)
}
];
return MapEntry(num, cubes);
}
/// collects the max of the counts from both maps.
Map<String, int> merge2(Map a, Map b) => {
for (var k in {...a.keys, ...b.keys}) k: max(a[k] ?? 0, b[k] ?? 0)
};
var limit = {"red": 12, "green": 13, "blue": 14};
bool isGood(Map test) =>
limit.entries.every((e) => (test[e.key] ?? 0) <= e.value);
part1(List<String> lines) => lines
.map(parseLine)
.where((e) => e.value.every(isGood))
.map((e) => e.key)
.sum;
part2(List<String> lines) => lines
.map(parseLine)
.map((e) => e.value.reduce(merge2))
.map((e) => e.values.reduce((s, t) => s * t))
.sum;
var testdata = [
"Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green",
"Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue",
"Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red",
"Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red",
"Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green"
];
void main(List<String> args) {
var dt = DateTime.now();
assert(part1(testdata) == 8);
assert(part2(testdata) == 2286);
var rt = DateTime.now().difference(dt).inMilliseconds;
print('tests succeeded in $rt ms');
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment