279 lines
8.5 KiB
C#
279 lines
8.5 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using static System.Console;
|
|
|
|
namespace _2018_08
|
|
{
|
|
class Program
|
|
{
|
|
static void Main(string[] args)
|
|
{
|
|
bool own = false;
|
|
int y = 0;
|
|
string[] resTab = File.ReadAllText(@"..\..\..\Data\Adventofcode_181208\2018_08_data.txt").Split(' ');
|
|
//string[] resTab = @"2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2 2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2".Split(' ');
|
|
//string[] resTab = @"2 3 2 1 2 3 1 1 0 2 1 2 3 0 3 4 5 6 7 8 9 0 4 10 11 12 13 14 2 2 0 3 15 16 17 0 2 18 19 20 21 22 23 24".Split(' '); own = true;
|
|
int[] numbers = new int[resTab.Length];
|
|
for (int i = 0; i < resTab.Length; i++)
|
|
{
|
|
numbers[i] = int.Parse(resTab[i]);
|
|
}
|
|
if (own)
|
|
{
|
|
for (int z = 1; z < 25; z++)
|
|
{
|
|
y += z;
|
|
}
|
|
}
|
|
|
|
Write($"Antal värden = {resTab.Length}");
|
|
if (own)
|
|
{
|
|
WriteLine($" svar = {y}");
|
|
}
|
|
else WriteLine();
|
|
|
|
ReadKey();
|
|
|
|
var pgm = new Program();
|
|
|
|
int x = pgm.CalcMetaData(numbers);
|
|
|
|
WriteLine();
|
|
WriteLine($"summa = {x}");
|
|
ReadKey();
|
|
}
|
|
|
|
private int CalcMetaData(int[] nums)
|
|
{
|
|
int metaSum = 0;
|
|
TreeNode tnStart = new TreeNode(nums, null);
|
|
TreeNode tnTmp = tnStart;
|
|
TreeNode tnAkt = tnStart;
|
|
while (true)
|
|
{
|
|
tnAkt = new TreeNode(nums, tnTmp);
|
|
tnTmp = tnAkt;
|
|
if (tnAkt.LC.Level < 0)
|
|
break;
|
|
}
|
|
|
|
ReadKey();
|
|
|
|
tnTmp = tnStart;
|
|
while (tnTmp!=null)
|
|
{
|
|
tnTmp.PrepMetatab(tnTmp.NodeEnd);
|
|
WriteLine(tnTmp.ToString());
|
|
metaSum += tnTmp.MetaValueSum();
|
|
tnTmp = tnTmp.Next;
|
|
}
|
|
|
|
ReadKey();
|
|
|
|
return metaSum;
|
|
}
|
|
|
|
}
|
|
|
|
public class TreeNode
|
|
{
|
|
public int ObjNr { get; set; }
|
|
public int HeaderStart { get; set; }
|
|
public int AntChilds { get; set; }
|
|
public int ChildNo { get; set; }
|
|
public int AntMetaEntries { get; set; }
|
|
public int[] MetaTab { get; set; }
|
|
public int NodeEnd { get; set; }
|
|
public int[] NumberTab { get; set; }
|
|
public TreeNode Previous { get; set; }
|
|
public TreeNode Next { get; set; }
|
|
public LevelCount LC { get; set; }
|
|
static int nr;
|
|
int treeNodeStart = 0;
|
|
|
|
public TreeNode(int[] NumTab, TreeNode tnPrev)
|
|
{
|
|
TreeNode.nr++;
|
|
ObjNr = TreeNode.nr;
|
|
NumberTab = NumTab;
|
|
LC = new LevelCount();
|
|
Previous = tnPrev;
|
|
if (Previous != null)
|
|
{
|
|
Previous.Next = this;
|
|
}
|
|
else
|
|
{
|
|
LC.Level = 0;
|
|
treeNodeStart = 0;
|
|
}
|
|
Next = null;
|
|
SetLevel();
|
|
|
|
if (LC.Level > -1)
|
|
{
|
|
HeaderStart = treeNodeStart;
|
|
AntChilds = NumberTab[HeaderStart];
|
|
AntMetaEntries = NumberTab[HeaderStart + 1];
|
|
NodeEnd = HeaderStart + 2 + AntMetaEntries;
|
|
WriteLine(this.ToString());
|
|
}
|
|
|
|
}
|
|
|
|
private void SetLevel()
|
|
{
|
|
TreeNode wrkTmp = this;
|
|
|
|
if (Previous != null)
|
|
{
|
|
if (Previous.AntChilds > 0)
|
|
{
|
|
LC.Level = Previous.LC.Level + 1;
|
|
LC.Nodes = Previous.AntChilds;
|
|
ChildNo = 1;
|
|
treeNodeStart = Previous.HeaderStart + 2;
|
|
}
|
|
else
|
|
{
|
|
if (Previous.ChildNo < Previous.LC.Nodes)
|
|
{
|
|
LC.Level = Previous.LC.Level;
|
|
LC.Nodes = Previous.LC.Nodes;
|
|
ChildNo = Previous.ChildNo + 1;
|
|
treeNodeStart = Previous.NodeEnd;
|
|
}
|
|
else
|
|
{
|
|
LC.Level = Previous.LC.Level - 1;
|
|
|
|
if (FindStartOfObject(wrkTmp).ChildNo < FindStartOfObject(wrkTmp).LC.Nodes)
|
|
{
|
|
FindStartOfObject(wrkTmp).PrepMetatab(wrkTmp.Previous.NodeEnd + FindStartOfObject(wrkTmp).AntMetaEntries);
|
|
treeNodeStart = FindStartOfObject(wrkTmp).NodeEnd;
|
|
wrkTmp.ChildNo = FindStartOfObject(wrkTmp).ChildNo + 1;
|
|
wrkTmp.LC.Nodes = FindHeadOfStartOfObject(wrkTmp).AntChilds;
|
|
}
|
|
else
|
|
{
|
|
int chld = FindStartOfObject(wrkTmp).ChildNo;
|
|
int ndss = FindStartOfObject(wrkTmp).LC.Nodes;
|
|
treeNodeStart = wrkTmp.Previous.NodeEnd;
|
|
|
|
while (FindStartOfObject(wrkTmp).ChildNo == FindStartOfObject(wrkTmp).LC.Nodes && LC.Level > -1)
|
|
{
|
|
|
|
FindStartOfObject(wrkTmp).PrepMetatab(treeNodeStart + FindStartOfObject(wrkTmp).AntMetaEntries);
|
|
treeNodeStart = FindStartOfObject(wrkTmp).NodeEnd;
|
|
|
|
LC.Level = LC.Level - 1;
|
|
|
|
chld = FindStartOfObject(wrkTmp).ChildNo;
|
|
ndss = FindStartOfObject(wrkTmp).LC.Nodes;
|
|
|
|
}
|
|
if (LC.Level <= 0)
|
|
{
|
|
if (treeNodeStart >= NumberTab.Length)
|
|
{
|
|
Previous.Next = null;
|
|
}
|
|
else
|
|
{
|
|
LC.Level = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private TreeNode FindStartOfObject(TreeNode xTree)
|
|
{
|
|
TreeNode jmfTmp = this;
|
|
TreeNode srchTmp = Previous;
|
|
|
|
if (xTree != null)
|
|
{
|
|
jmfTmp = xTree;
|
|
srchTmp = xTree.Previous;
|
|
}
|
|
while (srchTmp.LC.Level > jmfTmp.LC.Level && srchTmp.Previous != null)
|
|
{
|
|
srchTmp = srchTmp.Previous;
|
|
}
|
|
return srchTmp;
|
|
}
|
|
|
|
private TreeNode FindHeadOfStartOfObject(TreeNode xTree)
|
|
{
|
|
TreeNode jmfTmp = this;
|
|
TreeNode srchTmp = Previous;
|
|
if (xTree != null)
|
|
{
|
|
jmfTmp = xTree;
|
|
srchTmp = xTree.Previous;
|
|
}
|
|
|
|
while (srchTmp.LC.Level >= this.LC.Level && srchTmp.Previous != null)
|
|
{
|
|
srchTmp = srchTmp.Previous;
|
|
}
|
|
return srchTmp;
|
|
}
|
|
|
|
public void PrepMetatab(int subLen)
|
|
{
|
|
NodeEnd = subLen;
|
|
MetaTab = new int[AntMetaEntries];
|
|
for (int i = 0, j = NodeEnd - AntMetaEntries; j < NodeEnd; j++, i++)
|
|
{
|
|
MetaTab[i] = NumberTab[j];
|
|
}
|
|
}
|
|
|
|
public int MetaValueSum()
|
|
{
|
|
int tmpMetas = 0;
|
|
if (MetaTab != null)
|
|
{
|
|
for (int y = 0; y < AntMetaEntries; y++)
|
|
{
|
|
tmpMetas += MetaTab[y];
|
|
}
|
|
}
|
|
else tmpMetas = -1;
|
|
return tmpMetas;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
string retStr = $"Nr: {ObjNr}, Level: {LC.Level}, Child: {ChildNo} Start: {HeaderStart}, Subobj: {AntChilds}, Metafält: {AntMetaEntries}, Nodend: {NodeEnd}";
|
|
if (MetaTab != null)
|
|
{
|
|
for (int x = 0; x < AntMetaEntries; x++)
|
|
{
|
|
retStr += $" meta[{x}]: {MetaTab[x]}";
|
|
}
|
|
}
|
|
return retStr;
|
|
}
|
|
|
|
}
|
|
|
|
public class LevelCount
|
|
{
|
|
public int Level { get; set; }
|
|
public int Nodes { get; set; }
|
|
public LevelCount()
|
|
{
|
|
Level = 0;
|
|
Nodes = 0;
|
|
}
|
|
}
|
|
}
|