diff --git a/.gitignore b/.gitignore
index ea8c4bf..9f08bcb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,5 @@
/target
+/.vs/
+*.user
+/bin/
+/obj/
diff --git a/advent-of-code-2021.csproj b/advent-of-code-2021.csproj
new file mode 100644
index 0000000..6284423
--- /dev/null
+++ b/advent-of-code-2021.csproj
@@ -0,0 +1,29 @@
+
+
+
+ Exe
+ net6.0
+ aoc2021
+ enable
+ enable
+ False
+ True
+
+
+
+ 5
+ True
+
+
+
+ 5
+ True
+
+
+
+
+ PreserveNewest
+
+
+
+
diff --git a/advent-of-code-2021.sln b/advent-of-code-2021.sln
new file mode 100644
index 0000000..c717677
--- /dev/null
+++ b/advent-of-code-2021.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31903.59
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "advent-of-code-2021", "advent-of-code-2021.csproj", "{1B54D933-507B-4F44-9BE3-F1794B593AF7}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {1B54D933-507B-4F44-9BE3-F1794B593AF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1B54D933-507B-4F44-9BE3-F1794B593AF7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1B54D933-507B-4F44-9BE3-F1794B593AF7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1B54D933-507B-4F44-9BE3-F1794B593AF7}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {17D280F0-AD9F-481E-8687-28AAB4A54437}
+ EndGlobalSection
+EndGlobal
diff --git a/inputs/02.txt b/inputs/02.txt
new file mode 100644
index 0000000..36084d3
--- /dev/null
+++ b/inputs/02.txt
@@ -0,0 +1,1000 @@
+forward 9
+down 9
+up 4
+down 5
+down 6
+up 6
+down 7
+down 1
+forward 6
+down 4
+forward 8
+up 5
+forward 9
+down 1
+down 4
+up 4
+up 5
+up 4
+down 1
+forward 8
+down 1
+forward 2
+forward 8
+down 9
+forward 2
+down 6
+down 2
+up 8
+down 6
+forward 9
+forward 7
+down 6
+forward 3
+down 2
+forward 4
+down 5
+up 2
+down 9
+down 8
+up 5
+forward 5
+forward 4
+up 9
+forward 9
+down 8
+forward 8
+forward 2
+up 8
+down 7
+forward 8
+down 3
+forward 6
+up 9
+forward 9
+forward 4
+forward 9
+forward 6
+down 4
+up 2
+forward 4
+up 5
+up 6
+forward 9
+down 3
+forward 4
+forward 9
+down 1
+forward 1
+up 6
+up 4
+forward 7
+up 7
+up 3
+forward 2
+forward 8
+forward 6
+down 4
+forward 2
+forward 3
+down 7
+down 5
+down 8
+down 5
+forward 1
+down 8
+down 2
+down 8
+down 3
+forward 4
+forward 8
+forward 9
+down 1
+forward 8
+down 1
+down 6
+down 7
+down 7
+forward 5
+forward 3
+down 2
+down 1
+forward 2
+forward 1
+down 6
+down 4
+up 5
+up 9
+down 4
+forward 9
+down 2
+down 5
+down 4
+down 2
+forward 2
+forward 4
+forward 6
+forward 6
+forward 3
+down 6
+up 5
+forward 8
+forward 3
+down 9
+down 3
+forward 4
+forward 2
+down 9
+down 8
+down 7
+down 3
+forward 2
+down 7
+down 3
+down 5
+forward 6
+up 9
+up 8
+forward 5
+down 6
+down 1
+down 6
+down 5
+forward 7
+down 2
+forward 8
+forward 7
+forward 2
+forward 8
+up 6
+forward 5
+down 2
+down 5
+up 8
+up 6
+forward 1
+down 4
+up 5
+up 5
+up 5
+forward 4
+up 1
+forward 3
+down 9
+down 6
+up 1
+forward 1
+forward 2
+forward 1
+forward 4
+forward 6
+forward 6
+up 7
+down 7
+down 7
+down 9
+forward 9
+down 1
+down 5
+down 1
+down 7
+down 1
+up 6
+forward 2
+down 4
+up 3
+up 2
+forward 6
+up 4
+down 1
+down 5
+forward 9
+up 4
+up 3
+forward 3
+up 7
+forward 2
+forward 5
+down 9
+forward 7
+forward 4
+down 1
+up 2
+forward 4
+up 4
+down 2
+forward 4
+up 5
+up 1
+down 9
+down 3
+up 6
+forward 7
+up 7
+forward 2
+down 4
+up 3
+up 3
+forward 4
+up 5
+down 3
+up 8
+forward 6
+forward 8
+down 1
+down 9
+down 7
+forward 7
+forward 5
+forward 2
+up 9
+forward 3
+forward 1
+down 7
+down 6
+forward 5
+up 3
+forward 6
+down 4
+forward 9
+down 7
+forward 9
+down 9
+down 5
+down 6
+down 2
+down 2
+down 8
+down 3
+down 9
+forward 5
+up 6
+forward 1
+down 3
+down 2
+up 1
+up 6
+forward 3
+down 6
+down 6
+up 9
+up 8
+forward 2
+down 7
+forward 5
+up 9
+down 7
+down 3
+forward 2
+forward 2
+up 9
+forward 1
+forward 7
+down 9
+forward 6
+forward 7
+up 8
+down 7
+down 5
+down 3
+up 6
+down 5
+forward 6
+down 9
+down 6
+up 9
+down 7
+forward 2
+down 5
+up 4
+down 4
+down 8
+forward 7
+down 9
+forward 8
+forward 6
+down 7
+down 1
+forward 5
+up 6
+forward 4
+up 7
+up 4
+up 5
+forward 9
+forward 5
+forward 4
+down 6
+down 5
+forward 2
+forward 7
+down 8
+forward 3
+up 5
+down 2
+up 3
+forward 4
+up 5
+up 2
+forward 4
+forward 1
+forward 1
+forward 4
+forward 4
+down 2
+forward 1
+forward 1
+up 5
+up 7
+down 8
+down 4
+forward 2
+forward 2
+down 3
+forward 7
+down 8
+up 3
+forward 2
+down 2
+forward 3
+up 2
+forward 3
+up 6
+down 7
+up 7
+down 3
+up 9
+forward 3
+forward 7
+down 7
+up 9
+down 6
+down 2
+forward 8
+forward 8
+up 7
+down 6
+forward 2
+forward 1
+down 4
+up 2
+forward 6
+up 7
+down 5
+up 1
+forward 3
+forward 9
+up 4
+forward 5
+forward 8
+down 3
+up 5
+forward 9
+down 6
+up 9
+forward 5
+down 4
+down 1
+down 6
+up 9
+up 2
+forward 5
+down 1
+up 3
+down 5
+forward 2
+down 4
+forward 5
+down 6
+down 4
+down 4
+forward 1
+down 7
+down 2
+forward 4
+forward 5
+up 9
+down 6
+down 2
+forward 7
+up 8
+down 9
+forward 7
+down 5
+down 2
+down 8
+down 8
+up 4
+up 3
+down 3
+down 7
+forward 4
+forward 6
+down 4
+up 7
+forward 4
+forward 4
+forward 1
+down 3
+down 2
+forward 7
+forward 2
+up 9
+down 7
+up 7
+forward 2
+forward 6
+forward 9
+down 3
+forward 7
+forward 5
+up 5
+up 1
+forward 6
+forward 4
+down 2
+forward 3
+forward 9
+down 1
+forward 6
+forward 7
+forward 1
+up 7
+up 4
+forward 7
+forward 8
+down 7
+down 8
+down 9
+forward 7
+down 9
+up 6
+down 7
+up 3
+down 7
+forward 4
+forward 9
+forward 1
+down 4
+forward 1
+up 4
+up 4
+forward 9
+forward 8
+up 4
+down 2
+forward 4
+forward 2
+forward 8
+down 2
+up 6
+down 4
+forward 6
+forward 5
+down 2
+forward 9
+down 5
+forward 5
+down 3
+down 2
+up 9
+down 3
+forward 6
+forward 6
+up 9
+down 1
+forward 4
+up 3
+forward 1
+forward 3
+forward 3
+down 6
+down 2
+forward 8
+down 4
+forward 8
+forward 8
+forward 5
+up 6
+forward 3
+down 1
+down 8
+forward 3
+forward 4
+down 2
+down 7
+up 8
+forward 3
+forward 8
+up 2
+forward 6
+down 4
+forward 9
+forward 5
+down 1
+forward 6
+forward 2
+down 3
+up 4
+down 7
+down 2
+up 2
+forward 7
+down 6
+down 2
+up 5
+up 5
+down 9
+down 7
+down 3
+down 1
+down 9
+forward 4
+down 4
+forward 7
+forward 8
+forward 4
+up 6
+forward 6
+forward 9
+down 2
+forward 4
+down 8
+down 4
+forward 5
+forward 2
+up 4
+down 3
+up 8
+up 1
+down 1
+forward 9
+up 3
+up 1
+forward 1
+forward 7
+forward 1
+down 7
+forward 7
+forward 7
+down 7
+forward 4
+up 6
+forward 3
+down 1
+up 1
+up 8
+forward 5
+forward 2
+up 4
+forward 7
+down 2
+down 3
+down 8
+up 7
+up 5
+forward 8
+down 5
+down 3
+down 9
+forward 6
+forward 4
+down 9
+up 5
+forward 3
+up 7
+up 9
+up 1
+forward 1
+forward 3
+forward 1
+up 8
+up 4
+down 1
+down 8
+down 3
+down 1
+down 1
+down 9
+forward 4
+down 3
+forward 9
+forward 2
+down 1
+forward 9
+up 7
+forward 6
+up 4
+forward 8
+forward 3
+down 2
+down 2
+down 2
+up 5
+forward 1
+up 1
+forward 7
+down 1
+forward 1
+down 8
+up 4
+up 1
+forward 7
+down 8
+down 9
+forward 2
+forward 1
+up 3
+forward 4
+up 8
+forward 5
+down 2
+forward 6
+forward 8
+up 9
+forward 2
+down 7
+down 4
+up 3
+forward 1
+forward 6
+forward 9
+down 1
+down 8
+down 1
+down 2
+forward 3
+forward 9
+forward 2
+forward 4
+forward 7
+forward 3
+up 8
+up 9
+forward 3
+forward 6
+down 5
+up 6
+down 8
+forward 5
+up 4
+up 9
+forward 6
+forward 3
+up 9
+forward 8
+forward 5
+forward 9
+forward 7
+up 6
+forward 3
+forward 1
+up 4
+forward 9
+forward 8
+up 1
+up 2
+down 3
+down 4
+down 9
+down 4
+down 5
+down 6
+down 2
+down 5
+forward 6
+forward 4
+up 2
+up 7
+down 5
+down 9
+forward 3
+down 5
+forward 6
+down 7
+forward 1
+forward 7
+forward 9
+forward 7
+forward 4
+forward 4
+up 1
+up 4
+down 6
+up 2
+up 1
+down 4
+forward 2
+down 4
+forward 6
+down 3
+up 6
+down 2
+up 3
+forward 1
+forward 9
+forward 3
+up 9
+forward 7
+forward 5
+forward 4
+down 5
+down 9
+forward 6
+forward 7
+up 1
+forward 7
+forward 2
+forward 2
+forward 5
+forward 6
+down 3
+down 7
+down 3
+down 4
+down 6
+down 1
+forward 2
+down 8
+forward 4
+forward 7
+up 1
+down 4
+down 1
+down 2
+down 3
+up 3
+forward 9
+forward 2
+down 8
+up 3
+forward 8
+forward 7
+up 8
+down 8
+forward 2
+down 9
+down 9
+down 5
+forward 1
+forward 3
+forward 6
+up 1
+up 2
+forward 1
+down 3
+up 6
+forward 2
+forward 8
+forward 2
+down 3
+forward 8
+forward 9
+down 7
+down 3
+down 2
+down 9
+down 3
+up 6
+forward 9
+forward 5
+forward 1
+forward 9
+down 9
+up 2
+down 1
+up 6
+forward 6
+down 3
+forward 6
+forward 3
+forward 5
+forward 4
+up 2
+up 4
+up 6
+forward 1
+forward 6
+up 6
+up 4
+up 7
+down 8
+down 5
+up 1
+up 1
+down 5
+forward 5
+down 9
+forward 8
+down 3
+up 4
+down 9
+down 1
+forward 2
+forward 9
+down 3
+down 8
+down 5
+down 6
+forward 7
+forward 1
+down 9
+down 7
+forward 8
+forward 2
+up 1
+up 1
+forward 7
+up 1
+forward 2
+down 9
+up 4
+forward 5
+down 1
+up 1
+down 8
+down 3
+up 1
+down 8
+down 7
+down 2
+forward 9
+down 5
+forward 2
+up 2
+up 6
+up 4
+forward 6
+up 5
+forward 5
+forward 4
+forward 8
+down 8
+down 6
+down 1
+down 3
+down 6
+forward 8
+up 1
+up 5
+down 4
+forward 4
+down 9
+forward 4
+up 6
+down 7
+forward 4
+down 3
+down 4
+forward 1
+forward 3
+down 1
+down 7
+up 8
+down 3
+down 4
+down 3
+forward 3
+down 8
+forward 8
+down 3
+down 7
+forward 2
+up 2
+forward 7
+down 9
+up 7
+forward 5
+down 2
+down 5
+up 4
+up 8
+forward 8
+forward 9
+forward 8
+down 8
+forward 6
+forward 9
+forward 6
+forward 8
+forward 6
+forward 8
+forward 2
+down 7
+down 3
+forward 7
+down 4
+down 5
+up 1
+forward 5
+down 3
+down 7
+up 4
+forward 9
+down 2
+down 3
+forward 1
+up 6
+down 1
+down 9
+forward 8
+forward 9
+forward 2
+down 6
+down 4
+up 3
+up 8
+forward 1
+down 3
+up 8
+up 7
+down 4
+up 3
+down 7
+down 2
+down 5
+down 7
+down 2
+forward 2
+down 3
+up 2
+forward 8
+up 1
+forward 2
+up 4
+forward 1
+forward 8
+forward 6
+forward 2
+down 2
+forward 5
+up 4
+down 9
+down 7
+forward 2
+down 9
+down 9
+forward 6
+down 8
+down 4
+down 7
+down 9
+forward 7
+forward 7
+up 6
+forward 3
+forward 5
+forward 6
+down 8
+up 1
+forward 2
+up 4
+up 2
+down 8
+down 9
+down 1
+down 3
+forward 7
+forward 5
+forward 6
+up 6
+down 7
+up 8
+up 1
+forward 8
+down 5
+up 1
+down 2
+down 5
+forward 6
+down 4
+forward 5
+down 4
+forward 3
+down 5
+up 4
+up 7
+forward 2
+up 2
+down 8
+forward 6
\ No newline at end of file
diff --git a/src/02.cs b/src/02.cs
new file mode 100644
index 0000000..65ef9b4
--- /dev/null
+++ b/src/02.cs
@@ -0,0 +1,91 @@
+namespace aoc2021
+{
+ internal class Day02
+ {
+ internal static void Go()
+ {
+ var lines = File.ReadAllLines("inputs/02.txt");
+ var instructions = new List();
+ foreach (var instruction in lines)
+ {
+ var fmt = instruction.Split(' ');
+ instructions.Add(new Instruction()
+ {
+ Direction = fmt[0],
+ Amount = Convert.ToInt64(fmt[1]),
+ });
+ }
+
+ Part1(instructions);
+ Part2(instructions);
+ }
+
+ struct Instruction
+ {
+ public string Direction;
+ public long Amount;
+ }
+
+ struct Position
+ {
+ public long h;
+ public long d;
+ }
+
+ private static void Part1(IEnumerable instructions)
+ {
+ Position pos = new();
+ using (var t = new Timer())
+ {
+ foreach (var instruction in instructions)
+ {
+ switch (instruction.Direction)
+ {
+ case "forward":
+ pos.h += instruction.Amount;
+ break;
+
+ case "down":
+ pos.d += instruction.Amount;
+ break;
+
+ case "up":
+ pos.d -= instruction.Amount;
+ break;
+ }
+ }
+ }
+
+ Logger.Log($"part1: h: {pos.h}, d: {pos.d}, result: {pos.h * pos.d}");
+ }
+
+ private static void Part2(IEnumerable instructions)
+ {
+ Position pos = new();
+ using (var t = new Timer())
+ {
+ long aim = 0;
+ foreach (var instruction in instructions)
+ {
+ switch (instruction.Direction)
+ {
+ case "forward":
+ pos.h += instruction.Amount;
+ pos.d += aim * instruction.Amount;
+ break;
+
+ case "down":
+ aim += instruction.Amount;
+ break;
+
+ case "up":
+ aim -= instruction.Amount;
+ break;
+ }
+ }
+ }
+
+ Logger.Log($"part2: h: {pos.h}, d: {pos.d}, result: {pos.h * pos.d}");
+ }
+ }
+}
diff --git a/src/Logger.cs b/src/Logger.cs
new file mode 100644
index 0000000..61e1a5c
--- /dev/null
+++ b/src/Logger.cs
@@ -0,0 +1,13 @@
+using System.Diagnostics;
+
+namespace aoc2021
+{
+ internal class Logger
+ {
+ public static void Log(string msg)
+ {
+ Console.WriteLine(msg);
+ Debug.WriteLine(msg);
+ }
+ }
+}
diff --git a/src/Timer.cs b/src/Timer.cs
new file mode 100644
index 0000000..f2e0c7b
--- /dev/null
+++ b/src/Timer.cs
@@ -0,0 +1,47 @@
+using System.Diagnostics;
+
+namespace aoc2021
+{
+ internal class Timer : IDisposable
+ {
+ private readonly Stopwatch stopwatch = Stopwatch.StartNew();
+ public void Dispose()
+ {
+ stopwatch.Stop();
+ var (elapsed, unit) = ConvertElapsedToHumanReadable();
+ Logger.Log($"Took {elapsed:N1}{unit}");
+ }
+
+ public (double elapsed, string unit) ConvertElapsedToHumanReadable()
+ {
+ return ConvertElapsedToHumanReadable(stopwatch.ElapsedTicks, Stopwatch.Frequency);
+ }
+
+ public static (double elapsed, string unit) ConvertElapsedToHumanReadable(double ticks, long frequency)
+ {
+ var elapsed = 1.0d * ticks / frequency;
+ var unit = "s";
+ if (elapsed < 0.001)
+ {
+ elapsed *= 1e+6;
+ unit = "us";
+ }
+ else if (elapsed < 1)
+ {
+ elapsed *= 1000;
+ unit = "ms";
+ }
+ else if (elapsed < 60)
+ {
+ unit = "s";
+ }
+ else if (elapsed < 60 * 60)
+ {
+ elapsed /= 60;
+ unit = "m";
+ }
+
+ return (elapsed, unit);
+ }
+ }
+}
diff --git a/src/main.cs b/src/main.cs
new file mode 100644
index 0000000..d5f1973
--- /dev/null
+++ b/src/main.cs
@@ -0,0 +1 @@
+aoc2021.Day02.Go();