about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBen Harris <ben@tilde.team>2021-12-22 10:04:15 -0500
committerBen Harris <ben@tilde.team>2021-12-22 10:04:15 -0500
commitf59f572a94717161779674a2c6136770648b93b1 (patch)
treed59fe82c133feb6b3697c2857367382997729e28
parent752b4045fc9d58a22933c847a12d3788e1fda627 (diff)
days 21 and 22
-rw-r--r--aoc2021.test/DayTests.cs4
-rw-r--r--aoc2021/Day21.cs107
-rw-r--r--aoc2021/Day22.cs71
-rw-r--r--aoc2021/input/day21.in2
-rw-r--r--aoc2021/input/day22.in420
-rw-r--r--aoc2021/input/test21.in2
-rw-r--r--aoc2021/input/test22.in22
7 files changed, 628 insertions, 0 deletions
diff --git a/aoc2021.test/DayTests.cs b/aoc2021.test/DayTests.cs
index ff0346d..54d5997 100644
--- a/aoc2021.test/DayTests.cs
+++ b/aoc2021.test/DayTests.cs
@@ -41,6 +41,8 @@ public class DayTests
     [DataRow(typeof(Day18), "4289", "4807")]
     // [DataRow(typeof(Day19), "338", "9862")] // takes too long and i don't feel like optimizing
     [DataRow(typeof(Day20), "5306", "17497")]
+    [DataRow(typeof(Day21), "512442", "346642902541848")]
+    [DataRow(typeof(Day22), "658691", "1228699515783640")]
     public void CheckAllDays(Type dayType, string part1, string part2)
     {
         var s = Stopwatch.StartNew();
@@ -91,6 +93,8 @@ public class DayTests
     [DataRow(typeof(Day18), "4140", "3993")]
     [DataRow(typeof(Day19), "79", "3621")]
     [DataRow(typeof(Day20), "35", "3351")]
+    [DataRow(typeof(Day21), "739785", "444356092776315")]
+    [DataRow(typeof(Day22), "590784", "39769202357779")]
     public void CheckTestInputs(Type dayType, string part1, string part2)
     {
         Day.UseTestInput = true;
diff --git a/aoc2021/Day21.cs b/aoc2021/Day21.cs
new file mode 100644
index 0000000..7b045fe
--- /dev/null
+++ b/aoc2021/Day21.cs
@@ -0,0 +1,107 @@
+namespace aoc2021;
+
+/// <summary>
+/// Day 21: <see href="https://adventofcode.com/2021/day/21"/>
+/// </summary>
+public sealed class Day21 : Day
+{
+    private readonly int _player1, _player2;
+    private readonly Dictionary<int, ulong> _possibleRollOutComes = new();
+    private int _deterministicDie = 1;
+    private int _rollCount;
+    private ulong _player1Victories, _player2Victories;
+
+    public Day21() : base(21, "Dirac Dice")
+    {
+        var s = Input
+            .Select(l => l.Split(": ")[1])
+            .Select(int.Parse)
+            .ToList();
+
+        _player1 = s[0];
+        _player2 = s[1];
+    }
+
+    private int Turn(int pos)
+    {
+        var moves = _deterministicDie;
+        IncMod(ref _deterministicDie);
+        moves += _deterministicDie;
+        IncMod(ref _deterministicDie);
+        moves += _deterministicDie;
+        IncMod(ref _deterministicDie);
+        return (moves + pos - 1) % 10 + 1;
+    }
+
+    private void IncMod(ref int i, int limit = 100)
+    {
+        _rollCount++;
+        if (i >= limit) i = 1;
+        else i++;
+    }
+
+    private void RollDiracDie(int player1Points, int player2Points, int player1Pos, int player2Pos,
+        int playerTurn, ulong universes)
+    {
+        if (player1Points > 21 || player2Points > 21) return;
+
+        if (playerTurn == 1)
+            foreach (var (key, value) in _possibleRollOutComes)
+            {
+                var pts = (key + player1Pos - 1) % 10 + 1;
+                if (player1Points + pts < 21)
+                    RollDiracDie(player1Points + pts, player2Points, pts, player2Pos, 2, (value * universes));
+                else
+                    _player1Victories += universes * value;
+            }
+        else
+            foreach (var (key, value) in _possibleRollOutComes)
+            {
+                var pts = (key + player2Pos - 1) % 10 + 1;
+                if (player2Points + pts < 21)
+                    RollDiracDie(player1Points, player2Points + pts, player1Pos, pts, 1, (value * universes));
+                else
+                    _player2Victories += universes * value;
+            }
+    }
+
+    public override object Part1()
+    {
+        int p1Score = 0, p2Score = 0, p1Pos = _player1, p2Pos = _player2;
+
+        while (true)
+        {
+            if (p2Score >= 1000) break;
+
+            var dest1 = Turn(p1Pos);
+            p1Score += dest1;
+            p1Pos = dest1;
+
+            if (p1Score >= 1000) break;
+
+            var dest2 = Turn(p2Pos);
+            p2Score += dest2;
+            p2Pos = dest2;
+        }
+
+        return Math.Min(p1Score, p2Score) * _rollCount;
+    }
+
+    public override object Part2()
+    {
+        for (var x = 1; x <= 3; x++)
+        for (var y = 1; y <= 3; y++)
+        for (var z = 1; z <= 3; z++)
+        {
+            var total = x + y + z;
+            if (!_possibleRollOutComes.ContainsKey(total))
+                _possibleRollOutComes[total] = 1;
+            else
+                _possibleRollOutComes[total]++;
+        }
+
+        RollDiracDie(0, 0, _player1, _player2, 1, 1);
+
+        return Math.Max(_player1Victories, _player2Victories);
+    }
+}
\ No newline at end of file
diff --git a/aoc2021/Day22.cs b/aoc2021/Day22.cs
new file mode 100644
index 0000000..e5d081b
--- /dev/null
+++ b/aoc2021/Day22.cs
@@ -0,0 +1,71 @@
+namespace aoc2021;
+
+/// <summary>
+/// Day 22: <see href="https://adventofcode.com/2021/day/22"/>
+/// </summary>
+public sealed class Day22 : Day
+{
+    private readonly List<Instruction> _instructions = new();
+    
+    public Day22() : base(22, "Reactor Reboot")
+    {
+        foreach (var line in Input)
+        {
+            var s = line.Split(' ');
+            var e = s[1]
+                .Split(',')
+                .Select(i => i.Split('=')[1])
+                .SelectMany(l => l.Split(".."))
+                .Select(int.Parse)
+                .ToList();
+            
+            _instructions.Add(new(s[0] == "off", new(new(e[0], e[1]), new(e[2], e[3]), new(e[4], e[5]))));
+        }
+    }
+
+    private long ActiveCubes(int x, Region3D region)
+    {
+        if (region.IsEmpty || x < 0) return 0;
+        
+        var intersection = region.Intersect(_instructions[x].Region);
+        var activeInRegion = ActiveCubes(x - 1, region);
+        var activeInIntersection = ActiveCubes(x - 1, intersection);
+        var activeOutsideIntersection = activeInRegion - activeInIntersection;
+
+        // outside the intersection is unaffected, the rest is either on or off:
+        return _instructions[x].Disable ? activeOutsideIntersection : activeOutsideIntersection + intersection.Volume;
+    
+    }
+
+    public override object Part1()
+    {
+        var f = new RangeSegment(-50, 50);
+        return ActiveCubes(_instructions.Count - 1, new(f, f, f));
+    }
+
+    public override object Part2()
+    {
+        var f = new RangeSegment(-int.MaxValue, int.MaxValue);
+        return ActiveCubes(_instructions.Count - 1, new(f, f, f));
+    }
+
+    private record Instruction(bool Disable, Region3D Region);
+
+    private record RangeSegment(int From, int To)
+    {
+        public bool IsEmpty => From > To;
+        public long Length => IsEmpty ? 0 : To - From + 1;
+
+        public RangeSegment Intersect(RangeSegment other) =>
+            new(Math.Max(From, other.From), Math.Min(To, other.To));
+    }
+
+    private record Region3D(RangeSegment X, RangeSegment Y, RangeSegment Z)
+    {
+        public bool IsEmpty => X.IsEmpty || Y.IsEmpty || Z.IsEmpty;
+        public long Volume => X.Length * Y.Length * Z.Length;
+
+        public Region3D Intersect(Region3D other) =>
+            new(X.Intersect(other.X), Y.Intersect(other.Y), Z.Intersect(other.Z));
+    }
+}
diff --git a/aoc2021/input/day21.in b/aoc2021/input/day21.in
new file mode 100644
index 0000000..80e66ac
--- /dev/null
+++ b/aoc2021/input/day21.in
@@ -0,0 +1,2 @@
+Player 1 starting position: 8
+Player 2 starting position: 9
diff --git a/aoc2021/input/day22.in b/aoc2021/input/day22.in
new file mode 100644
index 0000000..a5ee55b
--- /dev/null
+++ b/aoc2021/input/day22.in
@@ -0,0 +1,420 @@
+on x=-1..48,y=-18..35,z=-45..4
+on x=-18..33,y=-45..9,z=-47..-1
+on x=-19..32,y=-9..43,z=-6..44
+on x=-27..22,y=-22..29,z=-11..43
+on x=-41..3,y=2..49,z=-21..26
+on x=-12..35,y=-39..12,z=-11..34
+on x=-49..3,y=-49..-5,z=-35..19
+on x=-49..3,y=-37..14,z=-35..15
+on x=-11..41,y=-8..38,z=-16..28
+on x=-39..9,y=-7..46,z=-36..11
+off x=22..35,y=-6..10,z=-4..6
+on x=0..45,y=-33..20,z=-20..33
+off x=-28..-12,y=18..32,z=10..23
+on x=-10..43,y=-22..23,z=-29..21
+off x=-2..15,y=-19..-7,z=32..44
+on x=-10..36,y=-22..27,z=-28..26
+off x=-43..-24,y=-4..15,z=-3..7
+on x=-5..49,y=-10..36,z=-7..46
+off x=-10..0,y=25..36,z=32..42
+on x=-35..10,y=3..47,z=-42..2
+on x=10292..26688,y=59532..71266,z=-61766..-43846
+on x=-53182..-39353,y=-65776..-43374,z=-40984..-16111
+on x=-58009..-33532,y=54907..83704,z=-19177..548
+on x=30209..49381,y=5448..9353,z=-78210..-68638
+on x=51178..66318,y=-34558..-12845,z=-59023..-37776
+on x=20479..27372,y=35992..51149,z=43388..66987
+on x=9799..14318,y=-88771..-76838,z=-19272..-5864
+on x=50706..68680,y=-54387..-34070,z=-3382..19323
+on x=335..28845,y=-6395..-2340,z=75205..89948
+on x=-29430..-13853,y=-45838..-31566,z=43363..71374
+on x=-8524..10461,y=53497..83098,z=26986..57106
+on x=-62497..-50524,y=-1582..23857,z=-60748..-41025
+on x=74143..90251,y=-15780..-10376,z=-8777..15673
+on x=-13213..2379,y=43234..71768,z=-64343..-34201
+on x=-30723..-20015,y=57148..79890,z=35293..44175
+on x=64353..86936,y=-28800..-8479,z=-54151..-23176
+on x=-11413..2815,y=-47196..-25539,z=-90134..-61660
+on x=48979..77426,y=28092..51755,z=3637..39445
+on x=-69888..-61455,y=20275..44095,z=-16249..13206
+on x=-58472..-33079,y=21591..55664,z=-47245..-34518
+on x=-44223..-10150,y=28211..45901,z=-68011..-56023
+on x=44570..65290,y=-25796..6542,z=43364..71346
+on x=27585..38556,y=32419..45013,z=57905..66635
+on x=40846..62786,y=-40412..-22729,z=-75758..-39230
+on x=11933..38307,y=-51813..-39599,z=-71883..-55399
+on x=-76594..-52635,y=3272..29125,z=18608..37580
+on x=-71899..-44604,y=-26855..-769,z=-67223..-48961
+on x=-82509..-58865,y=-65877..-39005,z=-18683..1407
+on x=46779..58672,y=50896..59778,z=-21199..-17035
+on x=9242..26713,y=-65765..-60594,z=-46424..-34172
+on x=-42524..-28659,y=-73080..-67742,z=-20495..8365
+on x=-77762..-50266,y=32883..70133,z=6195..20808
+on x=-80376..-60768,y=16047..28475,z=-3463..31528
+on x=-67071..-55234,y=-55054..-42227,z=-25267..-12001
+on x=-52747..-25140,y=53033..68811,z=-30800..-13204
+on x=-74056..-50742,y=33253..61846,z=-11051..22554
+on x=884..32461,y=19315..49666,z=57587..77654
+on x=-29481..5152,y=56852..82746,z=-29984..-20369
+on x=-82064..-64666,y=-46973..-21731,z=-18401..914
+on x=-34934..-22279,y=-7742..12099,z=67135..87372
+on x=27465..61467,y=-85472..-65129,z=-4237..22254
+on x=-80381..-62026,y=-16184..12347,z=-2651..17457
+on x=69178..79493,y=16016..31837,z=-30066..-6941
+on x=58377..77863,y=-39777..-24772,z=10071..23002
+on x=48442..63706,y=-38552..-16295,z=26113..45339
+on x=-13335..-4868,y=-22175..3111,z=70940..84632
+on x=-36181..-20184,y=-86761..-55273,z=11813..24214
+on x=-26526..6392,y=-86737..-67545,z=15208..26858
+on x=-41697..-11341,y=-67684..-50768,z=-50023..-34874
+on x=-44283..-29341,y=50069..65137,z=16291..32937
+on x=-13737..13518,y=34160..56368,z=-64104..-55124
+on x=-41467..-20172,y=-56108..-30856,z=48850..71379
+on x=-73727..-60444,y=-37460..-28199,z=-9066..3356
+on x=27344..52074,y=37384..62673,z=-36910..-26850
+on x=-80527..-63118,y=-7819..14033,z=34192..36345
+on x=61051..78708,y=39294..50128,z=-20827..1285
+on x=26726..60698,y=-31747..-14301,z=-68875..-55244
+on x=58293..74218,y=-7217..-58,z=27209..42785
+on x=16798..50670,y=-68005..-44913,z=-49444..-28285
+on x=16748..34592,y=-61174..-55605,z=-66029..-45698
+on x=-9375..15162,y=43634..71201,z=-61026..-57673
+on x=-21922..-8471,y=-35213..-5237,z=-89805..-58705
+on x=40507..50361,y=-75821..-48923,z=-25397..7369
+on x=3497..13168,y=53981..83329,z=-49767..-26576
+on x=-47985..-18318,y=-52177..-38638,z=-62333..-42841
+on x=-71589..-44545,y=-56337..-38196,z=-32354..3050
+on x=-21744..-11127,y=65023..92837,z=-27885..-5719
+on x=-60827..-27158,y=-77388..-56241,z=8423..42905
+on x=-3415..22438,y=-38105..-15993,z=-95955..-76115
+on x=-45323..-34463,y=44561..50643,z=-63999..-42223
+on x=5158..23904,y=-69138..-34597,z=-59221..-40866
+on x=36923..53585,y=44288..61327,z=39198..56116
+on x=-64918..-38968,y=57460..62088,z=8947..30454
+on x=-19472..4315,y=-9881..25534,z=67512..88477
+on x=-19322..-4647,y=51754..78044,z=42004..66218
+on x=-56084..-41038,y=39692..59940,z=-45770..-34070
+on x=-64655..-53379,y=-19603..-7182,z=48172..63856
+on x=-84742..-51480,y=-40279..-27497,z=-36583..-22700
+on x=12650..26785,y=-83255..-59200,z=-41616..-31127
+on x=45345..77224,y=-55551..-34660,z=-30544..-12049
+on x=-74026..-44388,y=35577..55130,z=-45713..-9853
+on x=45201..64504,y=-41118..-15260,z=35803..68395
+on x=-28668..-5925,y=36026..54071,z=-72582..-59110
+on x=-60295..-35526,y=-68018..-61750,z=-7533..26299
+on x=-15839..5573,y=56539..66237,z=-61049..-39765
+on x=-19103..1455,y=17388..40404,z=67480..79225
+on x=68183..75406,y=-8345..21591,z=20697..38662
+on x=-12606..12296,y=-62262..-40916,z=-56920..-47779
+on x=-30210..-19684,y=-58656..-29986,z=-62999..-50022
+on x=-41781..-18933,y=70096..80964,z=930..28257
+on x=58515..81081,y=-19157..-7764,z=-749..22814
+on x=-36468..-7523,y=-4485..16276,z=-82639..-55736
+on x=-17821..5703,y=-43734..-20259,z=60530..86122
+on x=-67070..-58437,y=-15623..-2156,z=-55733..-28589
+on x=57608..75127,y=29614..46316,z=-25665..-10046
+on x=-74636..-52649,y=12192..41942,z=-35745..-17436
+on x=-48575..-33267,y=-51680..-46450,z=33948..66864
+on x=46470..74556,y=-55803..-43731,z=-12813..-4520
+on x=62541..77459,y=-24439..-11764,z=-55106..-35094
+on x=-57792..-45622,y=-53447..-36460,z=-53150..-35681
+on x=44672..65150,y=39838..58343,z=423..27649
+on x=66565..79736,y=-3676..21015,z=14005..38723
+on x=61922..91970,y=8327..10789,z=-20323..2488
+on x=-27586..-10336,y=-61389..-44749,z=-64363..-47539
+on x=-76339..-43595,y=-30824..-14219,z=-71195..-38102
+on x=-2914..28327,y=52279..79154,z=25622..50431
+on x=14592..20229,y=-87387..-61943,z=16315..49757
+on x=-82215..-59175,y=-797..21247,z=6622..27407
+on x=11251..41584,y=-252..20658,z=71136..87064
+on x=9886..32822,y=29548..61741,z=59730..76336
+on x=-7855..14348,y=67583..80902,z=5744..18485
+on x=26112..39316,y=51704..80793,z=11029..30029
+on x=795..28775,y=-34240..-27197,z=-78054..-54474
+on x=56223..75620,y=11250..25211,z=39671..43024
+on x=-87370..-59866,y=10030..29821,z=12702..36824
+on x=56779..87392,y=-1347..28978,z=-49750..-11313
+on x=-54293..-38099,y=-40529..-25148,z=47024..70703
+on x=851..23744,y=-77739..-71188,z=-38949..-11214
+on x=25485..45943,y=31702..39631,z=41474..72200
+on x=-62674..-31219,y=63432..82919,z=2388..17976
+on x=8190..34813,y=-50078..-21869,z=-85521..-51791
+on x=-37169..-28619,y=-82834..-54782,z=6972..33255
+on x=-94037..-61263,y=-25046..-13909,z=-1595..13575
+on x=-48575..-18955,y=-33677..-7346,z=-86145..-60031
+on x=-70103..-45107,y=56430..67948,z=-4521..22032
+on x=-39000..-11704,y=-89826..-66521,z=2050..13409
+on x=-79014..-51289,y=-18428..-7420,z=-40051..-36036
+on x=63968..77897,y=-46827..-24236,z=-17549..-1367
+on x=40284..69939,y=-59306..-37365,z=-33218..-24152
+on x=-5865..6145,y=-45825..-19521,z=54336..77839
+on x=-36677..-2216,y=-18925..10640,z=76012..92808
+on x=34752..51086,y=-46989..-9643,z=45901..76454
+on x=-33588..-15727,y=-11258..9373,z=-96263..-60633
+on x=-73095..-49898,y=25057..49623,z=15417..28776
+on x=4163..24517,y=-20001..-2003,z=-80081..-60804
+on x=-86958..-54386,y=6397..30505,z=-38410..-16437
+on x=-39425..-21522,y=60205..71184,z=-26523..-9906
+on x=-1999..16749,y=-19711..3250,z=-90466..-79089
+on x=52104..70877,y=49853..69350,z=-26043..-5847
+on x=24930..39110,y=62242..79178,z=11719..29720
+on x=-60664..-51784,y=43333..65915,z=601..19359
+on x=-29790..-6353,y=15820..24330,z=60477..88555
+on x=32312..47112,y=-28093..-18926,z=-79625..-46718
+on x=60532..91913,y=-20228..-1888,z=-19805..-11355
+on x=32446..58611,y=47906..68941,z=11821..34225
+on x=-39549..-18048,y=40533..75594,z=46997..70196
+on x=-32503..-25718,y=51256..59295,z=-70760..-49449
+on x=-59217..-29514,y=-74861..-57830,z=-6269..24788
+on x=-80361..-65493,y=428..2713,z=33014..44378
+on x=31542..41702,y=-32423..-22521,z=56883..80195
+on x=9359..34184,y=-76555..-63080,z=11041..40148
+on x=7929..24123,y=50480..66548,z=-64026..-46463
+on x=-43348..-34979,y=-68370..-55559,z=26232..43403
+on x=-4464..10557,y=46962..65148,z=-71132..-61326
+on x=-3771..22814,y=44252..68810,z=45781..60494
+on x=16543..35012,y=13610..25339,z=65440..82579
+on x=50974..66025,y=30398..66352,z=-2272..16038
+on x=46191..53893,y=-38750..-27782,z=-46797..-31742
+on x=59527..88181,y=4389..27568,z=18080..46791
+on x=36489..52121,y=-60282..-37683,z=-33913..-12899
+on x=-60041..-48837,y=53336..56411,z=-12772..19906
+on x=-82656..-78380,y=-23713..7350,z=846..9694
+on x=-69894..-54155,y=20299..50513,z=-12904..4460
+on x=26093..46240,y=-28122..1445,z=-77998..-52871
+on x=-53121..-32900,y=-63457..-34367,z=27620..52825
+on x=-84340..-58234,y=44385..45908,z=-9758..3136
+on x=-5984..19701,y=-46271..-28381,z=-75864..-47509
+on x=56726..68908,y=36981..42831,z=-15306..17015
+on x=-44682..-25301,y=39444..56028,z=25699..54323
+on x=58214..80818,y=9623..41643,z=-16613..-11010
+on x=-82918..-50677,y=22662..39310,z=-16004..6698
+on x=-32905..-27900,y=5414..42444,z=64349..78279
+on x=-70719..-58202,y=-41565..-19928,z=13718..33387
+on x=56598..71196,y=-48262..-39005,z=-402..34641
+on x=74793..78440,y=-26790..-8302,z=3994..33189
+on x=-59924..-37383,y=29231..42923,z=-65456..-35636
+on x=-78704..-48945,y=-23030..-14889,z=41803..50251
+on x=52005..72511,y=-63467..-39781,z=-42303..-19657
+on x=-27872..-10193,y=-15032..84,z=-82481..-77982
+on x=-8502..20386,y=-61440..-50322,z=-60658..-51335
+on x=-62283..-27803,y=-33963..-8484,z=41565..64105
+on x=2033..26056,y=28525..29178,z=57035..90868
+on x=-81809..-66606,y=-33053..-21379,z=14578..30469
+on x=-44610..-15911,y=-69004..-46363,z=-64934..-36016
+on x=-68945..-52936,y=-42125..-28586,z=29486..35239
+on x=-22616..494,y=-93383..-64839,z=-33613..-13156
+on x=53402..81484,y=-45709..-29640,z=16971..27227
+on x=-17329..2689,y=38367..60236,z=-65779..-53760
+on x=544..9988,y=-88763..-77587,z=-17004..12529
+on x=28694..49703,y=69019..79788,z=-28728..1438
+on x=-22376..3335,y=43849..67633,z=40655..65775
+on x=-80423..-61942,y=-18552..16738,z=-16089..-10995
+on x=-5300..17339,y=-75762..-63850,z=-44774..-23776
+on x=-74769..-55813,y=27477..42211,z=-30079..-3179
+on x=-40995..-24004,y=-41765..-23675,z=52719..78465
+on x=53025..66595,y=-3553..22759,z=-53394..-38188
+on x=-45876..-36194,y=55838..79908,z=2550..25102
+on x=-63485..-52881,y=18021..42286,z=27309..46403
+on x=-48779..-39049,y=-58743..-33299,z=35080..60133
+on x=-31467..4569,y=-61369..-32859,z=-85202..-59337
+off x=21993..32253,y=48441..65406,z=-47996..-40073
+off x=-35198..-22285,y=69010..86520,z=-9592..7187
+on x=-64097..-37019,y=13152..21867,z=61006..76336
+off x=-22742..-5033,y=-56240..-40408,z=48511..65431
+on x=-36566..-5811,y=-16313..2085,z=-93612..-64069
+off x=61089..77983,y=-41277..-14061,z=-50208..-34100
+off x=-68065..-53648,y=23725..27195,z=31676..42758
+off x=21031..52474,y=-74280..-49485,z=-47275..-27138
+off x=-93645..-53928,y=12384..44405,z=-27207..-41
+on x=-4055..5189,y=-40337..-32543,z=-81591..-55238
+on x=-34530..-11306,y=-22986..10495,z=-82396..-61102
+on x=-31250..-14900,y=-30548..-18642,z=52820..73833
+on x=34978..60410,y=28155..49790,z=39140..72681
+off x=-6448..19399,y=5391..27886,z=-91414..-59741
+off x=-75827..-60684,y=-46368..-41254,z=-15781..397
+on x=-57977..-22796,y=-76925..-41529,z=18880..52786
+off x=-83983..-60140,y=-44019..-12351,z=-14305..4593
+off x=-49298..-44993,y=4614..27922,z=-70305..-59112
+off x=-62329..-61994,y=-7625..18261,z=-69368..-38425
+on x=67823..80427,y=5390..27375,z=-5980..8640
+on x=-73645..-61230,y=-44444..-19430,z=-17891..-2980
+off x=-64208..-46311,y=-63901..-30902,z=23938..57840
+on x=32048..60913,y=-7824..11109,z=-78997..-55347
+on x=-61365..-36248,y=-74363..-55469,z=-7759..11367
+off x=42202..64640,y=35785..61939,z=6015..23732
+off x=5488..28392,y=57003..93250,z=-1191..12909
+off x=67515..82974,y=-39921..-21713,z=-18901..19539
+on x=-96694..-76643,y=-1592..33662,z=7429..21816
+on x=-52157..-33815,y=53007..73829,z=8064..26216
+on x=75229..85614,y=-599..18554,z=7659..19227
+on x=28376..57292,y=-72617..-48528,z=-22618..-19371
+off x=-59398..-44521,y=-29031..-15883,z=-70674..-34037
+on x=55293..83437,y=2780..19016,z=-41097..-20096
+on x=-14860..4603,y=56936..77754,z=18511..39251
+off x=52997..63549,y=-37151..-14473,z=-58163..-32431
+on x=-23500..2396,y=-26375..-132,z=-93218..-65307
+off x=69361..93524,y=-24773..-5007,z=-8425..3017
+on x=58814..85297,y=-47032..-35846,z=-13872..16641
+off x=-90866..-64554,y=-27446..-12033,z=-6160..23746
+off x=-3033..13343,y=-85265..-63549,z=-32550..-16157
+off x=-1789..15572,y=-40747..-20883,z=60589..75014
+on x=-9804..23598,y=-64924..-59519,z=35818..48512
+on x=-38448..-2399,y=-13227..-7752,z=-85365..-63035
+on x=28680..44639,y=-8409..2978,z=-80875..-61970
+off x=3813..25722,y=49510..58204,z=45835..68471
+on x=63257..90085,y=-7449..19104,z=-25..23109
+on x=81..38276,y=44760..68292,z=-80214..-43996
+on x=-8169..20844,y=17766..36865,z=-81104..-59358
+off x=-79202..-62792,y=-26615..-9801,z=-4233..9695
+off x=16101..39646,y=-93382..-62245,z=8333..24397
+on x=-34695..-24663,y=61543..78424,z=-50217..-29226
+off x=-92579..-74463,y=-17185..2660,z=-27311..-9170
+off x=58152..76439,y=-33703..-22233,z=-8339..20525
+on x=-34466..-2282,y=-59486..-37139,z=54046..71619
+off x=-81089..-74394,y=13555..29830,z=10991..21447
+off x=-47693..-41300,y=-66511..-57519,z=-15746..2821
+off x=-86020..-71840,y=-28708..-19562,z=-31911..-8481
+off x=53433..76347,y=17199..50613,z=17411..41638
+off x=64984..70249,y=16701..43046,z=27880..52439
+on x=-25413..-5189,y=-70745..-53828,z=-45390..-30486
+off x=-34986..-20787,y=16693..54533,z=-68201..-66989
+off x=-22407..10815,y=-56235..-28903,z=66827..82035
+off x=-7229..24987,y=-74889..-70150,z=-42634..-10717
+on x=61850..74170,y=-3025..17055,z=-51696..-31704
+on x=-10078..11184,y=49432..67395,z=41346..45818
+off x=-44780..-29593,y=-37456..-16661,z=-86554..-51942
+off x=24959..39704,y=47845..59502,z=41279..53062
+off x=50387..84028,y=-14697..3304,z=31116..52595
+on x=7987..30004,y=-74741..-53596,z=-65460..-47213
+on x=-75044..-57110,y=47945..68090,z=8399..24536
+on x=26605..43266,y=-76631..-58644,z=-16557..13316
+on x=-18526..-445,y=29437..47879,z=-78656..-62931
+off x=47346..50550,y=7714..28258,z=-68990..-43642
+off x=5010..26119,y=-70819..-52223,z=43562..46965
+off x=40922..70019,y=13891..28648,z=38562..60313
+on x=-68851..-46794,y=15843..29283,z=26538..63304
+off x=-10070..19847,y=-42799..-16564,z=-89201..-61852
+on x=-94..26044,y=35850..59332,z=43166..74939
+on x=72857..82846,y=11676..31044,z=-7337..21481
+on x=-86891..-74618,y=8041..15909,z=-22524..7319
+off x=-6531..4581,y=55498..74729,z=17054..43380
+on x=43147..61852,y=-52092..-34293,z=-53407..-33277
+on x=42898..63895,y=38414..67321,z=36757..53643
+off x=-48094..-21082,y=-2904..16322,z=61588..93757
+off x=28145..50157,y=-49071..-30119,z=38908..63084
+off x=-42556..-25827,y=39054..63949,z=-69190..-50949
+on x=-51347..-32594,y=-67175..-45834,z=-49233..-33986
+on x=29820..43610,y=17692..42346,z=-69108..-46540
+on x=42237..51469,y=35615..63053,z=-52330..-42423
+on x=25808..53353,y=-24891..11597,z=-66644..-58186
+off x=5152..13607,y=-59351..-32970,z=57736..79356
+on x=-51521..-42645,y=16464..44515,z=47395..58429
+on x=57992..75886,y=-8447..21320,z=40625..59285
+on x=-22302..1936,y=26947..43631,z=65888..82038
+off x=-22444..-704,y=72602..90007,z=16263..38491
+off x=-35368..-16154,y=62065..85297,z=-10017..15270
+off x=75796..95425,y=-23028..9545,z=-10474..14719
+off x=-62881..-43507,y=28005..45544,z=-51730..-23001
+off x=-34342..-20555,y=18279..36660,z=-74104..-50052
+off x=-73479..-64663,y=-22317..-13353,z=-39912..-29567
+on x=1494..5125,y=66357..70787,z=-43240..-26843
+off x=-71559..-51960,y=37215..40836,z=11752..30396
+off x=68685..71294,y=-27543..-8806,z=17367..42352
+off x=-93924..-67132,y=-25823..11182,z=5431..33711
+off x=35564..65276,y=-23013..-7997,z=-72588..-54025
+on x=-90262..-68890,y=25897..51932,z=-5182..677
+on x=-2613..18067,y=-7780..25272,z=64835..97062
+off x=-71949..-47713,y=5377..23957,z=-51697..-33553
+on x=13021..38912,y=-80820..-56879,z=-43587..-19587
+on x=-84708..-48507,y=24611..53624,z=9478..25637
+off x=51153..63433,y=47603..59113,z=7910..20497
+off x=-34614..-13873,y=58451..70828,z=16703..47588
+on x=-15592..1816,y=-94634..-68699,z=-17343..4032
+off x=8693..17027,y=-85083..-57180,z=-32433..-22117
+on x=-71073..-48520,y=-61171..-56263,z=-8077..24429
+on x=18761..33445,y=-34161..-11912,z=-76487..-63493
+off x=-71183..-51320,y=-33705..-9711,z=-50743..-31159
+on x=21266..39612,y=-84552..-62206,z=-40513..-20917
+on x=-22410..285,y=17900..46706,z=72043..75407
+on x=17565..45107,y=55640..70614,z=-52893..-42440
+on x=4350..22563,y=-83182..-67900,z=15567..20770
+off x=23504..44371,y=-77148..-52414,z=-2767..2514
+off x=-59728..-48637,y=-43662..-15334,z=34025..65733
+on x=-4606..11234,y=60774..91167,z=-23118..-6966
+on x=59274..84616,y=5061..23662,z=-28929..-14210
+on x=-3514..9286,y=18826..27197,z=73597..85060
+off x=-73563..-52052,y=-1483..5727,z=42293..55936
+off x=-26925..-11613,y=44345..64963,z=-66419..-30161
+on x=-22891..-2780,y=-42061..-14656,z=-80953..-64258
+on x=13194..48131,y=-77347..-61475,z=13899..29867
+on x=21814..32657,y=-52867..-42563,z=-64833..-38328
+on x=50121..77992,y=-18402..12993,z=34458..53263
+on x=-5816..9664,y=-61030..-51780,z=-57924..-42385
+off x=-24547..-5855,y=42851..55379,z=-66831..-45917
+on x=-79253..-62961,y=-35210..-14357,z=-1851..14458
+off x=-45457..-34564,y=-1909..19181,z=-88225..-49236
+on x=-73093..-48713,y=-51280..-28270,z=-58417..-26764
+on x=28972..54932,y=32695..46221,z=-61346..-44126
+off x=-72001..-63001,y=21943..37488,z=-48733..-22731
+on x=-53378..-16455,y=38563..66217,z=-54458..-49292
+on x=-50481..-38389,y=33272..59345,z=-48408..-25772
+on x=-15684..16104,y=-3749..26449,z=-92691..-65542
+on x=-48257..-34591,y=42080..76060,z=31710..47665
+on x=-68085..-39645,y=42059..66145,z=-16754..12973
+on x=16863..38701,y=-73014..-55734,z=-49006..-30858
+on x=-47835..-12762,y=19470..24912,z=-72515..-52345
+off x=76693..90007,y=-22735..10009,z=1595..23810
+on x=-33312..2270,y=27162..58916,z=54379..77016
+off x=-37166..-19572,y=3437..29618,z=65395..82988
+on x=-69021..-40344,y=51504..67404,z=1562..19152
+off x=44270..65868,y=-20558..-1138,z=-69620..-46023
+on x=-25132..-893,y=43048..69830,z=33541..61843
+off x=-26336..-11905,y=-76697..-44759,z=37333..48386
+off x=-51573..-26363,y=51024..85220,z=17703..29898
+on x=6972..29846,y=40862..57749,z=53546..67014
+off x=-82587..-61588,y=30156..55947,z=-23441..-14242
+on x=53623..67812,y=-5042..4972,z=41771..66174
+off x=-20249..-1391,y=56910..79807,z=-54443..-40975
+on x=9661..39445,y=60898..86084,z=12021..22727
+on x=-5594..19977,y=-15658..-11820,z=63980..86826
+off x=51879..80957,y=-55766..-34337,z=-21867..1368
+off x=-9663..250,y=-31246..-21672,z=58525..87914
+on x=-49707..-41630,y=6704..24869,z=-65152..-43466
+on x=58344..69560,y=-12016..-131,z=29623..59642
+on x=-60068..-39875,y=49188..71862,z=-23840..6463
+on x=-72100..-54955,y=-36846..-26054,z=1190..18416
+on x=21115..33940,y=-89414..-56975,z=-25177..-1394
+off x=-69120..-43376,y=29560..39845,z=-46691..-27177
+on x=-29488..-8760,y=49023..71514,z=-48639..-35316
+off x=-237..19564,y=-51062..-32851,z=53532..84174
+off x=29377..42498,y=-87897..-54866,z=-1260..2339
+on x=-53421..-21867,y=54307..61870,z=22283..40589
+off x=30204..36157,y=-34923..-22939,z=58831..75622
+off x=45990..75451,y=40254..65804,z=-27928..-11460
+off x=-5053..9582,y=-56383..-35127,z=-67131..-57546
+on x=31129..54902,y=-1102..-114,z=65939..73127
+on x=-47621..-24798,y=-35621..-2323,z=61417..82385
+on x=-69723..-64530,y=22399..28572,z=-47850..-23758
+off x=-31316..-13914,y=22835..29818,z=69274..85492
+on x=-32403..-9823,y=-34119..-12164,z=66082..76097
+on x=-79078..-44568,y=39157..61837,z=19345..34957
+off x=30839..37226,y=-67241..-42234,z=-54829..-34916
+on x=63646..75622,y=12404..45966,z=-20861..4171
+off x=28471..57448,y=-68089..-47516,z=-33516..2
+on x=62495..87569,y=6106..27023,z=-45194..-17767
+off x=-38770..-31582,y=-87012..-57465,z=-28392..-2961
+on x=16627..29254,y=35706..48023,z=-71576..-43430
+off x=6249..33814,y=24230..54794,z=58085..82036
+off x=-27246..8755,y=4459..30303,z=-93666..-72766
+on x=58284..74924,y=-16099..10160,z=34646..54595
+off x=-63748..-51168,y=-13811..12314,z=49634..76027
+on x=22610..60232,y=-45531..-24668,z=48785..62445
+off x=26226..50900,y=-80496..-61749,z=383..32992
+off x=-772..26897,y=7961..26898,z=-80721..-73028
+off x=-55010..-50585,y=-36460..-23884,z=52171..64350
+on x=-76278..-56858,y=31576..38443,z=-32320..1565
+off x=-41500..-10670,y=-261..13422,z=-82902..-66496
+on x=19358..34516,y=309..16749,z=65757..78408
+off x=-57721..-25243,y=44303..64574,z=18464..39920
+on x=26428..31600,y=69169..79816,z=2105..40395
diff --git a/aoc2021/input/test21.in b/aoc2021/input/test21.in
new file mode 100644
index 0000000..3f69194
--- /dev/null
+++ b/aoc2021/input/test21.in
@@ -0,0 +1,2 @@
+Player 1 starting position: 4
+Player 2 starting position: 8
diff --git a/aoc2021/input/test22.in b/aoc2021/input/test22.in
new file mode 100644
index 0000000..e665295
--- /dev/null
+++ b/aoc2021/input/test22.in
@@ -0,0 +1,22 @@
+on x=-20..26,y=-36..17,z=-47..7
+on x=-20..33,y=-21..23,z=-26..28
+on x=-22..28,y=-29..23,z=-38..16
+on x=-46..7,y=-6..46,z=-50..-1
+on x=-49..1,y=-3..46,z=-24..28
+on x=2..47,y=-22..22,z=-23..27
+on x=-27..23,y=-28..26,z=-21..29
+on x=-39..5,y=-6..47,z=-3..44
+on x=-30..21,y=-8..43,z=-13..34
+on x=-22..26,y=-27..20,z=-29..19
+off x=-48..-32,y=26..41,z=-47..-37
+on x=-12..35,y=6..50,z=-50..-2
+off x=-48..-32,y=-32..-16,z=-15..-5
+on x=-18..26,y=-33..15,z=-7..46
+off x=-40..-22,y=-38..-28,z=23..41
+on x=-16..35,y=-41..10,z=-47..6
+off x=-32..-23,y=11..30,z=-14..3
+on x=-49..-5,y=-3..45,z=-29..18
+off x=18..30,y=-20..-8,z=-3..13
+on x=-41..9,y=-7..43,z=-33..15
+on x=-54112..-39298,y=-85059..-49293,z=-27449..7877
+on x=967..23432,y=45373..81175,z=27513..53682