ben
/
aoc
1
0
Fork 0
aoc/AOC2016/Day08.cs

92 lines
2.7 KiB
C#

namespace AOC2016;
/// <summary>
/// Day 8: <a href="https://adventofcode.com/2016/day/8"/>
/// </summary>
public sealed class Day08() : Day(2016, 8, "Two-Factor Authentication")
{
private static string PrintGrid(char[,] screen)
{
var sb = new StringBuilder();
for (var y = 0; y <= screen.GetUpperBound(0); y++)
{
for (var x = 0; x <= screen.GetUpperBound(1); x++)
sb.Append(screen[y, x]);
sb.AppendLine();
}
return sb.ToString();
}
private static void DrawRectangle(char[,] screen, int width, int height)
{
for (var y = 0; y < height; y++)
for (var x = 0; x < width; x++)
screen[y, x] = '\u2588';
}
private static void Coltate(char[,] screen, int index, int extent)
{
for (var count = 0; count < extent; count++)
{
var tmp = screen[screen.GetUpperBound(0), index];
for (var i = screen.GetUpperBound(0); i > 0; i--)
screen[i, index] = screen[i - 1, index];
screen[0, index] = tmp;
}
}
private static void Rowtate(char[,] screen, int index, int extent)
{
for (var count = 0; count < extent; count++)
{
var tmp = screen[index, screen.GetUpperBound(1)];
for (var i = screen.GetUpperBound(1); i > 0; i--)
screen[index, i] = screen[index, i - 1];
screen[index, 0] = tmp;
}
}
public override object Part1() =>
Input.Where(line => line.StartsWith("rect")).Sum(rect =>
{
var s = rect.Split('x', ' ').Skip(1).Select(int.Parse).ToList();
return s[0] * s[1];
});
public override object Part2()
{
var screen = new char[6, 50];
for (var y = 0; y < 6; y++)
for (var x = 0; x < 50; x++)
screen[y, x] = '\u2592';
foreach (var line in Input)
{
var s = line.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
switch (s[0])
{
case "rect":
var a = s[1].Split('x');
DrawRectangle(screen, int.Parse(a[0]), int.Parse(a[1]));
break;
case "rotate":
var index = int.Parse(s[2][2..]);
var extent = int.Parse(s[4]);
if (s[1] == "column")
Coltate(screen, index, extent);
else
Rowtate(screen, index, extent);
break;
}
}
return Environment.NewLine + PrintGrid(screen);
}
}