Приключения в Ржавчине
→ Ввод в Hackerrank
Это будет описание моих попыток решить проблемы с хакерранком с помощью ржавчины.
Перво-наперво, как читать входные данные?
И следующее может быть плохой практикой, но до сих пор это работало для меня.
Я использовал функцию read_to_string()
.
И это работает для меня. Это дает мне строку с escape-последовательностями, которую я могу преобразовать в вектор. И если я могу получить вектор, я могу получить все. В стандартной библиотеке достаточно ресурсов для работы с вектором, чтобы держать меня в страхе.
Первая проблема, с которой я столкнулся, отвечая на вопросы о соревновательном программировании на hackerrank, заключалась в том, что я застрял в том, какой самый ленивый и самый простой способ чтения ввода. Тогда я подумал, как проще всего это сделать на любом языке.
После долгих размышлений я понял, что чтение полного ввода, поскольку список строк может упростить задачу. Итак, мне нужен вектор входных данных, как мне этого добиться?
Принимать ввод как строку с \n
в качестве разделителя, а read_to_string
было самым простым способом получить строку с \n
.
Например :
Допустим, мне нужно взять ввод таким образом, чтобы первый элемент имел тестовый пример, а остальные были повторениями одного и того же набора вещей, но для разных случаев.
Самый простой способ - разделить проблему как проблему ввода-вывода;
Входные данные: содержит тестовый пример, количество элементов в каждом тестовом примере, элементы.
Выходные данные: элементы в возрастающем порядке сортировки.
INPUT 2 // test cases5
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();