Не могу переписать код на Rust
Есть код на Python:
def read_int():
return map(int, input().split())
def solve(nums):
trainings = []
chest = 0
biceps = 0
back = 0
for i in range(0, len(nums), 3):
trainings.append(nums[i:i + 3])
for training in trainings:
for i in range(len(training)):
if i == 0:
chest += training[i]
elif i == 1:
biceps += training[i]
else:
back += training[i]
if max(chest, biceps, back) == chest:
return "chest"
elif max(chest, biceps, back) == biceps:
return "biceps"
else:
return "back"
def main():
n = int(input())
print(solve(list(read_int())))
main()
Пытаюсь переписать его на Rust:
use std::io;
fn read_vec() -> Vec<i32> {
let mut input = String::new();
io::stdin().read_line(&mut input).unwrap();
input
.trim()
.split_whitespace()
.map(|x| x.parse::<i32>().unwrap())
.collect()
}
fn solve(nums: Vec<i32>) -> String {
let mut trainings = Vec::new();
let mut chest = 0;
let mut biceps = 0;
let mut back = 0;
for i in (0..nums.len()).step_by(3) {
trainings.push(&nums[i..i + 3]);
}
for training in trainings {
for (i, value) in training.iter().enumerate() {
if i == 0 {
chest += *value;
} else if i == 1 {
biceps += *value;
} else {
back += *value;
}
}
}
let max_value = chest.max(biceps).max(back);
if max_value == chest {
return "chest".to_string();
} else if max_value == biceps {
return "biceps".to_string();
} else {
return "back".to_string();
}
}
fn main() {
let mut n = String::new();
io::stdin().read_line(&mut n).expect("msg");
let num: i32 = n.trim().parse().expect("msg");
let nums = read_vec();
let r = solve(nums);
println!("{}", r);
}
Получаю ошибку:
range end index 3 out of range for slice of length 2
при входных данных:
2<br>
2 8
Функция read_vec читает строку и превращает в вектор:
for i in range(0, len(nums), 3):
trainings.append(nums[i:i + 3])
Этот код создаёт массивы по 3 элемента из возможных, например:
3 3 2 7 9 6 8
Будут разделены так:
[[3, 3, 2], [7, 9, 7], [8]]
Здесь проблема в этом участке кода:
for i in (0..nums.len()).step_by(3) {
trainings.push(&nums[i..i + 3]);
}
Если я введу длину вектора, кратную 3, ошибок не будет.
Например:
5 1 10
Но в python это работает так:
for i in range(0, len(nums), 3):
trainings.append(nums[i:i + 3])
Ответы (1 шт):
Автор решения: vessd
→ Ссылка
Если ты хочешь разделить вектор по 3 элемента, то можно использовать метод chunks:
let vec = vec![3, 3, 2, 7, 9, 6, 8];
let mut trainings = Vec::new();
for c in vec.chunks(3) {
trainings.push(c);
}
[[3, 3, 2], [7, 9, 6], [8]]