var response = await new HttpClient().GetStringAsync("https://tompafireadventofcode.free.beeceptor.com/day2");
var instructions = response.Split(Environment.NewLine).Select(line => {
var actionAndValue = line.Split(" ");
return new { action = actionAndValue.First(), val = int.Parse(actionAndValue.Last()) };
var steps = instructions.Select<dynamic, Func<Position, Position>>(instr => {
return instr.action switch
"forward" => (pos) => pos with { Horizontal = pos.Horizontal + instr.val },
"up" => (pos) => pos with { Vertical = pos.Vertical - instr.val },
"down" => (pos) => pos with { Vertical = pos.Vertical + instr.val },
var position = new Position(0, 0);
steps.ForEach(step => position = step(position));
Console.WriteLine($"{position.Horizontal}, {position.Vertical}");
Console.WriteLine(position.Horizontal * position.Vertical);
var steps2 = instructions.Select<dynamic, Func<Position, Position>>(instr => {
return instr.action switch
"forward" => (pos) => pos with { Horizontal = pos.Horizontal + instr.val, Vertical = pos.Vertical + (pos.Aim.GetValueOrDefault() * instr.val) },
"up" => (pos) => pos with { Aim = pos.Aim - instr.val },
"down" => (pos) => pos with { Aim = pos.Aim + instr.val },
var position2 = new Position(0, 0, 0);
steps2.ForEach(step => position2 = step(position2));
Console.WriteLine($"{position2.Horizontal}, {position2.Vertical}, {position2.Aim}");
Console.WriteLine(position2.Horizontal * position2.Vertical);
public record Position(int Horizontal, int Vertical, int? Aim = null);