// factory construct method
        public static ExerciseProblem GetExerciseProblem(string FilePath)
        {
            // input from file
            string[] Texts = null;
            try
            {
                Texts = System.IO.File.ReadAllLines(FilePath);
            }
            catch (System.Exception FileException)
            {
                System.Console.WriteLine(FileException.Message);
                return(null);
            }

            if (null == Texts || Texts.Length <= 0)
            {
                return(null);
            }

            // locate data
            int NameIndex        = ReadTextProblem.GetIdentifierIndex(Texts, NameIdentifier);
            int DescriptionIndex = ReadTextProblem.GetIdentifierIndex(Texts, DescriptionIdentifier);
            int CountsIndex      = ReadTextProblem.GetIdentifierIndex(Texts, CountsIdentifier);
            int InputIndex       = ReadTextProblem.GetIdentifierIndex(Texts, InputIdentifier);
            int OutputIndex      = ReadTextProblem.GetIdentifierIndex(Texts, OutputIdentifier);

            if (NameIndex == -1 ||
                DescriptionIndex == -1 ||
                CountsIndex == -1 ||
                InputIndex == -1 ||
                OutputIndex == -1)
            {
                return(null);
            }

            // read input from postitions
            string        Name        = ReadTextProblem.ReadText(Texts, NameIndex, DescriptionIndex - 1);
            string        Description = ReadTextProblem.ReadText(Texts, DescriptionIndex, CountsIndex - 1);
            int           Counts      = ReadTextProblem.ReadCounts(Texts, CountsIndex);
            List <string> TestInputs  = ReadTextProblem.ReadTestData(Texts, InputIndex, InputIndex + Counts);
            List <string> TestOutputs = ReadTextProblem.ReadTestData(Texts, OutputIndex, OutputIndex + Counts);

            if (TestInputs == null ||
                TestOutputs == null ||
                Counts < 1)
            {
                return(null);
            }

            // build an ExerciseProblem
            ExerciseProblem problem = new ExerciseProblem(Name, Description, TestInputs, TestOutputs);

            return(problem);
        }
        // constructors

        // constructor: construct with a ExerciseProblem
        public ExerciseSingle(ExerciseProblem problem) :
            base(problem.Name)
        {
            this.Problem = (ExerciseProblem)problem.Clone();
        }