Alexander Sigler 6ca37a1868 Add 2024 days
2025-05-05 10:47:22 -07:00

105 lines
3.2 KiB
C#

using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace AdventOfCode.Models
{
public abstract class AOCDay : IAOCService
{
protected AOCRequest _request;
protected AOCResponse _response;
private ILogger _logger;
private List<string> _debugMessages;
protected object Answer { set { this._response.Answer = value; } }
public AOCDay()
{
this._response = new AOCResponse()
{
Status = false
};
this._debugMessages = new List<string>();
}
public AOCResponse ExecuteDay(AOCRequest request)
{
_request = request;
try
{
var startTicks = DateTime.UtcNow.Ticks;
switch (request.Version)
{
case AOCVersion.A:
this._response = ExecutePartA();
break;
case AOCVersion.B:
this._response = ExecutePartB();
break;
}
this._response.RunTime = (DateTime.UtcNow.Ticks - startTicks).ToString();
this._response.Status = true;
}
catch (Exception e)
{
this._response.Answer = e.Message;
this._response.Status = false;
this._response.StackTrace = e.StackTrace;
}
this._response.Debug = this._debugMessages;
return this._response;
}
protected abstract AOCResponse ExecutePartA();
protected abstract AOCResponse ExecutePartB();
protected string[] GetSplitInput(bool noTrim = false)
{
if (noTrim)
return this._request.Input.Replace("\r", "").Split("\n");
return this._request.Input.Trim().Replace("\r", "").Split("\n");
}
protected List<string[]> SplitInputOnEmptyLine()
{
var rows = GetSplitInput();
var input = new List<string[]>();
int set = 0;
for (int i = 0; i < rows.Length; i++)
{
if (string.IsNullOrWhiteSpace(rows[i]))
{
input.Add(rows.Skip(set).Take(i - set).ToArray());
set = i + 1;
}
if (i == rows.Length - 1)
{
input.Add(rows.Skip(set).ToArray());
}
}
return input;
}
public void SetLogger(ILogger logger)
{
this._logger = logger;
}
protected void Log(object message, params object[] args)
{
if (!this._request.IgnoreLogMessages)
{
if (_logger != null)
_logger.LogInformation(message.ToString(), args);
_debugMessages.Add(string.Format(message.ToString(), args));
}
}
protected void Info(object message, params object[] args)
{
_debugMessages.Add(string.Format(message.ToString(), args));
}
}
}