Как я могу имитировать пользовательский ввод с консоли?

Я делаю некоторые проблемы в HackerRank. Я обычно использую windows Form Проект в Visualstudio, чтобы сделать отладку, но понимаю, что я потерял много времени ввода тестовых случаев. Поэтому я хочу предложить способ, которым я могу легко смоделировать console.ReadLine()

Обычно проблемы описывают случаи примерно так:

5
1 2 1 3 2 
3 2

А затем читается как: используя три ReadLine

static void Main(String[] args) {
    int n = Convert.ToInt32(Console.ReadLine());
    string[] squares_temp = Console.ReadLine().Split(' ');
    int[] squares = Array.ConvertAll(squares_temp,Int32.Parse);
    string[] tokens_d = Console.ReadLine().Split(' ');
    int d = Convert.ToInt32(tokens_d[0]);
    int m = Convert.ToInt32(tokens_d[1]);
    // your code goes here
}

Прямо сейчас я думал в создании файла testCase.txt и использовать StreamReader.

using (StreamReader sr = new StreamReader("testCase.txt")) 
{
    string line;
    // Read and display lines from the file until the end of 
    // the file is reached.
    while ((line = sr.ReadLine()) != null) 
    {
        Console.WriteLine(line);
    }
}

Таким образом, я могу заменить Console.ReadLine() с sr.ReadLine(), но для этого нужно открыть текстовый редактор, удалить старый регистр, скопировать новый и каждый раз сохранять файл.

Так есть ли способ, которым я могу использовать Textbox, так что нужно только копировать / вставить в текстовое поле и использовать streamReader или что-то похожее для чтения из текстового поля?

3 ответа

Решение

Вы можете использовать класс StringReader для чтения из string а не файл.

Решение , которое вы приняли! на самом деле не эмулирует Console.ReadLine(), поэтому вы не можете вставить его напрямую в HackerRank.

Я решил это так:

.

.

Просто вставьте этот класс над статическим методом Main или в любое место внутри основного класса, чтобы скрыть исходный System.Console

        class Console
        {
            public static Queue<string> TestData = new Queue<string>();
            public static void SetTestData(string testData)
            {
                TestData = new Queue<string>(testData.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select(x=>x.TrimStart()));
            }
            public static void SetTestDataFromFile(string path)
            {
                TestData = new Queue<string>(File.ReadAllLines(path));
            }
            public static string ReadLine()
            {
                return TestData.Dequeue();
            }
            public static void WriteLine(object value = null)
            {
                System.Console.WriteLine(value);
            }
            public static void Write(object value = null)
            {
                System.Console.WriteLine(value);
            }
        }

и используйте его таким образом.

    //Paste the Console class here.
    static void HackersRankProblem(String[] args)
    {
        Console.SetTestData(@"
            6
            6 12 8 10 20 16
        ");


        int n = int.Parse(Console.ReadLine());
        string arrStr = Console.ReadLine();
        .
        .
        .
    }

Теперь ваш код будет выглядеть так же! и вы можете протестировать столько данных, сколько захотите, не меняя код.

Примечание. Если вам нужно больше сложных методов Write или WriteLine, просто добавьте их и отправьте в исходный System.Console(..args)

Просто установите аргументы приложения: <input.txt

и укажите в input.txt свой вводимый текст.

Будьте осторожны, чтобы сохранить файл с кодировкой ANSI.

Другие вопросы по тегам