Completed Day 11 with optimized solution (no more giant 2d array)
continuous-integration/drone/pr Build is failing Details

pull/3/head
Alexander Sigler 12 months ago
parent 9d39c61213
commit 4a9a949d1e

@ -57,5 +57,17 @@ namespace AdventOfCode.Common
Console.WriteLine(); Console.WriteLine();
} }
} }
public static void PrintSquareArray(this string[,] arr)
{
for (int x = 0; x < arr.GetLength(0); x++)
{
for (int y = 0; y < arr.GetLength(1); y++)
{
Console.Write(arr[x, y] + " ");
}
Console.WriteLine();
}
}
} }
} }

@ -2,7 +2,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
namespace AdventOfCode._2023 namespace AdventOfCode._2023
{ {
@ -11,61 +10,135 @@ namespace AdventOfCode._2023
protected override AOCResponse ExecutePartA() protected override AOCResponse ExecutePartA()
{ {
return ExecutePartB();
return this._response;
} }
protected override AOCResponse ExecutePartB() protected override AOCResponse ExecutePartB()
{ {
//Determine how much space to replace each empty row with
var factor = this._request.Version == AOCVersion.A ? 2 : 1000000;
//Create our universe
var superUniverse = new SuperDuperUniverseGalaxy(factor, this.GetSplitInput().ToList());
var galaxies = superUniverse.Galaxies;
if (!this._request.IgnoreLogMessages)
{
foreach (var galaxy in galaxies)
{
Console.WriteLine($"Galaxy {galaxy.Id} is at {galaxy.X},{galaxy.Y}");
}
}
//Calculate the shortest path.
long total = 0;
for (int i = 0; i < galaxies.Count; i++)
{
for (int j = i + 1; j < galaxies.Count; j++)
{
total += galaxies[i].CalculateDistance(galaxies[j]);
}
}
this.Answer = total;
return this._response; return this._response;
} }
} }
class UniverseGalaxy //AKA Part B
class SuperDuperUniverseGalaxy
{ {
public List<Galaxy> Galaxies { get; set; }
private string[,] _board; private string[,] _board;
public UniverseGalaxy(List<string> input) public SuperDuperUniverseGalaxy(long factor, List<string> input)
{ {
var rows = input.Count; var rows = input.Count;
var columns = input.First().Length; var columns = input.First().Length;
_board = new string[rows, columns]; _board = new string[rows, columns];
for (int y = 0; y < rows; y++) for (int x = 0; x < rows; x++)
{ {
for (int x = 0; x < columns; x++) for (int y = 0; y < columns; y++)
{ {
_board[x, y] = input[x][y].ToString(); _board[x, y] = input[x][y].ToString();
} }
} }
//TODO Double the board var doubledRows = GetDoubledRows();
var doubledColumns = GetDoubledColumns();
//TODO Find all the galaxies on the board Galaxies = new List<Galaxy>();
int galaxyCount = 0;
for (int x = 0; x < _board.GetLength(0); x++)
{
for (int y = 0; y < _board.GetLength(1); y++)
{
if (_board[x, y].Equals("#"))
{
long xOffset = doubledRows.Count(dR => dR <= x);
long yOffset = doubledColumns.Count(dC => dC <= y);
Galaxies.Add(new Galaxy()
{
Id = (++galaxyCount).ToString(),
X = (xOffset * factor) + x - xOffset,
Y = (yOffset * factor) + y - yOffset
});
}
}
}
}
//TODO Calculate the distance between all of the galaxies public List<int> GetDoubledRows()
{
var doubledRows = new List<int>();
for (int x = 0; x < _board.GetLength(0); x++)
{
bool isEmpty = true;
for (int y = 0; y < _board.GetLength(1); y++)
{
if (_board[x, y] == "#")
{
isEmpty = false;
break;
}
}
if (isEmpty)
doubledRows.Add(x);
}
return doubledRows;
}
//TODO Find the shortest distance between them! public List<int> GetDoubledColumns()
{
var doubledColumns = new List<int>();
for (int y = 0; y < _board.GetLength(1); y++)
{
bool isEmpty = true;
for (int x = 0; x < _board.GetLength(0); x++)
{
if (_board[x, y] == "#")
{
isEmpty = false;
break;
}
}
if (isEmpty)
doubledColumns.Add(y);
}
return doubledColumns;
} }
} }
class Galaxy class Galaxy
{ {
public Dictionary<string, long> DistanceLookup { get; set; }
public string Id { get; set; } public string Id { get; set; }
public int X { get; set; } public long X { get; set; }
public int Y { get; set; } public long Y { get; set; }
public void CalculateDistance(IEnumerable<Galaxy> galaxies) public long CalculateDistance(Galaxy galaxy)
{ {
DistanceLookup = new Dictionary<string, long>(); //We use Manhattan distance |x2 - x1| + |y2-y1|
foreach (var galaxy in galaxies) return Math.Abs(this.X - galaxy.X) + Math.Abs(this.Y - galaxy.Y);
{
if (galaxy.Id.Equals(this.Id)) continue;
long distanceBetweenGalaxies = -1; //TODO need to calculate this? some math.min and math.max
DistanceLookup[galaxy.Id] = distanceBetweenGalaxies;
}
} }
} }
} }

Loading…
Cancel
Save