Task: | Robotti |
Sender: | villsukka |
Submission time: | 2024-10-29 14:23:21 +0200 |
Language: | Rust (2021) |
Status: | READY |
Result: | 100 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 30 |
#2 | ACCEPTED | 70 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | ACCEPTED | 0.00 s | 1, 2 | details |
#2 | ACCEPTED | 0.00 s | 1, 2 | details |
#3 | ACCEPTED | 0.00 s | 1, 2 | details |
#4 | ACCEPTED | 0.00 s | 1, 2 | details |
#5 | ACCEPTED | 0.00 s | 1, 2 | details |
#6 | ACCEPTED | 0.00 s | 1, 2 | details |
#7 | ACCEPTED | 0.00 s | 1, 2 | details |
#8 | ACCEPTED | 0.00 s | 1, 2 | details |
#9 | ACCEPTED | 0.00 s | 1, 2 | details |
#10 | ACCEPTED | 0.00 s | 1, 2 | details |
#11 | ACCEPTED | 0.00 s | 1, 2 | details |
#12 | ACCEPTED | 0.00 s | 2 | details |
#13 | ACCEPTED | 0.00 s | 2 | details |
#14 | ACCEPTED | 0.00 s | 2 | details |
#15 | ACCEPTED | 0.00 s | 2 | details |
#16 | ACCEPTED | 0.00 s | 2 | details |
#17 | ACCEPTED | 0.00 s | 2 | details |
#18 | ACCEPTED | 0.01 s | 2 | details |
#19 | ACCEPTED | 0.01 s | 2 | details |
#20 | ACCEPTED | 0.00 s | 2 | details |
#21 | ACCEPTED | 0.01 s | 2 | details |
#22 | ACCEPTED | 0.01 s | 2 | details |
#23 | ACCEPTED | 0.01 s | 2 | details |
#24 | ACCEPTED | 0.00 s | 2 | details |
Code
#[cfg(test)] mod tests; use std::{io::stdin, ops::Add}; #[derive(Clone, Copy, Debug, PartialEq, Eq)] enum RoomType { Robot, Coin, Empty, } #[derive(Debug, Clone, Copy)] enum Ordering { Less, Greater, Equal, BothInvalid, } #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] enum Direction { Left, Right, } struct Pointer { pos: usize, max_len: usize, direction: Direction, } impl Pointer { ///True Means Incremented fn try_increment(&mut self) -> bool { let num = match self.direction { Direction::Left => self.pos.checked_sub(1), Direction::Right => { if self.pos + 1 <= self.max_len { Some(self.pos.add(1)) } else { None } } }; match num { Some(x) => { self.pos = x; true } None => false, } } fn cmp_with_start(&self, other: &Self, start_pos: usize) -> Ordering { let dist_to_self = self.dist_from_start(start_pos); let dist_to_other = other.dist_from_start(start_pos); match (self.is_edged(), other.is_edged()) { (true, true) => Ordering::BothInvalid, (true, false) => Ordering::Greater, (false, true) => Ordering::Less, (false, false) => match dist_to_self.cmp(&dist_to_other) { std::cmp::Ordering::Less => Ordering::Less, std::cmp::Ordering::Equal => Ordering::Equal, std::cmp::Ordering::Greater => Ordering::Greater, }, } //Add comparison which fails or sum when is edged } fn dist_from_start(&self, start_pos: usize) -> usize { match self.direction { Direction::Left => start_pos - self.pos, Direction::Right => self.pos - start_pos, } } fn is_edged(&self) -> bool { match self.direction { Direction::Left => self.pos <= 0, Direction::Right => self.pos >= self.max_len, } } } impl From<char> for RoomType { fn from(value: char) -> Self { match value { 'R' => RoomType::Robot, '*' => RoomType::Coin, '.' => RoomType::Empty, _ => panic!(), } } } fn main() { let mut line = String::new(); stdin().read_line(&mut line).unwrap(); let len: usize = line.strip_suffix('\n').unwrap_or(&line).parse().unwrap(); line = "".to_string(); stdin().read_line(&mut line).unwrap(); let (steps, coins) = do_challenge(line, len); println!("{} {}", steps, coins) } fn do_challenge(line: String, len: usize) -> (usize, i32) { let mut arr: Vec<RoomType> = line .strip_suffix('\n') .unwrap() .chars() .map(|c| c.into()) .collect(); let mut robot_pos = arr .iter() .position(|x| *x == RoomType::Robot) .expect("No robot"); let mut coin_count = 0; let mut steps = 0; let mut lp = Pointer { pos: robot_pos, max_len: len - 1, direction: Direction::Left, }; let mut rp = Pointer { direction: Direction::Right, ..lp }; loop { match lp.cmp_with_start(&rp, robot_pos) { Ordering::Less => { lp.try_increment(); } Ordering::Greater => { rp.try_increment(); } Ordering::Equal => { lp.try_increment(); rp.try_increment(); } Ordering::BothInvalid => break, } match (arr[lp.pos] == RoomType::Coin, arr[rp.pos] == RoomType::Coin) { (true, true) => break, (true, false) => { steps += lp.dist_from_start(robot_pos); robot_pos = lp.pos; coin_count += 1; arr[lp.pos] = RoomType::Empty; } (false, true) => { steps += rp.dist_from_start(robot_pos); robot_pos = rp.pos; coin_count += 1; arr[rp.pos] = RoomType::Empty; } (false, false) => continue, } } (steps, coin_count) }
Test details
Test 1
Group: 1, 2
Verdict: ACCEPTED
input |
---|
1 R |
correct output |
---|
0 0 |
user output |
---|
0 0 |
Test 2
Group: 1, 2
Verdict: ACCEPTED
input |
---|
10 ...R...... |
correct output |
---|
0 0 |
user output |
---|
0 0 |
Test 3
Group: 1, 2
Verdict: ACCEPTED
input |
---|
10 **.R...*** |
correct output |
---|
12 5 |
user output |
---|
12 5 |
Test 4
Group: 1, 2
Verdict: ACCEPTED
input |
---|
10 ***R****** |
correct output |
---|
0 0 |
user output |
---|
0 0 |
Test 5
Group: 1, 2
Verdict: ACCEPTED
input |
---|
1000 R................................ |
correct output |
---|
947 9 |
user output |
---|
947 9 |
Test 6
Group: 1, 2
Verdict: ACCEPTED
input |
---|
1000 ................................. |
correct output |
---|
886 9 |
user output |
---|
886 9 |
Test 7
Group: 1, 2
Verdict: ACCEPTED
input |
---|
1000 .....*..*....**..**..*......*.... |
correct output |
---|
1287 400 |
user output |
---|
1287 400 |
Test 8
Group: 1, 2
Verdict: ACCEPTED
input |
---|
1000 ************.*****************... |
correct output |
---|
0 0 |
user output |
---|
0 0 |
Test 9
Group: 1, 2
Verdict: ACCEPTED
input |
---|
1000 ******************************... |
correct output |
---|
0 0 |
user output |
---|
0 0 |
Test 10
Group: 1, 2
Verdict: ACCEPTED
input |
---|
1000 R*****************************... |
correct output |
---|
999 999 |
user output |
---|
999 999 |
Test 11
Group: 1, 2
Verdict: ACCEPTED
input |
---|
1000 ******************************... |
correct output |
---|
999 999 |
user output |
---|
999 999 |
Test 12
Group: 2
Verdict: ACCEPTED
input |
---|
10000 .......**........*...........*... |
correct output |
---|
10971 999 |
user output |
---|
10971 999 |
Test 13
Group: 2
Verdict: ACCEPTED
input |
---|
10000 *..*....*......*.....*..*........ |
correct output |
---|
9999 999 |
user output |
---|
9999 999 |
Test 14
Group: 2
Verdict: ACCEPTED
input |
---|
10000 *.*.*...**.*...*....**.**.**..... |
correct output |
---|
18766 5000 |
user output |
---|
18766 5000 |
Test 15
Group: 2
Verdict: ACCEPTED
input |
---|
10000 R*****************************... |
correct output |
---|
9999 9999 |
user output |
---|
9999 9999 |
Test 16
Group: 2
Verdict: ACCEPTED
input |
---|
10000 ******************************... |
correct output |
---|
9999 9999 |
user output |
---|
9999 9999 |
Test 17
Group: 2
Verdict: ACCEPTED
input |
---|
200000 ................................. |
correct output |
---|
0 0 |
user output |
---|
0 0 |
Test 18
Group: 2
Verdict: ACCEPTED
input |
---|
200000 ................................. |
correct output |
---|
299934 10000 |
user output |
---|
299934 10000 |
Test 19
Group: 2
Verdict: ACCEPTED
input |
---|
200000 **.***....**..**.....***.*..*.... |
correct output |
---|
299998 100000 |
user output |
---|
299998 100000 |
Test 20
Group: 2
Verdict: ACCEPTED
input |
---|
200000 ******************************... |
correct output |
---|
0 0 |
user output |
---|
0 0 |
Test 21
Group: 2
Verdict: ACCEPTED
input |
---|
200000 R................................ |
correct output |
---|
133765 3 |
user output |
---|
133765 3 |
Test 22
Group: 2
Verdict: ACCEPTED
input |
---|
200000 R................................ |
correct output |
---|
199982 5000 |
user output |
---|
199982 5000 |
Test 23
Group: 2
Verdict: ACCEPTED
input |
---|
200000 R*****************************... |
correct output |
---|
199999 199999 |
user output |
---|
199999 199999 |
Test 24
Group: 2
Verdict: ACCEPTED
input |
---|
200000 ******************************... |
correct output |
---|
199999 199999 |
user output |
---|
199999 199999 |