Last active
December 25, 2021 22:29
-
-
Save mykdavies/c14ea0dd4831cb820466518e0b2e7502 to your computer and use it in GitHub Desktop.
AOC2021 Day 25
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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> | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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'); | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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