| 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 |
