Added day 7, not done

This commit is contained in:
Rob 2022-12-07 22:19:52 +01:00
parent 1b91473395
commit d311ea97b7
5 changed files with 1230 additions and 1 deletions

View File

@ -8,7 +8,7 @@ string _demoData = @"2-4,6-8
6-6,4-6 6-6,4-6
2-6,4-8"; 2-6,4-8";
Answerable answerable = new Day01Part1(); Answerable answerable = new Day07Part1();
byte[] dataArray = File.ReadAllBytes(answerable.DefaultInputFile); byte[] dataArray = File.ReadAllBytes(answerable.DefaultInputFile);
//dataArray = Encoding.UTF8.GetBytes(_demoData); //dataArray = Encoding.UTF8.GetBytes(_demoData);

View File

@ -0,0 +1,21 @@
namespace AdventOfCodeLibrary._2022
{
using AdventOfCodeLibrary._2022.Day_07;
using AdventOfCodeLibrary.Shared;
public class Day07Part1 : Answerable
{
public override int Year { get; set; } = 2022;
public override int Day { get; set; } = 7;
public override int Part { get; set; } = 1;
public override string GetAnswer(byte[] data)
{
int maxSize = 100000;
string[] output = GetAsStringArray(data);
DirectoryManager manager = new();
manager.ParseTerminalOutput(output);
return manager.GetDirectoriesWithMaxFilesSize(maxSize);
}
}
}

View File

@ -0,0 +1,23 @@
namespace AdventOfCodeLibrary._2022
{
using AdventOfCodeLibrary.Shared;
public class Day07Part2 : Answerable
{
public override int Year { get; set; } = 2022;
public override int Day { get; set; } = 7;
public override int Part { get; set; } = 2;
public override string GetAnswer(byte[] data)
{
int markerLength = 14;
for (int skip = 0; skip < data.Length - 1 - markerLength; skip++)
{
if (data.Skip(skip).Take(markerLength).Distinct().Count() == markerLength)
return (skip + markerLength).ToString();
}
return "nothing found";
}
}
}

View File

@ -0,0 +1,89 @@
namespace AdventOfCodeLibrary._2022.Day_07
{
public class Directory
{
public Directory? ParentDirectory { get; set; }
public string Name { get; set; } = string.Empty;
public List<Directory> Directories { get; set; } = new();
public List<File> Files { get; set; } = new();
public long GetSizeOfAllFiles() => Files.Sum(f => f.Size) + Directories.Sum(d => d.GetSizeOfAllFiles());
}
public struct File
{
public string Name { get; set; }
public long Size { get; set; }
}
internal class DirectoryManager
{
Directory RootDirectory;
Directory CurrentDirectory;
internal DirectoryManager()
{
RootDirectory = new Directory { Name = "/", ParentDirectory = null };
CurrentDirectory = RootDirectory;
}
internal void ParseTerminalOutput(string[] lines)
{
for (int lineIndex = 0; lineIndex < lines.Length; lineIndex++)
{
string[] parts = lines[lineIndex].Split(' ');
// it is a command
if (parts[0] == "$")
{
// move to other folder
if (parts[1] == "cd")
{
// go to root
if (parts[2] == "/")
{
CurrentDirectory = RootDirectory;
continue;
}
if (parts[2] == "..")
{
CurrentDirectory = CurrentDirectory.ParentDirectory;
continue;
}
CurrentDirectory = CurrentDirectory.Directories.Single(dir => dir.Name == parts[2]);
continue;
}
// if none of the about, just skip
continue;
}
// if not a command it is the output from the ls command
if (parts[0] == "dir")
{
CurrentDirectory.Directories.Add(new Directory { Name = parts[1], ParentDirectory = CurrentDirectory });
continue;
}
// it should be a number indicating the size of a file
CurrentDirectory.Files.Add(new File { Name = parts[1], Size = Convert.ToInt64(parts[0]) });
}
}
internal string GetDirectoriesWithMaxFilesSize(int maxSize)
{
return GetDirectories(RootDirectory).Where(d => d.GetSizeOfAllFiles() <= maxSize).Sum(d => d.GetSizeOfAllFiles()).ToString();
}
private IEnumerable<Directory> GetDirectories(Directory root)
{
yield return root;
foreach (Directory dir in root.Directories)
yield return dir;
}
}
}

File diff suppressed because it is too large Load Diff