Skip to content

Instantly share code, notes, and snippets.

@mykdavies
Created December 9, 2022 17:19
Show Gist options
  • Save mykdavies/80c5b90c13b62634c12851d2d45925ee to your computer and use it in GitHub Desktop.
Save mykdavies/80c5b90c13b62634c12851d2d45925ee to your computer and use it in GitHub Desktop.
AOC 2022 Day 9 flutter
import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';
// Hack for missing `more` library
extension IntegerRangeExtension on int {
List<int> to(int end) => List.generate(end - this, (i) => i + this);
}
void main() async {
runApp(
MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: const Color(0xFF15202D),
child: const SizedBox.expand(
child: Rope(),
),
),
),
),
);
}
class RopePainter extends CustomPainter {
Model model;
RopePainter(this.model);
@override
void paint(Canvas canvas, Size size) {
var scale = model.maxDim - model.minDim;
var color = Colors.grey[300]!;
for (var s in model.anySeen) {
drawSeed(canvas, 400.0 * (s.x - model.minDim) / scale,
400.0 * (s.y - model.minDim) / scale, color);
}
color = Colors.grey;
for (var s in model.seen) {
drawSeed(canvas, 400.0 * (s.x - model.minDim) / scale,
400.0 * (s.y - model.minDim) / scale, color);
}
color = Colors.orange;
for (var s in model.chain) {
drawSeed(canvas, 400.0 * (s.x - model.minDim) / scale,
400.0 * (s.y - model.minDim) / scale, color);
}
var s = model.chain.last;
drawSeed(canvas, 400.0 * (s.x - model.minDim) / scale,
400.0 * (s.y - model.minDim) / scale, Colors.red);
s = model.chain.first;
drawSeed(canvas, 400.0 * (s.x - model.minDim) / scale,
400.0 * (s.y - model.minDim) / scale, Colors.black);
}
@override
bool shouldRepaint(RopePainter oldDelegate) {
return true;
//return oldDelegate.model.chain != model.chain;
}
// Draw a small circle representing a seed centered at (x,y).
void drawSeed(Canvas canvas, double x, double y, Color color) {
final paint = Paint()
..strokeWidth = 2
..style = PaintingStyle.fill
..color = color;
canvas.drawCircle(Offset(x, y), 2.0, paint);
}
}
class Rope extends StatefulWidget {
const Rope({super.key});
@override
State<StatefulWidget> createState() {
return _RopeState();
}
}
int segments = 2;
class _RopeState extends State<Rope> {
Model model;
late Timer _timer;
bool _running = false;
_RopeState() : model = Model(segments);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Planck rope")),
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
decoration: BoxDecoration(
border: Border.all(
color: Colors.transparent,
),
),
child: SizedBox(
width: 400,
height: 400,
child: CustomPaint(
painter: RopePainter(model),
),
),
),
Text("Step number: ${model.nMove}"),
Text("Length of rope: $segments"),
ConstrainedBox(
constraints: const BoxConstraints.tightFor(width: 300),
child: Slider.adaptive(
min: 2,
max: 100,
value: segments.toDouble(),
onChanged: (newValue) {
setState(() {
segments = newValue.toInt();
});
},
),
),
ElevatedButton(
onPressed: () {
toggleTimer();
},
child: Text(_running ? "running" : "start"),
),
],
),
);
}
@override
void dispose() {
_timer.cancel();
super.dispose();
}
void toggleTimer() {
setState(() {
_running = !_running;
if (_running) model = Model(segments);
});
_timer = Timer.periodic(
const Duration(milliseconds: 10),
(Timer timer) {
setState(() {
if (!_running) {
timer.cancel();
} else if (!model.makeMove()) {
_running = false;
}
});
},
);
}
}
class Model {
List<Point<int>> chain;
int segments;
var seen = {const Point(0, 0)};
var anySeen = {const Point(0, 0)};
var maxDim = 10;
var minDim = -10;
var nMove = 0;
List<String> moves;
Model(this.segments)
: moves = lines.split('\n'),
chain = List.generate(segments, (index) => const Point(0, 0));
var dirs = {
'R': const Point(1, 0),
'L': const Point(-1, 0),
'U': const Point(0, 1),
'D': const Point(0, -1)
};
bool makeMove() {
moveSegment(int ix) {
var delta = chain[ix - 1] - chain[ix];
if (delta.x.abs() <= 1 && delta.y.abs() <= 1) return;
chain[ix] += Point(delta.x.sign, delta.y.sign);
anySeen.add(chain[ix]);
maxDim = max(maxDim, chain[ix].x);
maxDim = max(maxDim, chain[ix].y);
minDim = min(minDim, chain[ix].x);
minDim = min(minDim, chain[ix].y);
}
var ps = moves[nMove].split(' ');
for (var _ in 0.to(int.parse(ps.last))) {
chain[0] += dirs[ps.first]!;
anySeen.add(chain.first);
1.to(segments).forEach((ix) => moveSegment(ix));
seen.add(chain.last);
}
nMove += 1;
return nMove < moves.length;
}
}
var lines = '''U 2
D 2
L 2
R 2
D 1
L 2
R 1
L 2
U 2
L 1
R 1
L 1
R 1
U 2
D 2
L 1
U 1
L 2
D 1
U 2
D 1
R 1
D 1
U 2
D 2
U 1
R 2
D 2
R 1
U 1
D 1
R 1
L 2
U 2
D 2
L 1
R 2
L 2
R 1
D 1
R 1
D 2
U 2
R 2
D 2
U 2
D 1
U 1
R 2
U 2
R 2
U 2
D 1
U 1
R 2
D 1
U 2
L 1
U 2
D 1
R 2
U 1
R 2
D 1
L 2
R 1
L 1
R 2
U 1
L 1
D 2
L 2
D 1
R 2
D 1
R 2
U 1
D 1
L 1
R 1
L 2
R 1
U 1
D 2
L 1
D 2
R 1
L 1
R 1
U 2
L 2
D 1
U 1
D 2
U 2
R 2
U 2
R 1
U 2
D 1
R 2
D 2
U 1
D 1
R 2
U 1
R 2
L 1
R 1
D 2
U 1
R 3
D 1
R 1
L 3
D 2
R 1
D 1
R 3
L 2
D 2
L 1
U 3
D 3
L 1
D 1
L 3
D 1
U 3
L 1
R 2
U 2
D 1
L 2
D 3
R 1
U 2
L 2
U 1
L 1
U 2
D 2
U 1
L 1
D 3
R 1
D 3
R 1
D 1
U 1
L 2
U 3
D 2
U 1
R 3
D 1
U 3
L 3
U 1
R 2
L 2
R 1
L 1
U 1
L 1
D 2
L 2
U 2
L 1
D 2
R 1
U 2
L 2
R 2
L 1
U 2
L 2
R 3
L 3
D 1
R 3
L 3
D 2
U 3
L 3
D 2
R 2
L 2
D 2
U 2
L 3
R 1
U 2
L 1
D 3
U 2
D 3
L 2
D 3
U 1
D 3
U 3
L 3
D 2
L 3
R 2
D 3
R 1
D 2
U 2
D 1
U 3
D 2
L 2
D 1
R 1
L 2
R 2
L 3
U 3
L 1
D 2
R 1
L 2
D 2
R 1
D 1
L 4
D 2
R 3
U 4
R 4
U 1
D 4
U 4
D 4
U 2
R 3
U 3
R 4
U 3
L 2
R 1
U 4
D 4
R 2
D 4
R 2
U 2
D 1
R 1
L 3
R 2
D 3
R 3
U 1
D 2
R 4
U 1
D 4
R 1
U 1
D 2
U 4
D 3
L 1
D 4
L 2
D 2
R 3
L 1
U 4
L 4
U 3
D 3
L 2
D 3
U 1
R 4
D 3
L 3
D 4
L 1
D 2
U 4
L 2
D 1
R 3
D 4
U 3
D 4
U 2
L 2
R 3
L 4
R 2
L 4
U 3
L 4
D 3
U 4
L 2
U 3
R 2
D 2
U 1
D 2
L 1
R 4
D 3
L 1
D 3
U 2
L 4
D 4
L 4
R 3
L 3
U 2
L 1
R 2
L 4
D 2
L 3
U 3
D 1
L 2
R 3
U 4
R 1
U 3
D 4
L 2
U 2
L 2
R 5
D 5
U 3
R 4
L 4
U 5
D 3
U 2
L 5
U 1
R 3
L 3
U 4
L 3
D 5
U 2
R 1
U 4
R 5
D 2
L 1
U 3
R 5
D 2
U 3
D 5
U 2
D 2
U 2
L 4
U 5
R 4
U 4
L 3
U 5
R 4
L 4
D 5
R 4
D 4
L 2
R 3
L 5
D 3
U 2
D 4
R 1
U 5
R 4
D 1
U 1
L 1
U 3
D 2
U 4
D 3
U 5
R 2
U 5
L 1
R 5
U 5
R 4
D 3
R 1
D 3
U 3
R 1
L 1
D 5
U 4
R 3
D 3
L 2
U 1
L 2
U 5
D 5
U 2
D 4
L 2
D 2
L 1
D 4
U 2
D 4
R 1
U 1
D 4
L 3
D 3
U 2
D 2
L 1
D 5
R 1
L 2
D 5
U 5
L 3
D 1
R 2
L 2
U 1
L 2
D 5
L 1
R 2
D 4
U 6
L 4
R 5
D 4
U 2
R 1
D 4
L 2
R 5
L 6
R 2
U 6
R 5
D 1
U 1
L 6
R 2
L 6
D 3
L 2
R 6
U 6
L 1
D 3
R 1
D 2
R 4
L 4
U 6
L 3
D 1
U 1
L 4
R 3
D 3
R 6
D 3
L 4
R 5
L 5
D 3
U 3
D 6
R 4
D 5
L 2
D 1
R 4
L 6
R 5
U 4
D 5
L 3
D 1
L 6
D 5
L 3
U 3
R 4
L 4
D 6
R 3
L 1
R 1
U 4
D 6
L 3
R 2
D 1
L 2
U 3
D 3
L 5
U 6
L 5
D 5
R 5
U 6
D 2
U 2
R 5
U 6
D 2
R 1
L 3
U 1
L 6
U 1
R 3
L 3
D 4
U 2
R 3
L 1
D 3
R 5
L 2
D 3
L 2
U 6
R 5
U 5
L 1
U 5
L 6
D 4
U 2
L 5
U 3
D 2
U 4
D 4
U 2
R 5
L 4
D 3
R 6
D 1
R 4
U 5
L 7
D 2
R 6
U 4
L 5
D 5
L 2
D 1
R 4
D 6
L 5
D 4
R 7
U 4
D 7
U 4
R 3
L 7
R 7
D 3
R 5
U 2
R 3
D 5
R 5
U 4
D 2
U 5
R 1
U 5
R 5
U 7
R 4
D 6
L 1
U 3
D 4
U 3
D 7
U 2
L 4
D 6
R 7
U 1
L 6
D 4
R 6
D 4
U 5
L 4
D 6
L 5
D 1
L 5
U 3
L 3
U 2
R 6
U 3
D 4
U 4
L 1
D 3
L 3
R 6
U 2
L 3
D 7
L 2
U 7
L 4
U 4
D 7
L 4
D 3
L 3
D 3
U 1
D 5
L 1
R 4
D 7
L 7
D 6
R 3
U 1
R 6
L 4
D 6
R 5
U 7
L 6
R 6
L 3
D 4
U 1
R 2
L 1
R 1
U 4
D 1
L 4
R 2
U 4
R 3
D 1
U 3
R 4
L 2
U 4
L 3
D 7
R 6
U 4
L 4
D 7
R 6
D 7
L 5
R 5
D 7
R 4
D 1
L 6
U 8
L 4
U 2
L 6
R 1
L 5
U 5
D 3
L 8
R 3
L 3
R 5
U 4
R 6
D 4
U 1
L 2
R 8
D 7
U 3
D 4
L 8
U 6
L 5
R 1
U 1
R 4
U 5
D 2
R 2
U 2
L 1
U 8
D 4
R 7
U 3
D 6
R 6
L 3
R 8
D 7
U 2
R 5
L 3
U 1
D 6
R 1
D 3
L 2
U 2
D 8
U 8
L 8
U 5
D 6
U 6
L 6
U 6
D 5
R 8
L 7
D 6
R 1
D 4
L 1
U 7
R 3
L 2
D 6
R 6
D 7
L 6
U 5
R 4
D 7
U 7
D 5
L 4
R 6
D 3
L 6
U 2
D 7
R 7
U 5
D 3
U 2
L 1
D 2
U 4
L 1
R 3
L 6
U 9
D 8
L 3
R 3
D 4
R 3
U 6
L 7
D 8
R 9
D 1
L 3
R 6
D 4
L 3
U 6
L 7
R 7
U 9
L 9
R 7
U 8
R 7
U 7
D 1
L 9
R 6
U 4
D 6
L 8
R 7
D 6
U 5
R 6
D 8
L 2
D 5
R 9
U 9
L 7
U 2
R 7
L 6
U 6
D 5
L 8
D 7
L 8
D 9
R 7
L 5
D 9
L 7
R 2
L 6
R 9
D 8
R 8
U 7
R 4
L 6
R 1
U 9
D 2
R 7
D 5
R 4
D 1
U 7
D 5
R 4
U 2
D 5
L 9
R 6
U 7
D 5
U 4
D 6
L 3
R 6
U 3
R 9
L 9
U 4
D 1
U 3
R 7
D 8
R 9
U 1
R 1
U 4
D 7
R 1
L 1
R 8
D 1
U 1
L 3
U 2
D 6
R 6
L 1
R 9
L 2
D 3
U 8
D 9
U 1
L 10
U 10
D 8
U 9
L 3
R 2
D 3
U 4
L 2
R 10
L 9
U 5
L 5
D 4
L 7
U 1
L 1
R 1
L 7
D 7
U 7
L 3
U 10
R 7
U 9
L 6
R 2
D 9
L 10
D 9
L 9
R 5
L 5
R 8
D 9
R 1
D 6
L 1
U 9
R 3
L 10
D 10
L 5
D 10
R 3
U 7
D 6
U 7
D 3
R 5
D 5
L 6
D 4
U 7
D 7
R 9
U 10
R 4
U 1
R 1
U 8
R 3
U 10
R 6
L 1
U 3
R 9
U 2
D 8
R 5
D 3
R 3
U 9
R 6
L 8
R 2
L 5
R 2
L 10
D 2
L 3
U 1
D 10
L 5
R 10
D 7
L 2
R 7
U 6
D 4
L 8
D 8
U 3
R 2
U 10
D 8
U 7
D 9
U 4
R 9
L 2
R 8
U 9
R 10
U 10
D 8
R 8
U 2
L 7
U 3
L 1
D 7
R 1
U 2
R 8
U 4
D 4
L 2
U 9
L 7
D 7
L 2
R 2
D 9
L 11
U 4
L 3
D 7
U 7
R 6
D 7
U 11
R 4
L 3
R 2
U 9
L 1
U 11
D 7
R 10
D 10
U 7
L 1
U 8
L 2
D 11
L 6
D 1
L 8
D 9
U 9
R 5
L 4
D 7
U 8
L 5
D 3
R 6
L 5
R 7
L 7
D 7
L 10
U 4
L 1
U 9
D 2
R 2
U 4
D 3
R 9
D 11
U 10
L 3
R 9
U 6
L 1
R 9
L 8
U 2
L 3
U 9
D 2
L 4
D 5
U 4
L 5
D 11
L 6
U 10
D 9
U 3
L 9
U 11
D 3
L 7
D 4
L 8
U 5
D 10
L 7
U 10
L 10
U 4
D 10
L 7
R 2
D 3
L 6
R 5
U 11
D 4
U 6
D 9
R 2
L 9
U 9
R 11
U 9
L 10
R 8
L 5
R 2
L 12
R 8
U 10
R 7
D 7
U 3
L 10
U 10
L 11
U 1
R 8
D 4
R 3
D 7
U 9
L 2
R 9
L 8
R 6
L 7
D 11
U 12
D 6
U 7
L 11
D 1
U 9
R 7
L 3
D 3
U 5
R 5
L 3
R 11
L 2
U 9
D 9
R 8
U 7
D 5
L 9
D 2
L 1
R 5
U 9
R 10
U 12
L 9
D 12
R 5
U 2
L 7
R 6
L 1
U 12
L 10
R 11
D 1
L 8
U 6
D 10
R 10
L 1
U 11
D 2
R 6
U 1
R 4
D 1
R 6
U 12
D 1
L 1
U 4
D 4
U 12
D 12
L 5
R 10
D 4
R 1
D 8
U 6
R 7
D 12
U 9
D 6
U 6
D 1
R 2
L 7
R 5
L 4
U 1
L 10
R 8
L 12
D 11
U 2
L 10
D 12
R 9
D 1
U 7
L 5
D 4
U 12
L 12
D 11
U 11
L 6
D 2
R 11
L 1
U 10
L 12
D 11
R 8
D 2
L 10
R 4
L 10
D 13
L 10
D 5
U 9
L 3
D 2
U 3
D 11
L 7
D 11
U 4
D 11
U 8
L 5
U 6
L 3
U 3
R 8
D 10
R 1
D 13
L 7
D 7
R 1
D 2
L 3
D 5
R 5
L 5
U 7
L 4
D 1
L 11
R 10
U 8
D 9
U 8
R 11
L 1
R 6
D 6
U 4
L 2
D 11
U 10
D 4
L 11
R 5
U 2
D 10
U 12
L 12
D 11
L 12
D 10
L 4
U 7
D 1
R 4
L 10
D 9
R 5
D 3
L 3
D 5
R 9
D 10
L 8
R 6
D 4
U 5
R 11
U 13
R 10
U 11
R 9
U 4
D 8
U 4
D 6
R 12
U 12
R 9
U 12
L 13
U 6
D 10
R 2
L 5
U 3
L 8
R 11
D 13
R 6
U 13
L 3
U 3
D 4
L 11
U 14
D 13
U 1
L 8
U 13
R 14
U 2
L 13
R 1
U 1
L 13
R 4
D 10
R 10
D 14
R 7
D 10
L 2
R 7
U 10
R 13
D 7
U 11
D 13
L 7
U 8
L 4
D 7
L 2
R 2
L 7
D 13
U 2
R 10
U 2
L 6
R 11
D 11
L 13
D 13
L 14
R 4
L 7
D 7
R 11
U 10
D 3
R 4
L 2
R 9
U 7
L 1
R 5
L 3
U 8
R 6
U 10
L 3
R 12
U 13
D 3
R 7
D 1
U 7
R 13
D 1
R 10
L 8
R 8
L 4
R 9
L 5
D 13
L 3
U 8
L 13
U 4
R 3
U 2
R 7
D 9
R 5
U 4
R 5
D 7
L 14
R 13
D 3
L 12
D 7
U 5
L 8
D 10
U 14
D 8
R 12
U 3
L 9
R 7
U 9
R 5
L 6
U 13
R 6
L 8
R 12
D 13
U 6
L 12
U 15
D 10
U 15
D 7
R 14
D 5
R 9
U 11
L 8
D 9
R 3
U 3
R 8
D 6
L 3
R 9
U 12
L 12
D 3
U 13
L 4
R 3
D 6
R 12
D 15
L 3
D 9
R 9
D 11
L 6
D 6
L 3
U 2
D 6
L 4
D 3
U 5
D 1
U 11
R 11
U 5
L 12
U 14
R 1
D 10
L 8
R 12
L 5
U 2
D 2
U 8
D 5
U 14
D 2
L 6
R 5
D 10
L 10
U 2
R 2
U 2
L 15
R 14
D 12
L 4
U 2
D 10
R 14
U 13
R 9
L 4
U 15
D 8
R 4
D 9
U 1
R 4
D 3
L 3
D 7
L 12
R 8
D 7
L 15
R 12
U 10
L 11
R 1
U 13
R 14
L 14
D 14
U 1
R 1
U 13
L 15
U 11
D 15
U 1
R 15
L 4
U 12
R 8
U 10
R 7
U 3
L 14
U 14
R 8
D 1
U 9
L 3
U 8
D 5
L 12
U 15
D 13
L 11
R 4
U 12
R 7
L 15
U 8
D 7
L 8
R 7
D 1
L 12
U 15
L 15
U 9
R 10
D 8
U 10
R 15
D 3
R 14
D 13
L 3
R 2
U 14
L 3
R 7
L 15
D 4
R 14
U 11
L 2
U 16
L 6
D 4
L 3
U 8
R 16
U 8
D 13
L 11
U 11
D 11
R 14
D 15
L 4
R 13
U 4
D 15
U 10
D 4
R 14
D 5
U 7
R 1
L 6
U 5
L 10
U 15
L 14
D 2
U 5
R 8
L 14
U 3
R 9
L 14
R 8
D 10
L 8
R 9
L 14
D 8
R 16
U 2
D 12
L 10
R 12
D 3
R 11
U 11
D 7
L 10
D 15
U 13
R 5
D 8
U 12
L 3
R 6
D 10
R 5
U 8
R 16
U 16
D 3
R 11
D 7
U 4
R 14
L 12
U 5
L 1
U 14
L 15
R 13
U 16
D 6
U 7
D 11
L 11
U 13
R 10
D 16
U 14
L 1
D 17
U 14
D 2
L 17
U 1
L 6
D 17
R 13
L 10
U 16
L 3
U 4
D 4
L 2
D 10
L 2
R 11
L 14
D 6
U 13
R 8
D 8
L 4
U 8
D 17
R 11
L 7
U 15
L 7
R 11
D 13
U 3
R 12
D 9
L 11
D 14
U 10
L 11
D 13
L 17
R 7
D 4
R 16
D 1
U 8
L 6
R 9
L 7
D 2
L 3
D 13
L 6
U 8
L 13
U 6
L 12
U 5
D 1
R 10
L 17
D 13
U 1
L 9
R 8
D 10
U 10
R 6
U 17
R 16
D 3
L 4
D 13
L 1
U 6
R 15
U 6
D 6
U 1
D 12
U 12
R 6
D 2
R 13
D 16
L 14
D 16
U 12
R 13
U 14
R 4
U 3
D 3
R 11
U 2
L 17
R 13
D 2
R 5
L 5
D 17
R 9
D 3
U 16
R 8
L 18
R 12
L 8
R 10
L 9
R 4
U 1
D 4
U 7
L 2
D 9
R 12
D 2
R 1
U 11
D 4
L 16
U 18
D 3
R 14
L 4
U 2
L 16
R 4
L 5
D 3
U 17
R 3
U 5
R 8
D 4
L 3
D 18
L 12
D 17
U 15
L 1
D 17
R 11
U 5
R 3
L 16
R 6
L 14
R 4
U 15
D 7
R 15
L 17
U 14
L 9
R 9
L 9
D 11
L 10
U 7
L 1
U 11
R 4
U 7
L 10
D 16
R 3
L 17
R 16
L 9
D 4
R 17
L 7
U 5
D 16
R 5
D 13
U 5
R 8
D 10
R 1
L 2
R 10
U 12
D 2
U 12
L 10
R 6
L 18
U 7
D 9
R 16
L 18
D 17
R 14
U 9
R 5
D 4
R 18
D 6
R 7
U 12
L 7
D 11
U 12
R 12
U 4
L 8
U 6
D 11
L 8
R 18
U 12
R 2
U 13
D 3
R 10
D 4
R 10
L 18
D 1
L 18
U 2
D 19
U 14
L 14
U 3
D 14
R 4
L 10
D 13
R 6
D 14
R 13
D 13
R 11
U 16
L 18
U 3
R 8
U 17
R 7
L 12
D 3
L 6
R 6
D 18
L 2
D 16
R 1
U 16
R 14
L 9
D 6
L 5
D 6
U 9
L 11
D 18
R 5
L 15
D 18
R 18
L 3
R 18
L 18
R 2
L 15
R 12
D 9
L 3
U 17
R 1
U 18
D 16
U 17
L 5
U 9
R 4
L 14
D 15
R 11
U 18
L 19
U 12
R 13
U 16
D 16
L 8
D 16
R 4
U 5
D 18
R 13
D 13
U 9
R 14
L 14
U 17
D 9
L 8
R 18
L 12
R 16
L 11
U 14
D 2
L 19
U 19
D 11
R 11
U 16
D 15
U 16
L 18
D 3
L 18
U 7
L 14
D 6
U 9
D 2
L 19
D 17''';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment