Beispiel #1
0
        public void XORBlocks()
        {
            KnotHash kh    = new KnotHash();
            var      input = new int[] { 65, 27, 9, 1, 4, 3, 40, 50, 91, 7, 6, 0, 2, 5, 68, 22 };

            Assert.Equal(64, kh.XORBlock(input));
        }
Beispiel #2
0
        public void CalculateHashRounds()
        {
            KnotHash kh     = new KnotHash();
            var      result = kh.PerformHashRounds(new int[] { 3, 4, 1, 5 }, 1, 5);

            Assert.Equal(12, result[0] * result[1]);
        }
        public bool Solve(int part = 0)
        {
            string   input    = File.ReadAllText("Day10/input.txt");
            KnotHash knotHash = new KnotHash();

            if (part == 2)
            {
                int[] lengths = (input + "\x11\x1f\x49\x2f\x17").Select(c => (int)c).ToArray();

                for (int round = 0; round < 64; round++)
                {
                    knotHash.HashRound(lengths);
                }

                Console.WriteLine(knotHash.GetDenseHash());
            }
            else
            {
                int[] lengths = input.Split(',').Select(s => int.Parse(s)).ToArray();
                int   result  = knotHash.HashRound(lengths);
                Console.WriteLine(result);
            }

            return(true);
        }
Beispiel #4
0
        public void GenerateInputSequences()
        {
            KnotHash kh = new KnotHash();

            int[] expected = { 49, 44, 50, 44, 51, 17, 31, 73, 47, 23 };

            Assert.Equal(expected, kh.GenerateInputSequence("1,2,3"));
        }
Beispiel #5
0
        public void KnotHash_MultiplyFirstTwoHashedValues_SmallList()
        {
            // act
            var result = KnotHash.MultiplyFirstTwoHashedValues(5, "3,4,1,5");

            // assert
            Assert.AreEqual(12, result);
        }
Beispiel #6
0
        public void KnotHash_ComplexHash_EmptyString()
        {
            // act
            var result = KnotHash.OutputHexString(256, string.Empty);

            // assert
            Assert.AreEqual("a2582a3a0e66e6e86e3812dcb672a272", result);
        }
Beispiel #7
0
        public void KnotHash_ComplexHash_Letters()
        {
            // act
            var result = KnotHash.OutputHexString(256, "AoC 2017");

            // assert
            Assert.AreEqual("33efeb34ea91902bb2f59c9920caa6cd", result);
        }
Beispiel #8
0
        public void KnotHash_ComplexHash_NumbersPassOne()
        {
            // act
            var result = KnotHash.OutputHexString(256, "1,2,3");

            // assert
            Assert.AreEqual("3efbe78a8d82f29979031a4aa0b16a9d", result);
        }
Beispiel #9
0
        public void KnotHash_ComplexHash_NumbersPassTwo()
        {
            // act
            var result = KnotHash.OutputHexString(256, "1,2,4");

            // assert
            Assert.AreEqual("63960835bcdc130f0b66d7ff4f6a5a8e", result);
        }
Beispiel #10
0
        public void HashStrings()
        {
            KnotHash kh = new KnotHash();

            Assert.Equal("a2582a3a0e66e6e86e3812dcb672a272", kh.GenerateHash("", 64));
            Assert.Equal("33efeb34ea91902bb2f59c9920caa6cd", kh.GenerateHash("AoC 2017", 64));
            Assert.Equal("3efbe78a8d82f29979031a4aa0b16a9d", kh.GenerateHash("1,2,3", 64));
            Assert.Equal("63960835bcdc130f0b66d7ff4f6a5a8e", kh.GenerateHash("1,2,4", 64));
        }
Beispiel #11
0
        public void ShouldCalculateUsedSpace()
        {
            KnotHash    kh   = new KnotHash();
            GridCreator g    = new GridCreator(kh);
            var         grid = g.Generate("flqrgnkx");

            Defragmentor f = new Defragmentor();

            Assert.Equal(8108, f.GetUsedSpace(grid));
        }
Beispiel #12
0
        public void ShouldCountConnectedComponents()
        {
            KnotHash    kh   = new KnotHash();
            GridCreator g    = new GridCreator(kh);
            var         grid = g.Generate("flqrgnkx");

            Defragmentor f = new Defragmentor();

            Assert.Equal(1242, f.CountUsedGroups(grid));
        }
Beispiel #13
0
        public void TestToDenseHash()
        {
            List <int> sparseHash = new List <int>()
            {
                65, 27, 9, 1, 4, 3, 40, 50, 91, 7, 6, 0, 2, 5, 68, 22
            };
            var sut    = new KnotHash();
            var result = sut.ToDenseHash(sparseHash, 16);

            Assert.Equal(64, result.First());
        }
        public void Setup()
        {
            ClassUnderTest = new KnotHash();

            Values = new ImportantValues
            {
                CurrentPosition = 0,
                SkipSize        = 0,
                MarkList        = ClassUnderTest.GenerateList()
            };
        }
Beispiel #15
0
        public void TestKnotHash_string()
        {
            var        dayTen        = new DayTen();
            List <int> originalInput = dayTen.Input;
            string     stringInput   = string.Join <int>(",", originalInput);

            var knotHash = new KnotHash(stringInput);

            Assert.Equal(32, knotHash.HexOutput.Length);
            Assert.Equal("0c2f794b2eb555f7830766bf8fb65a16", knotHash.HexOutput);
        }
Beispiel #16
0
        public void TestToHexString()
        {
            List <int> denseHash = new List <int>()
            {
                64, 7, 255
            };
            var sut    = new KnotHash();
            var result = sut.ToHexString(denseHash);

            Assert.Equal("4007ff", result);
        }
Beispiel #17
0
        public void TestToHexString_Real()
        {
            List <int> denseHash = new List <int>()
            {
                12, 47, 121, 75, 46, 181, 85, 247, 131, 7, 102, 191, 143, 182, 90, 22
            };
            var sut    = new KnotHash();
            var result = sut.ToHexString(denseHash);

            Assert.Equal(32, result.Length);
            Assert.Equal("0c2f794b2eb555f7830766bf8fb65a16", result);
        }
Beispiel #18
0
        public void GenerateGrids()
        {
            KnotHash    kh   = new KnotHash();
            GridCreator g    = new GridCreator(kh);
            var         grid = g.Generate("flqrgnkx");

            Assert.Equal(128, grid.Length);

            foreach (var row in grid)
            {
                Assert.Equal(128, row.Length);
            }
        }
Beispiel #19
0
        public void TestToAscii()
        {
            List <int> list = new List <int>()
            {
                1, 2, 3
            };
            var sut    = new KnotHash();
            var result = sut.ToAsciiCode(list);

            Assert.Equal(new List <int>()
            {
                49, 44, 50, 44, 51
            }, result);
        }
Beispiel #20
0
        public void PartitionBlocks()
        {
            KnotHash kh     = new KnotHash();
            var      input  = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
            var      blocks = kh.PartitionList(input, 4);

            Assert.Equal(3, blocks.Count);

            var arrayBlocks = blocks.ToArray();

            Assert.Equal(new int[] { 1, 2, 3, 4 }, arrayBlocks[0]);
            Assert.Equal(new int[] { 5, 6, 7, 8 }, arrayBlocks[1]);
            Assert.Equal(new int[] { 9, 10, 11, 12 }, arrayBlocks[2]);
        }
Beispiel #21
0
        public string GenerateAnswer(string input)
        {
            var totalCount = 0;

            for (var i = 0; i < 128; i++)
            {
                var hash      = KnotHash.Generate($"{input}-{i}");
                var usedCount = hash
                                .Select(it => Convert.ToString(Convert.ToByte(it.ToString(), 16), 2))
                                .SelectMany(it => it)
                                .Count(it => it == '1');
                totalCount += usedCount;
            }

            return(totalCount.ToString());
        }
Beispiel #22
0
        public void TestCalculateKnotHash()
        {
            List <int> inputs = new List <int>()
            {
                3, 4, 1, 5
            };
            var           knotSize      = 5;
            List <int>    elements      = Enumerable.Range(0, knotSize).ToList();
            KnotHashState previousState = new KnotHashState(elements, 0, 0);

            var sut    = new KnotHash();
            var result = sut.CalculateKnotHash(previousState, inputs);
            var mult   = result.Elements[0] * result.Elements[1];

            Assert.Equal(12, mult);
        }
Beispiel #23
0
        private void BuildMap()
        {
            // Create the hasher
            KnotHash hasher = new KnotHash();

            // Prepare the input
            string key = Aoc.Framework.Input.GetString(this);

            // Build the map of used cells
            int[,] grid = new int[128, 128];
            for (int i = 0; i < 128; ++i)
            {
                string row = key + "-" + i.ToString();
                hasher.Compute(row, true);
                byte[] hash = hasher.GetBytesHash();
                for (int j = 0; j < 128; j++)
                {
                    grid[i, j] = IsUsed(hash, j) ? 0 : -1;
                }
            }

            // Count bits
            _bits = 0;
            for (int i = 0; i < 128; ++i)
            {
                for (int j = 0; j < 128; j++)
                {
                    if (grid[i, j] >= 0)
                    {
                        _bits++;
                    }
                }
            }

            // Build groups
            _groupId = 1;
            for (int i = 0; i < 128; i++)
            {
                for (int j = 0; j < 128; j++)
                {
                    if (grid[i, j] == 0)
                    {
                        BuildGroup(grid, i, j, _groupId++);
                    }
                }
            }
        }
Beispiel #24
0
        public override string Solve(string input, int part)
        {
            KnotHash knotHash = new KnotHash(256);

            switch (part)
            {
            case 1:
                knotHash.InitializeWeak(input);
                return("" + knotHash.hash[0] * knotHash.hash[1]);

            case 2:
                knotHash.InitializeStrong(input);
                return(knotHash.ToHexString());
            }

            return(String.Format("Day 10 part {0} solver not found.", part));
        }
Beispiel #25
0
        public string Run(Aoc.Framework.Part part)
        {
            if (part == Aoc.Framework.Part.Part1)
            {
                byte[]   input = Aoc.Framework.Input.GetIntVector(this, ",").Select(i => (byte)i).ToArray();
                KnotHash hash  = new KnotHash(256, 1);
                hash.Compute(input, false);
                return(hash.GetSimpleHash().ToString());
            }

            if (part == Aoc.Framework.Part.Part2)
            {
                KnotHash hash = new KnotHash(256, 64);
                hash.Compute(Aoc.Framework.Input.GetString(this), true);
                return(hash.GetDenseHash());
            }

            return("");
        }
        public string GenerateAnswer(string input)
        {
            var points = new Point[128, 128];

            for (var i = 0; i < 128; i++)
            {
                var hash          = KnotHash.Generate($"{input}-{i}");
                var pointsForHash = hash
                                    .Select(it => Convert.ToString(Convert.ToByte(it.ToString(), 16), 2))
                                    .Select(it => it.PadLeft(4, '0'))
                                    .SelectMany(it => it)
                                    .Select(it => it == '1' ? new Point() : null)
                                    .ToArray();

                var test = hash.Select(it => Convert.ToString(Convert.ToByte(it.ToString(), 16), 2))
                           .Select(it => it.PadLeft(4, '0'))
                           .SelectMany(it => it);

                var test2 = String.Join(string.Empty, test);
                //var test2 = "a0c2017"

                for (var j = 0; j < pointsForHash.Length; j++)
                {
                    points[i, j] = pointsForHash[j];
                }
            }

            var currentGroups = 0;

            for (var i = 0; i < 128 * 128; i++)
            {
                var x = i / 128;
                var y = i % 128;
                if (points[x, y] != null && points[x, y].Group == null)
                {
                    ++currentGroups;
                    AssignPointToGroup(currentGroups, points, x, y);
                }
            }

            return(currentGroups.ToString());
        }
Beispiel #27
0
        public void ReverseSubsequences()
        {
            KnotHash kh = new KnotHash();

            int[] a = { 0, 1, 2, 3, 4 };
            kh.ReverseSubsequence(a, 0, 3);
            Assert.Equal(new int[] { 2, 1, 0, 3, 4 }, a);

            int[] b = { 2, 1, 0, 3, 4 };
            kh.ReverseSubsequence(b, 3, 4);
            Assert.Equal(new int[] { 4, 3, 0, 1, 2 }, b);

            int[] c = { 4, 3, 0, 1, 2 };
            kh.ReverseSubsequence(c, 3, 1);
            Assert.Equal(new int[] { 4, 3, 0, 1, 2 }, c);

            int[] d = { 4, 3, 0, 1, 2 };
            kh.ReverseSubsequence(d, 1, 5);
            Assert.Equal(new int[] { 3, 4, 2, 1, 0 }, d);
        }
Beispiel #28
0
        private KnotHash Process(int[] hashLengths, int arrayLength, Action <KnotHash> action)
        {
            var array = new int[arrayLength];

            for (int i = 0; i < arrayLength; i++)
            {
                array[i] = i;
            }

            var knotHash = new KnotHash()
            {
                Pos         = 0,
                Skip        = 0,
                Data        = array,
                HashLengths = hashLengths
            };

            action(knotHash);
            return(knotHash);
        }
Beispiel #29
0
        public override string Solve(string input, int part)
        {
            List <KnotHash> knotHashes = new List <KnotHash>();

            for (int i = 0; i < 128; i++)
            {
                KnotHash knotHash = new KnotHash(256);
                knotHash.InitializeStrong(input + "-" + i);
                knotHashes.Add(knotHash);
            }

            switch (part)
            {
            case 1: return("" + GetUsedSquares(knotHashes));

            case 2: return("" + GetRegionCount(knotHashes));
            }

            return(String.Format("Day 14 part {0} solver not found.", part));
        }
Beispiel #30
0
        public void Run()
        {
            var numbers = new int[256];

            for (var i = 0; i < numbers.Length; i++)
            {
                numbers[i] = i;
            }

            const string input    = "129,154,49,198,200,133,97,254,41,6,2,1,255,0,191,108";
            var          lengths  = input.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(i => Convert.ToInt32(i)).ToArray();
            var          knotHash = new KnotHash(new ListReverser());

            var result = knotHash.Calculate(numbers, lengths);

            Console.WriteLine($"Result: {result}");

            var hex = knotHash.Calculate(input);

            Console.WriteLine($"Knot hash: {hex}");
        }