AOC2021/AOC2021/Days/Day4.cs
2021-12-09 17:07:11 -08:00

87 lines
2.7 KiB
C#

using AOC2021.Helper;
using AOC2021.Models;
using AOC2021.Models.Day4;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace AOC2021.Days
{
public class Day4 : AOCDay
{
private static readonly int BOARD_SIZE = 5;
private List<BingoBoard> _boards;
public Day4()
{
_boards = new List<BingoBoard>();
}
protected override AOCResponse ExecutePartA()
{
var input = GetSplitInput();
var checkedValues = input.First().Trim().Split(","); //Save selected answers into variable
CreateBoards(input);
BingoBoard winner = null;
foreach (var ball in checkedValues)
{
Log("Ball picked was " + ball);
foreach (var board in _boards)
{
board.MarkValueAsChecked(ball.ToInt());
if (board.IsWinner())
{
winner = board;
Log("We have a winning board, number " + winner.Id);
break;
}
}
if (winner != null)
break;
}
this._response.Answer = winner.CalculateScore().ToString();
Log("Winning board score is " + this._response.Answer);
return this._response;
}
protected override AOCResponse ExecutePartB()
{
var input = GetSplitInput();
var checkedValues = input.First().Trim().Split(","); //Save selected answers into variable
CreateBoards(input);
BingoBoard winner = null;
foreach (var ball in checkedValues)
{
Log("Ball picked was " + ball);
foreach (var board in _boards.Reverse<BingoBoard>())
{
board.MarkValueAsChecked(ball.ToInt());
if (board.IsWinner())
{
winner = board;
_boards.Remove(board);
}
}
}
this._response.Answer = winner.CalculateScore().ToString();
Log("Winning board score is " + this._response.Answer);
return this._response;
}
private void CreateBoards(string[] input)
{
//Create all of our game boards
int skipValue = 2;
while (skipValue < input.Length)
{
var group = input.Skip(skipValue).Take(5);
_boards.Add(new BingoBoard(BOARD_SIZE, group));
skipValue += 6;
}
}
}
}