public void Start(string[] args)
        {
            isSolving = true;
            string puzzleInput;

            while (isSolving)
            {
                Console.WriteLine("Enter Puzzle day and part: day,part");
                puzzleInput = Console.ReadLine();

                if (puzzleInput.StartsWith('q'))
                {
                    isSolving = false;
                    continue;
                }

                if (!GetDayAndPart(puzzleInput, out day, out part))
                {
                    Console.WriteLine("Invalid input..");
                    continue;
                }

                puzzleToSolve = puzzleFactory.GetPuzzle(day, part);

                if (puzzleToSolve != null)
                {
                    Console.WriteLine("Solution: " + puzzleToSolve.GetSolution());
                }
                else
                {
                    Console.WriteLine("Puzzle not found..");
                }
            }
        }
        public PuzzleBase GetPuzzle(int day, int part)
        {
            Type puzzleType = GetPuzzleType(day, part);

            if (puzzleType == null || puzzleType.GetTypeInfo().IsAbstract)
            {
                return(null);
            }

            if (puzzlesCacheDictionary.ContainsKey(puzzleType))
            {
                return(puzzlesCacheDictionary[puzzleType]);
            }

            PuzzleBase puzzle = (PuzzleBase)Activator.CreateInstance(puzzleType);

            puzzlesCacheDictionary.Add(puzzleType, puzzle);

            puzzle.Initialize();

            return(puzzle);
        }