Ejemplo n.º 1
0
        private LinkedChar OneRun(LinkedChar input, Dictionary <int, LinkedChar> map)
        {
            var block = input.Next;

            var end = block.Next.Next.Next;

            input.Next = end;

            var        nextCup = input.Cup;
            LinkedChar found   = null;

            do
            {
                nextCup = (nextCup - 1);
                if (nextCup == 0)
                {
                    nextCup = maxCup - 1;
                }

                if (block.Cup != nextCup && block.Next.Cup != nextCup && block.Next.Next.Cup != nextCup)
                {
                    found = map[nextCup];
                }
            } while (found == null);

            block.Next.Next.Next = found.Next;
            found.Next           = block;

            return(input.Next);
        }
Ejemplo n.º 2
0
        public override object GiveAnswer2()
        {
            maxCup = 1000001;
            var map     = new Dictionary <int, LinkedChar>(maxCup - 1);
            var begin   = new LinkedChar();
            var current = begin;

            foreach (var t in _cups)
            {
                current.Cup      = t - '0';
                map[current.Cup] = current;
                current.Next     = new LinkedChar();
                current          = current.Next;
            }

            for (var i = 10; i < maxCup; i++)
            {
                current.Cup      = i;
                map[current.Cup] = current;
                if (i == maxCup - 1)
                {
                    current.Next = begin;
                }
                else
                {
                    current.Next = new LinkedChar();
                    current      = current.Next;
                }
            }

            for (var round = 0; round < 10000000; round++)
            {
                begin = OneRun(begin, map);
            }

            // check consistency
            var  cupOne = map[1];
            long result = cupOne.Next.Cup;

            result *= cupOne.Next.Next.Cup;

            return(result);
        }
Ejemplo n.º 3
0
        public override object GiveAnswer1()
        {
            maxCup = 10;
            var begin   = new LinkedChar();
            var map     = new Dictionary <int, LinkedChar>(maxCup);
            var current = begin;

            for (var i = 0; i < _cups.Length; i++)
            {
                current.Cup      = _cups[i] - '0';
                map[current.Cup] = current;
                current.Next     = new LinkedChar();
                if (i == _cups.Length - 1)
                {
                    current.Next = begin;
                }
                else
                {
                    current = current.Next;
                }
            }

            for (var round = 0; round < _nbRuns; round++)
            {
                begin = OneRun(begin, map);
            }

            var result = string.Empty;

            for (var start = map[1].Next; start.Cup != 1; start = start.Next)
            {
                result += start.Cup.ToString();
            }

            return(result);
        }