// Generates a line of the puzzle based on the number of digits of the right / left side
		LineOfNumbers CreateNumbers (Operation operation, int digits)
		{
			LineOfNumbers line = new LineOfNumbers ();

			line.right = new int [digits];
			line.left = new int [digits];
			int max_number, added;

			switch (operation) {
			case Operation.AddHalf:
				max_number = 32;
				break;
			case Operation.Add:
				max_number = 10;
				break;
			case Operation.AddDouble:
				max_number = 16;
				break;
			default:
				throw new InvalidOperationException ("Invalid value");
			}

			while (true)
			{
				int right, left;

				right = left = 0;

				// Generate random numbers
				for (int i = 0; i < digits; i++)
				{
					line.right[i] = 1 + random.Next (max_number);
					line.left[i] = 1 + random.Next (max_number);

					right += line.right [i];
					left += line.left [i];
				}

				added = right + left;

				if (operation == Operation.Add)
				{
					if (added > 31 || added < 3)
						continue;
				}

				if (operation == Operation.AddHalf)
				{
					if (added % 2 != 0)
						continue;

					added = added / 2;

					if (added > 64)
						continue;
				}

				if (operation == Operation.AddDouble)
				{
					added = added * 2;
					if (added > 99 || added < 3)
						continue;
				}

				line.middle = added;

				bool found = false;
				// Check if the middle has been already repeated
				foreach (LineOfNumbers prev in lines)
				{
					if (prev.Middle == line.Middle)
					{
						found = true;
						break;
					}
				}

				if (found == false)
					break;
			}
			return line;
		}
        // Generates a line of the puzzle based on the number of digits of the right / left side
        LineOfNumbers CreateNumbers(Operation operation, int digits)
        {
            LineOfNumbers line = new LineOfNumbers ();

            line.right = new int [digits];
            line.left = new int [digits];
            int max_number, added;

            switch (operation) {
            case Operation.AddHalf:
                max_number = 32;
                break;
            case Operation.Add:
                max_number = 10;
                break;
            case Operation.AddDouble:
                max_number = 16;
                break;
            default:
                throw new InvalidOperationException ("Invalid value");
            }

            while (true)
            {
                int right, left;

                right = left = 0;

                // Generate random numbers
                for (int i = 0; i < digits; i++)
                {
                    line.right[i] = 1 + random.Next (max_number);
                    line.left[i] = 1 + random.Next (max_number);

                    right += line.right [i];
                    left += line.left [i];
                }

                added = right + left;

                if (operation == Operation.Add)
                {
                    if (added > 31 || added < 3)
                        continue;
                }

                if (operation == Operation.AddHalf)
                {
                    if (added % 2 != 0)
                        continue;

                    added = added / 2;

                    if (added > 64)
                        continue;
                }

                if (operation == Operation.AddDouble)
                {
                    added = added * 2;
                    if (added > 99 || added < 3)
                        continue;
                }

                line.middle = added;

                bool found = false;
                // Check if the middle has been already repeated
                foreach (LineOfNumbers prev in lines)
                {
                    if (prev.Middle == line.Middle)
                    {
                        found = true;
                        break;
                    }
                }

                if (found == false)
                    break;
            }
            return line;
        }