using System.Collections.Generic;
using System.Diagnostics;
public static int MaxLength = 4;
public static int Sum = 15;
public static int MinNumber = 1;
public static int MaxNumber = 9;
public static void Set(int maxLen, int sum, int min, int max)
public Stack<int> Digits = new Stack<int>();
bool lastDigFixed = false;
public int Min = MinNumber, Max = MaxNumber;
public bool Perfect = false;
private void updateStats(int sumChange)
currSum = currSum + sumChange;
int currLen = Digits.Count;
if (currLen == 0) return;
lastDigFixed = MaxLength - currLen == 1;
Perfect = MaxLength == currLen && delta == 0;
var nextNum = Digits.Peek() + 1;
Min = lastDigFixed && delta >= nextNum ? delta : nextNum;
Max = lastDigFixed && delta <= MaxNumber ?
delta : Math.Min(MaxNumber, delta);
public void Push(int num)
public List<string> Answers = new List<string>();
int min = Min, max = Max;
for (var n = min; n <= max; n++)
Answers.Add(string.Join(", ", Digits.Reverse().ToArray()));
public static void Main(string[] args)
AnswerFinder.Set(4, 15, 1, 9);
AnswerFinder.Set(8, 224, 1, 32);
AnswerFinder t = new AnswerFinder();
Stopwatch sw = new Stopwatch();
Console.WriteLine("Done! {0} answers found in {1:n0}ms.",
t.Answers.Count, sw.ElapsedMilliseconds);
Console.WriteLine(string.Join("\n", t.Answers.ToArray()));