Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// A register gets updated by simple instructions
- /// 1) What is its value at certain times?
- /// 2) Draw a screen based on these. What letters can you see?
- import 'package:more/more.dart';
- import 'package:collection/collection.dart';
- List<int> processRegisters(List<String> lines) {
- var screen = [1];
- parseInstr(String s) {
- screen.add(screen.last);
- if (s.startsWith('noop')) return;
- var n = int.parse(s.split(' ').last);
- screen.add(screen.last + n);
- }
- lines.forEach(parseInstr);
- return screen;
- }
- part1(List<String> lines) {
- var sig = processRegisters(lines);
- return [for (var i = 20; i < sig.length; i += 40) i * sig[i - 1]].sum;
- }
- part2(List<String> lines) {
- var sig = processRegisters(lines);
- var scr = List.filled(240, false);
- for (var i in 0.to(sig.length)) {
- scr[i % scr.length] |= (sig[i] - (i % 40)).abs() <= 1;
- }
- for (var i in 0.to(scr.length, step: 40)) {
- print(scr.sublist(i, i + 40).map((e) => e ? '#' : '.').join(''));
- }
- return readLetters(scr);
- }
- // Parse an AoC output to find the letters encoded in it.
- readLetters(List<bool> l) {
- var hexes = l
- .chunked(5)
- .map((e) => e.take(4))
- .map((e) => int.parse(e.map((e) => e ? '1' : '0').join(''), radix: 2)
- .toRadixString(16))
- .toList();
- var ll = hexes.length ~/ 6;
- hex(x) => 0.to(hexes.length, step: ll).map((e) => hexes[x + e]).join('');
- return 0.to(ll).map((e) => letters[hex(e)] ?? '?').join('');
- }
- var letters = {
- '699e99': 'A',
- 'e9e99e': 'B',
- '698896': 'C',
- 'f8e88f': 'E',
- 'f8e888': 'F',
- '698b97': 'G',
- '99f999': 'H',
- '311196': 'J',
- '88888f': 'L',
- 'e99e88': 'P',
- 'e99ea9': 'R',
- '999996': 'U',
- 'f1248f': 'Z',
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement