Приключения в Ржавчине

→ Ввод в Hackerrank

Это будет описание моих попыток решить проблемы с хакерранком с помощью ржавчины.

Перво-наперво, как читать входные данные?

И следующее может быть плохой практикой, но до сих пор это работало для меня.

Я использовал функцию read_to_string().

И это работает для меня. Это дает мне строку с escape-последовательностями, которую я могу преобразовать в вектор. И если я могу получить вектор, я могу получить все. В стандартной библиотеке достаточно ресурсов для работы с вектором, чтобы держать меня в страхе.

Первая проблема, с которой я столкнулся, отвечая на вопросы о соревновательном программировании на hackerrank, заключалась в том, что я застрял в том, какой самый ленивый и самый простой способ чтения ввода. Тогда я подумал, как проще всего это сделать на любом языке.

После долгих размышлений я понял, что чтение полного ввода, поскольку список строк может упростить задачу. Итак, мне нужен вектор входных данных, как мне этого добиться?

Принимать ввод как строку с \n в качестве разделителя, а read_to_string было самым простым способом получить строку с \n .

Например :

Допустим, мне нужно взять ввод таким образом, чтобы первый элемент имел тестовый пример, а остальные были повторениями одного и того же набора вещей, но для разных случаев.

Самый простой способ - разделить проблему как проблему ввода-вывода;

Входные данные: содержит тестовый пример, количество элементов в каждом тестовом примере, элементы.

Выходные данные: элементы в возрастающем порядке сортировки.

INPUT
2 // test cases
5 
7 3 2 1 9 // first test case
4
0 -6 5 3 1 // second test case

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -

OUTPUT
1 2 3 7 9 
-6 0 1 3 5

Таким образом, достижение этого формата становится простым, если я использую read_to_string() следующим образом для ввода

use std::io::{self, Read};
let mut reader = io::stdin();
let mut buffer = String::new();
reader.read_to_string(&mut buffer);

это связывает переменную buffer, чтобы она содержала изменяемую ссылку на ввод, как показано ниже

"2\n5\n7 3 2 1 9\n4\n0 -6 5 3 1"

Теперь, если я использую это

let mut input = buffer.split("\n").collect::<Vec<_>>();

Я получаю переменную input как [“2”, “5”, “7 3 2 1 9”, “4”, “0 -6 5 3 1”]

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

Поэтому, придумав этот импровизированный способ, я подумал, что было бы полезно поделиться им. Если есть лучший способ (кроме использования text_io), поделитесь им.

И укажите на мои ошибки. (без сарказма)

использованная литература

Управление векторами в Rust -› https://doc.rust-lang.org/stable/std/vec/

IO в Rust -› https://doc.rust-lang.org/stable/std/io/trait.Read.html#method.read_to_string

Доступ к n-м элементам вектора с помощью итератора -> https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html#method.nth

Преобразование строки в вектор -> https://stackoverflow.com/questions/26536871/convert-a-string-of-numbers-to-an-array-vector-of-ints-in-rust

TL;DR (для String -> [Int])

let number = word.parse::<isize>().unwrap();