Example #1
0
            public SpiralLayer(SpiralLayer priorLayer)
            {
                this.Level  = priorLayer.Level + 1;
                this.points = new List <SpiralPoint>();

                var currentX      = this.Level;
                var currentY      = -this.Level + 1;
                var previousValue = 0;

                while (currentY <= this.Level)
                {
                    var pointValue = priorLayer.GetSumOfPointsNextTo(currentX, currentY) + previousValue;
                    previousValue = pointValue;
                    this.points.Add(new SpiralPoint(pointValue, currentX, currentY));
                    ++currentY;
                }

                previousValue += this.points[this.points.Count - 2].Value;
                --currentY;
                --currentX;

                while (currentX >= -this.Level)
                {
                    var pointValue = priorLayer.GetSumOfPointsNextTo(currentX, currentY) + previousValue;
                    previousValue = pointValue;
                    this.points.Add(new SpiralPoint(pointValue, currentX, currentY));
                    --currentX;
                }

                previousValue += this.points[this.points.Count - 2].Value;
                ++currentX;
                --currentY;

                while (currentY >= -this.Level)
                {
                    var pointValue = priorLayer.GetSumOfPointsNextTo(currentX, currentY) + previousValue;
                    previousValue = pointValue;
                    this.points.Add(new SpiralPoint(pointValue, currentX, currentY));
                    --currentY;
                }

                previousValue += this.points[this.points.Count - 2].Value;
                ++currentY;
                ++currentX;

                while (currentX <= this.Level)
                {
                    var pointValue = priorLayer.GetSumOfPointsNextTo(currentX, currentY) + previousValue;
                    if (this.points[0].IsNextTo(currentX, currentY))
                    {
                        pointValue += this.points[0].Value;
                    }

                    previousValue = pointValue;
                    this.points.Add(new SpiralPoint(pointValue, currentX, currentY));
                    ++currentX;
                }
            }
Example #2
0
        public string GenerateAnswer(string input)
        {
            var value = Convert.ToInt32(input);

            var currentLevel = SpiralLayer.Initial;

            while (currentLevel.Values.Last() <= value)
            {
                currentLevel = new SpiralLayer(currentLevel);
            }

            return(currentLevel.Values.Where(it => it > value).Min().ToString());
        }