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; } }
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()); }