started on astar code
This commit is contained in:
parent
0e5a63d58a
commit
2ad0676c49
@ -9,7 +9,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Advent Of Code Library\Advent Of Code Library.csproj" />
|
<ProjectReference Include="..\Advent Of Code Library\AdventOfCode.Library.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
@ -3,37 +3,15 @@
|
|||||||
using AdventOfCodeLibrary._2022;
|
using AdventOfCodeLibrary._2022;
|
||||||
using AdventOfCodeLibrary.Shared;
|
using AdventOfCodeLibrary.Shared;
|
||||||
|
|
||||||
string _demoData = @"Monkey 0:
|
string _demoData = @"Sabqponm
|
||||||
Starting items: 79, 98
|
abcryxxl
|
||||||
Operation: new = old * 19
|
accszExk
|
||||||
Test: divisible by 23
|
acctuvwj
|
||||||
If true: throw to monkey 2
|
abdefghi";
|
||||||
If false: throw to monkey 3
|
|
||||||
|
|
||||||
Monkey 1:
|
Answerable answerable = new Day12Part1();
|
||||||
Starting items: 54, 65, 75, 74
|
|
||||||
Operation: new = old + 6
|
|
||||||
Test: divisible by 19
|
|
||||||
If true: throw to monkey 2
|
|
||||||
If false: throw to monkey 0
|
|
||||||
|
|
||||||
Monkey 2:
|
|
||||||
Starting items: 79, 60, 97
|
|
||||||
Operation: new = old * old
|
|
||||||
Test: divisible by 13
|
|
||||||
If true: throw to monkey 1
|
|
||||||
If false: throw to monkey 3
|
|
||||||
|
|
||||||
Monkey 3:
|
|
||||||
Starting items: 74
|
|
||||||
Operation: new = old + 3
|
|
||||||
Test: divisible by 17
|
|
||||||
If true: throw to monkey 0
|
|
||||||
If false: throw to monkey 1";
|
|
||||||
|
|
||||||
Answerable answerable = new Day11Part2();
|
|
||||||
byte[] dataArray = File.ReadAllBytes(answerable.DefaultInputFile);
|
byte[] dataArray = File.ReadAllBytes(answerable.DefaultInputFile);
|
||||||
//dataArray = Encoding.UTF8.GetBytes(_demoData);
|
dataArray = Encoding.UTF8.GetBytes(_demoData);
|
||||||
|
|
||||||
Console.WriteLine($"Answer: {answerable.GetAnswer(dataArray)}");
|
Console.WriteLine($"Answer: {answerable.GetAnswer(dataArray)}");
|
||||||
Console.ReadKey(true);
|
Console.ReadKey(true);
|
||||||
@ -10,6 +10,20 @@
|
|||||||
|
|
||||||
public override string GetAnswer(byte[] data)
|
public override string GetAnswer(byte[] data)
|
||||||
{
|
{
|
||||||
|
int totalWidth = data.First(b => b == 10 || b == 13);
|
||||||
|
int totalHeigth = data.Count(b => b == 10);
|
||||||
|
|
||||||
|
int[][] map = new int[totalHeigth][];
|
||||||
|
|
||||||
|
for (int heigthIndex = 0; heigthIndex <= totalHeigth; heigthIndex++)
|
||||||
|
{
|
||||||
|
map[heigthIndex] = new int[totalWidth];
|
||||||
|
for (int widthIndex = 0; widthIndex <= totalWidth; widthIndex++)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return string.Empty;
|
return string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
10
Advent Of Code Library/2022/Day 12/Map.cs
Normal file
10
Advent Of Code Library/2022/Day 12/Map.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
namespace AdventOfCodeLibrary._2022.Day_12
|
||||||
|
{
|
||||||
|
internal class Map
|
||||||
|
{
|
||||||
|
internal void BuildMap(string[] mapData)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
46
Advent Of Code Library/Shared/A-Star/AStarGrid.cs
Normal file
46
Advent Of Code Library/Shared/A-Star/AStarGrid.cs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
namespace AdventOfCodeLibrary.Shared.A_Star
|
||||||
|
{
|
||||||
|
public class AStarGrid : Grid<AStarNode>
|
||||||
|
{
|
||||||
|
const int TILE_MOVE_COST = 10;
|
||||||
|
|
||||||
|
public AStarGrid(AStarNode[] data) : base(data)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public int MinimalSteps(AStarNode start, AStarNode destination)
|
||||||
|
{
|
||||||
|
List<AStarNode> closedNodes = new();
|
||||||
|
List<AStarNode> openNodes = new List<AStarNode> { start };
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
AStarNode current = openNodes.OrderBy(n => n.FCost).First();
|
||||||
|
openNodes.Remove(current);
|
||||||
|
current.CloseNode();
|
||||||
|
closedNodes.Add(current);
|
||||||
|
|
||||||
|
if (current == destination)
|
||||||
|
{
|
||||||
|
//done
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
var neighbors = GetNeighbors(current, false);
|
||||||
|
neighbors = neighbors.Where(n => current.CanMoveTo(n));
|
||||||
|
|
||||||
|
// calc costs
|
||||||
|
foreach(AStarNode neighbor in neighbors)
|
||||||
|
{
|
||||||
|
neighbor.ParentNode = current;
|
||||||
|
// since we only move straight the move cost is always the same
|
||||||
|
neighbor.GCost = current.GCost + TILE_MOVE_COST;
|
||||||
|
neighbor.HCost = neighbor.DistanceTo(destination) * TILE_MOVE_COST;
|
||||||
|
neighbor.OpenNode();
|
||||||
|
openNodes.Add(neighbor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
40
Advent Of Code Library/Shared/A-Star/AStarNode.cs
Normal file
40
Advent Of Code Library/Shared/A-Star/AStarNode.cs
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
namespace AdventOfCodeLibrary.Shared.A_Star
|
||||||
|
{
|
||||||
|
public class AStarNode : Node
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Distance from start node
|
||||||
|
/// </summary>
|
||||||
|
public int GCost { get; set; } = 0;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Distance from end node
|
||||||
|
/// </summary>
|
||||||
|
public int HCost { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Total cost (G + F)
|
||||||
|
/// </summary>
|
||||||
|
public int FCost => GCost + HCost;
|
||||||
|
|
||||||
|
public bool? IsClosed { get; private set; } = null;
|
||||||
|
|
||||||
|
public AStarNode? ParentNode { get; set; }
|
||||||
|
|
||||||
|
public AStarNode(Node position) : base(position)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public AStarNode(int x, int y, char value) : base(x, y, value)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public void OpenNode() => IsClosed = false;
|
||||||
|
|
||||||
|
public void CloseNode() => IsClosed = true;
|
||||||
|
|
||||||
|
public bool CanMoveTo(AStarNode target)
|
||||||
|
{
|
||||||
|
int diff = target.Integer - Integer; ;
|
||||||
|
return diff == 0 || diff == 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
30
Advent Of Code Library/Shared/Grid.cs
Normal file
30
Advent Of Code Library/Shared/Grid.cs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AdventOfCodeLibrary.Shared
|
||||||
|
{
|
||||||
|
public class Grid<T> where T : Node
|
||||||
|
{
|
||||||
|
public List<T> DataGrid { get; set; } = new List<T>();
|
||||||
|
|
||||||
|
public Grid(T[] data) => DataGrid.AddRange(data);
|
||||||
|
|
||||||
|
public Grid(IEnumerable<T> data) : this(data.ToArray()) { }
|
||||||
|
|
||||||
|
public IEnumerable<T> GetRow(int rowNumber) => DataGrid.Where(n => n.X == rowNumber);
|
||||||
|
public IEnumerable<T> GetColumn(int columnNumber) => DataGrid.Where(n => n.Y == columnNumber);
|
||||||
|
|
||||||
|
public IEnumerable<T> GetNeighbors(T source, bool allowDiagonals = true)
|
||||||
|
{
|
||||||
|
IEnumerable <T> neighbors = DataGrid.Where(target => Math.Abs(source.X - target.X) <= 1 || Math.Abs(source.Y - target.Y) <= 1);
|
||||||
|
|
||||||
|
if (allowDiagonals)
|
||||||
|
{
|
||||||
|
return neighbors;
|
||||||
|
}
|
||||||
|
|
||||||
|
return neighbors.Where(target => !(Math.Abs(source.X - target.X) <= 1 && Math.Abs(source.Y - target.Y) <= 1));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
25
Advent Of Code Library/Shared/Node.cs
Normal file
25
Advent Of Code Library/Shared/Node.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
namespace AdventOfCodeLibrary.Shared
|
||||||
|
{
|
||||||
|
public class Node
|
||||||
|
{
|
||||||
|
internal int X { get; set; }
|
||||||
|
internal int Y { get; set; }
|
||||||
|
internal char Char { get; }
|
||||||
|
internal short Integer => (short)Char;
|
||||||
|
|
||||||
|
public Node(int x, int y, char character)
|
||||||
|
{
|
||||||
|
X = x;
|
||||||
|
Y = y;
|
||||||
|
Char = character;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Node(Node position) : this(position.X, position.Y, position.Char)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public int DistanceTo(Node other)
|
||||||
|
{
|
||||||
|
return Math.Abs(X - other.X) + Math.Abs(Y - other.Y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,9 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
|||||||
# Visual Studio Version 17
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 17.4.33103.184
|
VisualStudioVersion = 17.4.33103.184
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Advent Of Code Runner", "Advend Of Code Runner\Advent Of Code Runner.csproj", "{6DCDC513-AF72-4029-932A-A0079BB5422B}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AdventOfCode.Runner", "Advend Of Code Runner\AdventOfCode.Runner.csproj", "{6DCDC513-AF72-4029-932A-A0079BB5422B}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Advent Of Code Library", "Advent Of Code Library\Advent Of Code Library.csproj", "{33CC3924-F18E-4B88-9989-A7A9077B9AC4}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AdventOfCode.Library", "Advent Of Code Library\AdventOfCode.Library.csproj", "{33CC3924-F18E-4B88-9989-A7A9077B9AC4}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user