Skip to content

Instantly share code, notes, and snippets.

@mykdavies
Last active December 25, 2021 22:29
Show Gist options
  • Save mykdavies/c14ea0dd4831cb820466518e0b2e7502 to your computer and use it in GitHub Desktop.
Save mykdavies/c14ea0dd4831cb820466518e0b2e7502 to your computer and use it in GitHub Desktop.
AOC2021 Day 25
<h1 id="header">Advent of Code 2021 Day 25</h1>
<div id="wrapper">
<canvas id="canvas" width="417" height="411"></canvas>
</div>
<p id='status'>Run me</p>
import 'dart:html';
import 'dart:async';
extension IntToExt on int {
to(int end, {int step = 1}) sync* {
for (int i = this; i < end; i += step) {
yield i;
}
}
}
extension IterMaxExt on Iterable<int> {
int max() => reduce((s, t) => s > t ? s : t);
int min() => reduce((s, t) => s < t ? s : t);
}
class Index {
final int r;
final int c;
const Index(this.r, this.c);
@override
String toString() => 'Index($r, $c)';
@override
bool operator ==(Object other) =>
other is Index && r == other.r && c == other.c;
@override
int get hashCode => Object.hash(r.hashCode, c.hashCode);
Index operator +(Index other) => Index(r + other.r, c + other.c);
Index operator -(Index other) => Index(r - other.r, c - other.c);
}
abstract class Grid<T> {
static const n8 = [
Index(-1, -1),
Index(-1, 0),
Index(-1, 1),
Index(0, -1),
Index(0, 1),
Index(1, -1),
Index(1, 0),
Index(1, 1)
];
// including self
static const n9 = [
Index(-1, -1),
Index(-1, 0),
Index(-1, 1),
Index(0, -1),
Index(0, 0),
Index(0, 1),
Index(1, -1),
Index(1, 0),
Index(1, 1)
];
static const n4 = [Index(-1, 0), Index(1, 0), Index(0, -1), Index(0, 1)];
int get width;
int get height;
T operator [](Index p);
operator []=(Index p, T value);
@override
bool operator ==(Object other) =>
other is Grid &&
width == other.width &&
height == other.height &&
indexes.every((i) => this[i] == other[i]);
@override
int get hashCode => Object.hashAll(indexes.map((i) => this[i]));
/// Useful enumeration for printing.
List<T> row(int r);
bool isInBounds(Index n) =>
n.r >= 0 && n.r < height && n.c >= 0 && n.c < width;
Iterable<Index> near8(Index p) => n8.map((e) => e + p).where(isInBounds);
Iterable<Index> near4(Index p) => n4.map((e) => e + p).where(isInBounds);
Iterable<Index> near9(Index p) => n9.map((e) => e + p).where(isInBounds);
Iterable<Index> near9raw(Index p) => n9.map((e) => e + p);
Index safe(Index i) => Index(i.r % height, i.c % width);
/// Get all indexes in row, column order.
Iterable<Index> get indexes sync* {
for (int r in 0.to(height)) {
for (int c in 0.to(width)) {
yield Index(r, c);
}
}
}
}
class ListGrid<T> extends Grid<T> {
late final List<List<T>> _list;
ListGrid(List<List<T>> list) : _list = list;
ListGrid.ofSize(rows, columns, T value)
: _list = List.generate(
rows, (index) => List.generate(columns, (index) => value));
ListGrid.copyFrom(ListGrid<T> grid)
: _list = List.generate(grid.height,
(r) => List.generate(grid.width, (c) => grid[Index(r, c)]));
@override
int get width => _list.first.length;
@override
int get height => _list.length;
put(Index p, T value) => _list[p.r][p.c] = value;
T at(Index p) => _list[p.r][p.c];
@override
T operator [](Index p) => _list[p.r][p.c];
@override
operator []=(Index p, T value) => _list[p.r][p.c] = value;
@override
List<T> row(int r) => _list[r];
// ignore: avoid_function_literals_in_foreach_calls
printIt() => _list.forEach((e) => print(e.join()));
}
late ListGrid<String> grid;
buildGrid(List<String> lines) {
grid = ListGrid<String>(lines.map((e) => e.split('')).toList());
}
stepsUntilComplete(dynamic callback) {
var i = 0;
while (true) {
if (i == 10) break;
i += 1;
var oldGrid = ListGrid.copyFrom(grid);
step();
callback(i);
if (keyboard.isPressed(KeyCode.SPACE)) break;
if (grid == oldGrid) break;
}
return i;
}
step() {
var newGrid = ListGrid.copyFrom(grid);
// eastward first
for (var i in grid.indexes) {
if (grid[i] == '>') {
var n = grid.safe(Index(i.r, i.c + 1));
if (grid[n] == '.') {
newGrid[i] = '.';
newGrid[n] = '>';
}
}
}
grid = newGrid;
newGrid = ListGrid.copyFrom(grid);
// southward
for (var i in grid.indexes) {
if (grid[i] == 'v') {
var n = grid.safe(Index(i.r + 1, i.c));
if (grid[n] == '.') {
newGrid[i] = '.';
newGrid[n] = 'v';
}
}
}
grid = newGrid;
}
var data =
'''vv>...v>......>>vv>.v.>>.v.vvv..>..>.v...v...>...vv..>v>..>.>>.>>...v>.v.v>..>>>>vv...vv..v>.v>.>v...>>..vv>v>vv..>>.>..v>>..v.vv..>.vv>..v
>v..>v....>.....>v>>>>v....v.>>>>.>.>....>>>v.v.>v.>v...v.>>v..>..>>v..vv..v....vv>..v..>>..vv..v>.>.>v...v..vv.v.v>.>>.>.v..v>v.....v.>..>
.v>..>.v..v>.vv>>>v>.>..v>v..>vv...v...>>.vv....>v...>v>..>........>v>v.>v..v.>>>...vv...vv....vvv.vv>>>.>v...>.>>..v..vv>>..v>>vvv.v..>>>.
>...>>..>.v>.v..vv>......v.vv.v.v>.>v>.>..vv...v.>>..>.......v..vv>v>.v...>.vvvvv.>..>v>..v>.vv.v...>>>>>.vv.>vv.>>...>...vvv....>>..v.v.>.
.......v.vvvv.v..v.v>v.>..v>>..>v>v.v>.....>v.v.vvv...v.v.....>...>>>v.v..v...>>v..v.v....v>>...>..v>...v>.>..>>..>...v>.>..>...v>v..vvvv..
..v.v..>v.v..>..>.v>..v....>v.>v.vv.>>>.v....>v..v>..v.>>>.v.v.v..>..v.>.vv.>vv.>v...>...>>...vv.>.v.vv.vvvv>.v.vvv>..>>>.....>..vvv>vv..>.
.....v>vv.>v....>vv>>v>v..>.>...v...vv.vv....>>v>>.>.>....>...>.>v....>v...v..vvv....>v.v>>>.v....vv..>.>.>>>v>....v...v>...v....v.....vvv.
v.v>v.>v>v.>..>.>vv>v.>.....v>>..v.>.v>..>........v>.v>..>v..v.>v.v.v.>>v>>.>....>>v.v....>...vvvvvv>...vv..v>v>v.v>>vv..>...v.v.vv......v.
>v....>..>...>.v>>..>.>>>.>v>.v.>v..>.>v.>v>..>v....>..>vvv>v..>...v>..v...vv.v>.vv.>.>.v.>....v..v>.>v.v.vv.>......v.>v>...>.>.>vvv.>..vv>
.>.>.>..vv.>..>vv>>......vvv...>>vv...v.v>...v..>...v.vv>.>..v.v.v.>>.>v.v>>.vv..v.vv>.v>..v.v...>v.>....v.>.v..v>v.>.>>..>...>...v>>>v.vv>
.>..v>...v...v>>>.>>.>.>.v.>.v.>>.>>.vv.v.vv.>>..v..>>.......>.>.v>..>.vvv.>>v>..v.v.>.>..vv..>.>..v.v...>vv.v>..v...v.....vv..vv>....>>v.v
>.>vv.......v..>v>.v..vv..>v...>v..>>...v>>vv..>>...>.vv..>..>v.>v...vv...v.>>v>.vvv.vv.>v...v.>..>...vv>.>.v>>v.v.vv.>.>>..v>>..>.>...>v.>
.......v>..>..>vv>>..vv.>>.>..>v>>.......v...v>.v..>>.>>>>.v>.v>>.>>...v.>>>>.>>v>v>..>.....v>>v..>.v..>..>......>v...v...>.........>..>.v.
>.>v.vv>...v>.v....v>>>>.>vv..vvv.v.>.>.>>.>.>v>>v>v.v..>vvv.>.>.>.>>vvv>>......vvv...v..>.>>.>.>..v..vv..>>..vvv>>>..>..>.v.vvv>..v>...>..
>v>>v...>vvvv.>v.>vv>v>.>...v.>...v>..v..>.>v.>>.v.>.>>>...vv.v.>v>v.......>>>...v...v.>...v>.>v.>..v...>>..v.>v>..>.v>.v...vvv...v.>...v..
..v.>.>.....v.>v..>....v>vv.>....>>v.>v...>vv.v.v>...>..v.v>..>.vv..v>..>v>v.v.v..>...>.v>....v.>...v>....>.>.>>....>..v..>v....>>..>v>v.v>
..>>....>vvv>.>...>>..vv.....v.v.v.v.......v.>>..vv.v.>>v......>vv..>...>.v....>v>....v>>.v.v>vvvv.......v.v>vv.v....>>...v.........v..v.v.
....>...>.v....vv.>.>vv>....>..v...v..v>...v>>.>....v..v.>vv>vv..v.v..>>>>..>...v....v.>>.>vv>>>vv.v>..>.v.v.>v.v.v.....>>..>.vvv.>>.......
.>.>>......v..v...v>.vv.v>...>>>.>.>v.....>v.>>vv.v..>.>.>vv....>>..>v.>....>....vvv>...v.>>>vvvv>>>>>v..>v.>>.v...v..>v.vvv.v.>v......>.v.
.v.>.>.>..>>>>v>>v>.>...v>..>>>.>>.vv...vv..>>v..>>>.v>.>.>>.....vv..>...>.v.>vv>v..>>v..>.......>vv.>..v.>v>>>v>........v...>...v.v..>.>.v
.v>>>v>v....vv...>..>>...vvv>v...>>..>v..v...>.vv...v.v>.>v.vvv>>..v.>.......v>vv.>.v.....>>.....v..>vv>v..vvv..>..>.>...v>>..vv..v>..v..>>
...v.>v..vv.>>....>.v..>..>vvvvv>vvv...>.>.v.>.>v>.v..>.vvv.vvv>..>>>...v.....>..>.v.v>v....v>..v>>..>>>..v......>v.>>.>.v...>v>....vvv>.vv
>v>...v.v.>.....>>>..v>...>v>.>>.v..vvv>..v>...vv...>.>..v.>.>v..>>..v.vv.v...v.v.v>>>..v>....>.v..v.........v...v..>....>..v..>.>.v>...vv.
.v>>..>v...>..>.>v>...v>>.vv.>>>..>v.>v.....>.>.>.v>>..>v....>.....>>..>>...>.>>.>>>.>>.>>>v....>..>vv.v>vv>..v>v.v>.>.vv..>...>v.v....>.v>
v...>...>.>v....>.v>.>.v>v.>vv....v..vv.>v..v>....>>.v.>>..>..>.vv....v..v...>vv...>.....>.>....>....vv.>>....v.v>....>....>..>...>..>>>>.>
......>..v>>....>>...vv>..>..v..>..>vv>.v..>.>.>>>v.>>>v.>v...>v....>>.v>.>..>v.>..v...>>..>v.....>>.v.>.>>.>...>....>.v..v..v..v>.v>vv>.v.
>..>.v>.v.vv>>..>v.>v.v..>.>..v.>.>..>.....>v..........>.vv>>vv....v.>.>.>v.>v...v.>..v>.v>..>>>>......>.vv.>.v.>>v.v...>.v.>...>v.>.v...vv
vv...>.....>.....>..vvv...>.vv...>>>.v..>..>>vv.>>.>v..>...>....v>v.>..>vv.>>..>v....v.....>vvv..v.v..>v>vvv..>v>.....>>>..>>v.....vv.v..>.
>v...v.vv.>>>>.v>.v.>....v>>.v>v>v.v>.>.>..>....>v..>....>>>>..>v..v>..>>v>>v>>.......>>vvv>..v>v.>v...v>..vvv.v..>v.>.>.>.>....>>.v..>.v..
.v.>..>>..v...>>.>v..v>........vv..>....>...v>>v>.v>v...vv.>>v>....>v..v..v..v....>>v>.......v..vv.v.>.>v>>.v>v>..vv>.>.v.vv.>>>...v..>v>vv
>.vvv....v.>v.>.>v..>vv...v>>.>..>>..>.>>vv..>v.v.>.>>>.>...>vv.v..v.>.v.>.vv....>.vv..v..>.v..>.v>vv....v...>>.>....>.....vv>v.v>>.>v.>.>v
>.>>.v>..>>v>...v..vvv.v.>...>v.>vv.v.>..>>v>v..>.>.v.vv..>.>.>>>>..>...>.>.vv.....vvv..>.....v.vv>..v.v>v.vv...>>..>.v...vv>..v.>.>v>..>>v
.v..v.>vvv>..>>v>.v..>..>....v.v.>.v>..>..v.>v>vv.>v.vvv>>.vv...v>>>>...>..v.>v.>>.>>..v>>.v>>..>..>..v.>...>.>v.....>.v>..>>.>.v.v.vvv..v.
.>>.....vv.v..vv>...>>....>..v>..v>v...v.v...>..>..>>>v..v.v.......vv>>.>vv>.v>.v....vvv.v>.>>>v>..vv..v..>....>>...>..>>>.>>>v....v.v>>>v.
...v...v.>...v..>v>>..vv.>.v>v..>v>.v.>>v...>.v.>v>>..vvv.v>v>>>v>>.>..v..>.>>>vv..>vv...>...v...v>v...v>....vv.....>.>>v.>..v.vv>vvv...>v>
..vv....v.vv.>vvv.v.>.vv.>v....>..>..>>..vvv>>....>>v........>v>.>..vvv...v>.>>v.v.v>>.......>.>..v.vv>.>.>v>>.v>.v...>....v.vv>.v....>.>..
.>v>.>>v>.......v...>vv.>..v.vv>>.>.....v>>....v.v...vv>.>>.>....>...>>.>...v...>...>>...v...>v.v.>>.....v>vv>..>..>....>.>.v..>.v.>>.v..v.
.>..>>v.v>v>v.v>vv..>v>vv>>.....v..>...>.vv..>...v.>.>>.v.v.vv...v>>>vvv>>.v..>.>...>>v...>>..vvv...v....v>.v>v.>v.>v.>>.......>v.>>v>>.v.>
.>v>...vv>..v>v>>.>.>.>>..v..vv.v..v>>...>>.....>.>.....vv.>vv..v>....>..>.v....v>.>..>>.>..v.v>v.>>>..v..>v.v..>v....>.>.v.>.>..v.>..>.>v>
..v.>v>>..vv>.>>.v>.v.>>vv.>..>..v.>.>.vvv.>.....vv>>>.v.>>.v>.v....v.>v.v.v.>...>>>>.v...v>v>v>vv..>.>..>..v>>.v.>>v.>>v>v..>.v>.>....>..v
...v.v......>vv.v>.vv>v..>.......vv.v>..v..>..>..>vv..v>.v.>>vv..>v>v.....v..>vv.>..v..v>>.v.>>v>v>v...>..vv.v>vv.>.>.>v.v.v.v.v>.v>v>.vvv.
....v>.v>v>...v..>.vv...>v>vv.v>v...v...v>vv..>.>....v.vv.v..>.v...v.v...>..>.>...v.>.>>..>.>.>.>v.v>>..>v..>v.v.vv.>.>.>..>..v..>....>.>>>
.>vvv...>.>vv.....>.....>..>>.>>>vv..>..>>v..v...>v..v>v.vv.v..>....>.>v.v..v.>.....>v>......v..>...>>v.>>v>.vvv.vv>v.>..>v.v.>vvv.v..>..>.
vv..v>v>..v..v>>>.v>>.v..v....>v.vv>.....v.v.>.v>....>v>.v.>.v.>>>>>vv.>.>>vv..>>v.>>.......>...>..vv>.>.v.v.v....vv.>.>vv..v...v>.>v>>.>>>
..v....v..>>>.>..vv.vvv>v.vv..>.vv...>>..v.>>>..v>...v>.>..>v>>..v.>vv.>>.v...v.>v>v>...>...vvv.v>v>vvv>v>>>.....>v..>.>....vv>.>>..>.>v.v.
>......v.v.>..vv.v..>>>v>>......>v.v......v>v.>.v>.>....>vv...v...>.>..v.>.v.>v>..vvv>v.v>>.v.vv>..vv...>...>>.>...>>...>.v>>....v.v.>v>>.>
>v..>..v.>vv.v>v..>vvv>..>>>.vv....>.>>..v>.>.>...>.v.>vv..v>v.>.....>..vvv.>.vv....>....v......>...vv>v.>>v>.>vv>v.>..v>.v..>v.v...>.>vv..
vvvv.v..>>...>v.vv>>...>v>.v..>.>.>..v...v>..v>>.vv.v>.>..v>vvv....v>vv.v.v>v...>>v.v>v>vvv.>...v.vv.vv>>.>>..v.v>vvv>>>.>.>v.v....v>>>...v
..>>v...>.>..v>>.>.>..>v.>>vv.>...>v.......v>...v>v.vv.>.v>.>..>.v....vv.v...>.vv....>...v>.>....>...>>v..>.v>.vvv>.>>>>>....v>..v.>>.v>...
>>vv.v.>vv..>vv...>>vv.>....>v>..v....>.>v.v...>.>...>.vv..>.v.v>...>v>.>.v..vvv..>v>>.>v...>..v>......v>>>.............v...>>.>...>.>v..>.
....v>>.v...vv.>..v>>.>..vv.v...v.v>..>...vv.v...v>.v.v>v.>.v.>>>..v>>..>>>.>>v..v>....vv..v>.v.v>.vv.v..>vv>>...v.>.vv>>.v>...>.>.vv..v..>
.v...v......vv.>>..>>.v.>.>>.v..>...v.......v>...>vv...v.....v...v...>>>v.v.v.v...v..v.v>..>v.>>v>..v.v.>...>.vv.vvv......v...>..........vv
.v....>>>vv>.....>>>>vv.>>>v..vv.>>.......v.>vv>v.>v>>..>>v>v>>..>v>..>...>v..v..>>v...>v>.>..>.v>..>>.>>...>...v>.v..vv>>.>.>.v...>...>vv.
.v>v.v..v>..vv.>>.>v........v....>...vv>....>v>>.v....v....vvv.vvv.>>v..v....v.>v....v>>vv.>.>...v.>...>>v>.....>>.vv..v...vvvv>v>vvv..vv..
.....v>..vv>v..>vv>...v>...v...>..>v>>...vv>v.>.>>..v>.>v.v....v>vvvv.vv...>.vv.>.v>v>v..>vv...>....>>.>....v..v>>.v.>..v.>v....v....vv....
v.v>v.v>>.v.v>...>>.>v>>>>>vvv>.v..>.>.>>>v.>vv..v.v>....>.>..v>.>.v>....>v..>v>....v.v.v>vv....>v>..>>.>...>>vv.>....>.....v>v..v.vv>>....
....vv>.>.>...>v.v>..>..vv>v...v>.>vv.v..v>>..>..v>..>.v.>>......vv.v.>v.vv....v.....>.vv>vv.>>>..>v>>>..>>.v.>.v..v>...>.v..v....>v.v.v..v
.>.>>>.v>.>>>vv.>...>...>>.v.v>>>v.v>..........>.vv.>....v...vv.>...>.>....>v>...v>..>>...>v.v.v>..>v.>v>>vv..v..>>v>vv>vvv>...>v>..vv...v.
....vvv.v...v.>>....v>..v>v>>.>..vvv.>....>>..>..v>.v>.>>..>v....vvv.v.>...v.v..>...>>vv.vv>v.vv>...>..v.v.v..>>.>.v>.>.v...>..v>>..>..v.>v
....v.v..vv.......>....>>v>...>..>>....>..>v....>v....>v>.>.>.vvv.vv.>..v>..v..>v..vv>.>v..>.>vv>>>v.v.>.>.>..>.v..>>..>..v.>..vv...vv....>
v..vv...v..v....v.>...>>>......>>>...>.v.v.....>.v>.>.>>v..vv>.....>v..>vv>>.v.>.v>v..>>...>.....vv..>v>v>.............>v>>..v...vvv.>v.vv>
..v>..>.>v>.>v.v..>>.v..v.>v...vv>.v>vv>..>.>>>.....v>>vvvv>>>..>v.>>..v>>..>...>..>v.>v..vvv>.v..vv..>...>..vv.vv>v>>.vv..>>v.>.v.>>...>v.
vvv......>.vv...>.v.>v>...>.vv..>>>.>.v...v.v>.v.v>>.>..>v.>>.v.>>v.>>v..>.>...>>..vv>.v>vv>...>>.v.v.>v.v.vv.v>..v>.>v.v....>>..>.>v>vv.>>
v.>vvvv.>.....v.>..vv>>.v.v.>.v>....vvv..>...vv>v..vv>.v>..v>......v.v>.>..v>.v>>.vv...>>.>>..>..>...>>...>>v.......v>..v>v>v..vv.v>v>..>..
.>...>.>.vv>vv>>v>.vv..>vv.>.v.v....>v>...>v>....>>.v.vv...v>>....v.>>vv>v.>.vvv.>...>>>v.>..>.>>>.>..>v>>....v.>..v..........vvv..vv..vv.v
..vv>...v.>>v>.v>>>...v>v>.>>>.v..vv..>v>...vv>....>.>>v..>>v.....v..v>>v.>v.....v........v.v>....>.....>.v>...v>..>.....v.v..>...>>>vv.vv>
.v.v...v>vvv..>v.v.vv.v....>..>vv>.>..>v>v.vvv>.v>v.vv.>vv....>vv..>.v....>..v.>.vv..v>v.v>>v.....v...>v.v..v.v.vv..v...v.>..v>.v.>>..vv>>>
v>.>.>vv>v>v>>...>v>vv.v>v..v...>v...vv>.v>v..>v.v.>.v.vv..vv..v>vv..>>.>>.>.v.>>>.v.v.v..>v>..>.v>vvvvv..v.v.>v.>.v..>.>.v>..>>v.v>>v.....
.>.v.vv>....>vvv.>.>....v....vv..vv>vv.v.v....v..>v.....v>>..v.....v.>v..v>v>.vv.....>>v..>>>>.v..vv...v.>v>..>>.>..v.v...>..>v>..v>..>.>.>
v..v.v>v>.>>.vv..v>.v>vv..v>>..v.>.............v.>>.>.>>.vv..>v>vv>>>.v...>v>...v>v.>v>>>>v>...>v>v>.>>...v.>..v>v.v.....v.v....v>..>vv...>
>.>..v...v.v>>..>v.>>.>.v.v.v>>.v>.v.vvv.>>v.>...vv>.>..vv>>v.v.v.>.vvv>>....>v.v>>v.>>v...v.vv...>>v>..>>>>..v.v....>.>vv.>..........v.v>>
...>..........v>vv.....v.vv>v.v.v..>...v.>>>>.v.>.v..>v>.....>v..>..v....vv>vvv>>.v>>..>.>>..v.>..>..>..vv.v...>.>>.vv.>....>>>v.vvvv..>vvv
..>>.vv>>>.v.vv>..>...vv.vv....v.>....v>>.v.v.....>>v..>>...>.>...v.vvvv.>>..>vv>.>.>>v>..v.>>..>>vv.>v..vv.v...>.v.v>>.>.vv...>v...>..>.v>
.v..>v>>v.v.......v>>...v.>v.>vvv.>..v..>.>>vv.>>...>.v..v.vv>.....vv>.>>...v.v>.>v>vv..v.>...>..v..>v..>.vv..>v.vvv>..v.v..>>.>...v>>>....
>v...vv..v....>.>>.v>v>..v...>....>..v.v.......>v..v....vvv.>..vv.>.v..>>...v>v..v>.>.vv..v....v.>>....v.>>>>v.>.v.v......>v>.>.>>>v..v.>>>
..>v.v...vv..v.v.v..v..>..v.v..>>v....>>v...v.>.v.vv>.>>v>>..v>>...v...v..vv.v>.>...>>>>vv.>.vv>>.>.vv>.....>.....v>v....vv.v>v.v>.v...>...
....v.v>.>v..v>.>v..v...v..v>>v.....v.v>>>v>v..vv..vv>.vv.v>vv..>.>......>..v..v>...v.vv..v>..>>>.>>>>..>v.>v>>.v>.>.v.>>...>>v..v>v>...v>.
...>>v.>.>v...v>>>>.>.>vv>vv..>.>>>..>.vv...>v>..vv>>vv.v>>.v.v>.>...>..v......>.v>v.vv>....v>>..vv..v...>v...>>..>>v.v>.v>v..>...v>>.>v..v
>..>vv.....vv>.v.v.v>.>v.>>.v..>v.v.v>>.>v>.v.>v.>..v...>>v>.....>.v..v....>..>v>v>..>>....v>....>v>>>..v....vv.>vv>....>.vvv.>vv....vv.>>.
v>vv...v..>...>>>.>v...v.>>>>vv.>....>v>.>..vv>v.v>.vv>v>>>v>>....>v>v>>v>.v...v..v.>>.vv..>.v.v.v.v>>.v..v>v......v>.>>.>vv...vv.v..>....>
v.>..>..>.>..>..>..v.vv.....>>....>.v.v>...v>v.>v..>.v.>..>v.v....vv.>.v>.>.vv.v>>>.v.v>.......vv..>....>>>>>.v..v...v....>...v.>v>>v>>.>.v
..>v>>..v......>...v.>...>..v...v..>>.>vv>>>>..v..>>>vvv.>v.....vv>>.>..>vv.>v.v....>....v..v...v>>.v...>v.v....>>.v>vv.v...v.>......>v.>..
vvv>vv.vv.>v>v...>vv>v>.>...>.>>v...>>...v.vv>>.v..>>>...v>>..>v..v...>>..v>..>.>>...v>.>.v>>v...vv.v..>..v.v>v....>>>>>vv>v>..>.>.....vvv>
..>>v>..v...v..>v>..>v.....v.....vv...>v>...v.>v>..v.>....>v.>>..v>>>v..>v>>v.vvv....>......>vv>vv.>.>v>..>.>vv>v>v.>>v.>.v.v.v.....>>>>.>.
>v.vv.v.>>>vv>>.v>>....v..v..v...v>......>>.......>>v.vv>v...>vvvvvvv.>.v...>v.>.>..>>..v.v....>.v..>.>v.v>.v>..>>..v.v.>..v.v>..>>......v.
>>.>.vv...vv.......>vv.>.v.v..vv>...>v...>.vv.v....>>.>v.>..>v....v..>.v.v.>..v>vv..>>vvv>v>>v>v.>....>.>>.>vv..v.>.......>..vv..v.>>>..>vv
......>...>>...>..v.v.>>...v...>v..>vv..vvv..v>...>..>>..v>>.>v.>.v.>>v.v.>>.v>vv.....v.>.....v>v...>.v>.>vv.v>....>v...v>vvvvv.v>>.>>....>
v.>v.>>vv.v.v>v.v>>v..>>vvv.>.>>.>>.>.vv.v..>>v>.>>.v>........v..>v.>.vv.>v>.>vv>..>..>...v>vvvv>.>.>>.>>..v.v..>....>>.v.......>...v.>v..v
.>.>>....>v..v..>>v>vv>.>>v>..>vv>>>>.v..>...v.v.>>..>...vvv>>>.v>.>...>..v....v.>vv...v.>>.....v>....vv>vv..>>.>>>>vv.>>.....>.>>>.v>...>v
.>.vv.v..>.>.vv.>...>>>...v.vvv...v.vv>>v.>v....>>v>...>v>..>>.>.>.>.>vv>>>.v..>..v.v.v.>>v..>v...v>v>>.>.....>.>......v>v.....>.v.v.>.....
..>>.>..>v......>..........>>.>..>...>v>.....v.v..v.v...v.>.....v>>v....vv.>.>v>v..>>v.>vvv......>vv.>..>v.>v.v...>.vv.>....v....vv.v.>>v.v
..v..>..>.>..vvv.vvv..>..>>...v..>.v>..v>>>..v...>>v...>.>v...v.>..v......vvv...vv>..>>..>.v.>.v.v....vv.>......vv>v.>>..>v>....vv>>>>v..vv
..v>.v.....v..>>.v..>>>v>>>.>v..v...v>......vv.>vvv>>.>.v.>>..>>.>>>..vv..v>vv...v>...v>.>...>.>.v.>...v>v.v.>v.v..>.>v>>>.>.v>>>.v.......v
v.>v..v>..v..v.v....v..>>.>.v>.>>>>v>>>.vv....>>>...>v>>>v...v>>.v.>v>>.>..v.vv....v>>>..v..>....>vvvvv>.>vv>v.v>.v>>..>.vvvv.>.>.vvvv>>v..
v.v...>.>..v.>>..>.....v>vvv>v..>vv.....>v...>v.>....>v..>>>>v.>..v>>.>vv.v>>..v>.>..vv>...>v>....>>.......>>.>v.>.>>v..>v..v.>v>..>v...v..
v.>v.vv>v>...v>.>v..>.v.v.v..v...v.v..v>>v.v>..vv..>.>.>..>vv..>..vvvv.....vv.v.>>>v.>>v>v.vv>.>>....>..vvv>>>>..vv.>>.>v...>..>v.>....>..v
.>...>....v.>.vvv.vv.v>.vv>v>..v.>v>...>..vv.vvvvv....>.vvv.vvv>.>.v>..v.vv>v>..>.>.v.>.>.>v.v.v..>.....>....vv>v...>>.>.v..>>>v>>>v.>v>v>.
.>...>.vvv.v>.v..v>>.vv.....>..>..v.>..v>....v>..v...v...>.>...>>v..>.vv...v>vv..>v>>>...>.v..>.>.v>.>vvv.>v.v...>..>>.v.v>>v>>.>.>.....>.v
.....vv.v..v>.v.>...>>......vv.>.>.>vv>..>>.>.....>>vvv.v>v..>.>.vv..vv..>.>.>.>>v.>v>.>vv.>..>>..v.>>.>>..vv...v...v.>v>>v>v>>vv.>.>v>v...
.>.>>...v...v...v.v.>.>>>v.>...v...v.>..vv>v....>vv.>>.>v.>.>.v.>>.>v..vv>...>..>>v.vv...>.>v>>>.v.v>....vvv>...>.>.v>v.>.vvv.vv.>...v>.>v>
.>v.vv>v.vv.......v>.>......>>v..vv>.v.>v.>>>>.>v..>>..>v>vvv.......>>v>>..v>.>>>....>v.>>v>v.v>.>v...vv.>>........vvv>v..v.>....>>.....>..
v>.>....>.>>>...>.vv>.>>vv>v>.v..vvv....>..>.>>...v..........vv..v>.>vv...>.>..>v>.v..v........v...vv.>>vv>.>v.v...v..>...>>v.vv>vv...v>vv.
.>..>>....v..v...>v.>v.>...>..vvv>.>.>..>v.>.>.>v...>.v>.>.v...vv....>.>.>v>>>.v>>..v.>v>>>>>...>.>v.>...v>..v.>v>>>v>.v>.v..>....>v>.v.>>.
v.v...>v>vv....v.>v.v>.....vvv.>>v.>v>.vv...v>>...>v>..>...v.......v...vvvvv>v..>.>v..v..>>.>v>..v>...>v.v>>vvv.>.>.v.......vv>....>.....vv
.v>v.v..>v>.>....>.>.vv..vv.....v.>.v>.>..vvv.v..v>v>.vv....>.vv.>v.>>v>v>.>v..v.v>v.v......>.v.v..>>>.>vvv.>..v>>.>vv..vv..>vv>.>.>vv>>v>>
v>.>..v>vv.>v.v>>v..>v>>>.>......v.v.v.>.>.v.v>.>.>.>....>v.>...v>.>.v.....>>v...v.....>.....v>..v..v.v>...>>v..vv>>.>....v.vv..v.......v..
v...>...>.>.v>>vv>v.vvv.>v..>.v..>>>v>........>v>.v>.>.vv.v>>.v......>vv.v>>v.v.v.>..>..v.v>v....>v.>.>>......>.>..v>.vv.v.v..>.v.>.v..v.vv
.v.>...v>>vv.>>vv..>...vv..v.v.v.>..v.>.v.....vv.>v>...>..>>>...v.....vvv.vv.>....v...>>v.>v.>>v...>v.v.>v.v..>>..v.v...>>>>v.>v..vv..>.>>.
.v>..>.>...>..v>v>.>.>..v>.v>..vv.v.vv.>vv>..>.>>...vv.>v.v....v...vv.vv.v.v..v.vv.....v...v>v.>v...vv..v>..vvv...>>vvv.v...>..>>>....v.>.v
vv.>vv...v>v.>..v.v>...v..v.v>vv.>.v>vvv>vv..>v>..>..>>...>.v.>...vv.v.>...>.>>.....>v.....v...v>>..v.v..v>.>.....>.v..>..v>.....v...>.>.v.
vvv.v..v>>.>..v.>..vv.>>>...>.>>vvv>v......v....>..v..v>v.>..v..>v>..>..>>...>.v.v..>v>v..>.v.v.v......vv.v>>>>v.v.>>v..>.v.v.>>v>.vv>>v...
>v.v.>.vv....v>>>.v......vv..>v...>v>.>...v>.>v..>v...v...v.vvv....vvvv.....>>>.>>v..v>v.>v..v...>.>v.v>>>vvv>vv>>.v>..>...>>v...>.v.>.>>.v
.vv>...>.v>.>.>v...v.v.>.>>.vv>.>>.>.>>>>......v>.v>..>v.>.>..>>......v..>.>>....v>v.>.>...>.vv>vv......v>v.>>>v....v.v>..>>.>v....v.....>v
v..v>.v.vvv>......>...>v.vv..>.>....>>v>>.v...v>vv>.vvvv>.>.v>vv>>..>..v.>>>.>>v..>>..>.vv..>vvvvvvv....>v>..>.>vv..>.vv>vv..>.>>>vv.>v.>>v
.v>..vv..>.....v..vv.>...v.>..v...v.v>>v.v>>...>>......>>.vv.>vvvv....vv.>v.>.v...>v....vv....v...>>......>.>v>..>>vv>.>..>..v.>.....>..v>.
>..vvv.v..v>.>.v..>....v>v.v.vvv>.....>vv.>v.>v...v.>v....>....>>..vvv.vvvv.>v.v.>v..>.vv>...>vv>>..>>.......v..v...........v.v>.v..vvv....
>>....vv...v.....>.>..v>v.>>v>vv>>.>.>..>.v..v..v.vvv..>v>v.v.>.v.>vv>....>vv.vv>>v..vvv.>vv..>....>v.>>.....>.>>>..>.v>.v....>.>.....vvv..
v.vv..v..>...vv..>v.v.v..v.........>>.vv.>...v.>..v..>>.....v.>>>>.>....>.>v>>..>...v..v>....>vv...>.v.>v>v.v.v>....v>..>.v..>v>.......v...
v.>>.>.v..v.v.....v...>v>.>.....v..v>v>v.>....>...>v>.v...>v>.v..>.>v.>>v.>.>>...v.>>...v.>>v...v.v.>.>>.v.>.>>.>.....v>.vv.v>.vvvv..v....v
.v>.v.vv>>>vvv..>v.vv>vv..v.v>.>v.....v..v>>v..vv.v>>v.>..v...v.vvv>...>>>>.....>.>.>.vv.v....>....>v>.>v>..v.v>>v>.>>.....>.v..>...v.>.>>v
..>.v.>.v.>vv.........>>.v.....>>.v..v>.>>.>.........>.........>..>>>.vvv.>.>>v..>.vv.>.v.vv>v.>v..>v...v..v>.....>.>.>..>>....>v.>..>.>v.>
..v>.v..v>.vv..>.vvv..>>.v.>.vv..>v>>....>.v.v>>v...vv...>.v.v.v...vvv.>>>..>>.v...>.>.v...>vv>>vvv...>>..>.v..v.v..>..v..vv..>v......>vv..
.v..>>.v.v>>>vv.>>>>v.>..>>vvv..vv.v..v>...>...v>>vv>>.v...>.>...v>..v.>v...vv..v.....>.>vv....>>..>.v>>vvv>..vv.>......v>v..>..v..>>v...v.
..>...>...>v...v>>>.v>vv.v..>vv.....v>.v.v.v>vv>vv.vv..>>.v.>>vvv.>>v......vv..v>>.>vv.vvv>..>..v...>.vv>...v.>v..>....v....vv..>..>>.v.v>>
>v...vv>.v>..>>..>v........v.vvv....v.v..v....v.>..>.>.>..>....>vv.vv......v...vv..v.vvvvv..v.>>>.v.v>..v...>...v......>....>v....vv.v.....
v..>....>>>v...v>>>v>>>...v.vv.vv.v.vv.v....>.v.>..>>..>>..>>v.>>..>vv.v.v..>>v>v>.v>v.......v...v..>.>>vv>.v.>.v......vvv.>..v.v>.....>..>
>v>.>vvv.v>.vv....>v>...v...v....>...v...>..>..v..>..>>....v...>.>>..>.>v>.....vvv.....v..>.v>..v>.>v.v.>vv.>>>v>>..vvv.v.v...vvv...v>>vv..
...>v>..>>..>v.vv.v...v.>.....v.>>.......vv>v>v......>v.v..v.v.>>..>v.vvv.....>>.v.v..>.v.v.>v...vv..>>>>>..>.>v.v.>v>.....>.vv.vv>..v.>.>v
.....vvv>vvv>.>v>>..vv>.v.v...v.>.>...v.v>v.vv.>v..>>>.>>>v.>...>.>........vv.>v.>.v>v........vv>v.>>..vv.v.v.v>...v.v>..v>.vv.v>>....v....
>...v>>>v>..v....>vv...>.>..v..>..v>>>vv..........>>>>..vv.>.v..vv.>.>>vv.v>v.........vvv>.>>vv>>>v....>>>v>v.>>.vv...>....v.....v...vv.v..
>>>v....>>v.v.>...>v..>.v>..>v>v..>.>.>v>v..>.>...>.>.>v>...v.......>>.>>vvv.v>.vv..>v.v.>>.>vvv.v...>v>v..>..v...>.v..>vv.>>.>..>..v.>..>v
.v...>>v>v...vv.vv.>>..>.>v...>vv>>v>>.>.v..v.>>.>v.v>>vv..v>...v.v.vv.vv>>v.>.v>>>.v>.>v......>v....>v..>>...>>...v>..v.v.v....>>.>.v.>..v
.v.>>>vvv.>..v>v.>vv.vvv.>>v.>.>>>..>....>>>>.>v.vvv>...>>v>>.>....v.v.>....>>>v>>..v..>>>.>vv..>.....>....>..>.>v.v>....vv.>>>....>....>..
v...>..>.>v...v.>.>>..vv>>v>>v..v.v.vv.....>.>........v..>v.v>v>...v....v.v>.vv>v>>...v>..v>.>..v..>v.v....>v..v.v.>.>>>.>.>>>v...v>v....v>
>......v.>.>v.>..>v>..>..>v.v....v.>....>.v>v.>v.>>..>..vvvv>v.....>.v...v..>....v...v.>>>v.....>>.v.v>>...>.>v...v..>....v.vv.vv...>....v.
v>>v.>vvv.v>.>v.v>.>.vv....>>.....>....v.vv.v>v>>>..vvv....>>.v.>vvv........>.>..vv.....vv>>v..>>.v.v..>.>..v.>...>..v>..vvv>v>>...v>v.>>..
v.v.v..>v>v..>v....v....>....>..v>>v>...>>>.v........v.....>>v..v>..v..>vvvv..vv>vv>.vv>vv..v.v>.v>v..>..v....>vv>v.>.>>vv.vvv..v.....>v>..''';
class Keyboard {
final _keys = <int, num>{};
Keyboard() {
window.onKeyDown.listen((KeyboardEvent event) {
_keys.putIfAbsent(event.keyCode, () => event.timeStamp!);
});
window.onKeyUp.listen((KeyboardEvent event) {
_keys.remove(event.keyCode);
});
}
bool isPressed(int keyCode) => _keys.containsKey(keyCode);
}
const int cellSize = 3;
late CanvasElement canvas;
late CanvasRenderingContext2D ctx;
Keyboard keyboard = Keyboard();
renderGrid(int i) {
ctx.fillStyle = 'darkgrey';
ctx.fillRect(0, 0, canvas.width!, canvas.height!);
for (var i in grid.indexes) {
var x = i.c * cellSize;
var y = i.r * cellSize;
var color =
grid[i] == '>' ? 'darkgreen' : (
grid[i] == 'v' ? 'green' : 'darkgrey');
ctx
..fillStyle = color
..strokeStyle = color
..fillRect(x, y, cellSize, cellSize)
..strokeRect(x, y, cellSize, cellSize);
}
querySelector('#status')!.text = 'Step number $i';
}
var stepNo = 0;
late Timer timer;
drawAndStepUntilComplete(dynamic callback) {
stepNo += 1;
var oldGrid = ListGrid.copyFrom(grid);
step();
callback(stepNo);
// if (stepNo == 10) timer.cancel();
if (keyboard.isPressed(KeyCode.SPACE)) timer.cancel();
if (grid == oldGrid) timer.cancel();
}
main() {
var t = DateTime.now();
canvas = querySelector('#canvas')! as CanvasElement;
ctx = canvas.getContext('2d') as CanvasRenderingContext2D;
ctx.fillStyle = 'darkgrey';
ctx.fillRect(0, 0, canvas.width!, canvas.height!);
var lines = data.split('\n');
print(lines.length);
print(lines.first.length);
buildGrid(lines);
timer = Timer.periodic(Duration(milliseconds:30),(timer)=>drawAndStepUntilComplete(renderGrid));
print('${DateTime.now().difference(t).inMilliseconds} milliseconds');
}
body {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
position: absolute;
width: 100%;
height: 100%;
}
* {
color: white;
font-family: Arial, Helvetica, sans-serif;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment