about summary refs log blame commit diff
path: root/aoc2021/Day17.cs
blob: 225d1a483fc34b80b50ca8199906d2b10adf2f71 (plain) (tree)
1
2
3
4
5
6
7
8
9







                                                              
 
















                                                                                               


























                                                                                                         
namespace aoc2021;

/// <summary>
/// Day 17: <see href="https://adventofcode.com/2021/day/17"/>
/// </summary>
public sealed class Day17 : Day
{
    private readonly List<int> _target;

    public Day17() : base(17, "Trick Shot")
    {
        _target = Input.First()
            .Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)
            .Skip(2)
            .SelectMany(i => i.Split('=')[1].Split(".."))
            .Select(i => i.TrimEnd(','))
            .Select(int.Parse)
            .ToList();
    }

    public override object Part1()
    {
        var initialYVelocity = Math.Abs(_target[2]) - 1;
        return (initialYVelocity + 1) * initialYVelocity / 2;
    }

    public override object Part2()
    {
        var successfulVelocities = new HashSet<(int x, int y)>();
        var xMin = 1;
        while (xMin * (xMin + 1) / 2 < _target[0]) xMin++;

        for (var x = xMin; x <= _target[1]; x++)
        for (var y = _target[2]; y < Math.Abs(_target[2]); y++)
        {
            int xVelocity = x, yVelocity = y, xPos = 0, yPos = 0;

            while (xPos <= _target[1] && yPos >= _target[2])
            {
                xPos += xVelocity;
                yPos += yVelocity;

                if (xPos >= _target[0] && xPos <= _target[1] && yPos >= _target[2] && yPos <= _target[3])
                    successfulVelocities.Add((x, y));

                xVelocity = xVelocity == 0 ? 0 : xVelocity - 1;
                yVelocity--;
            }
        }

        return successfulVelocities.Count;
    }
}