Rust Basic

#![allow(unused)]

fn main() {
}

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s);
    s.trim().parse().ok().unwrap()
}

fn readv<T: std::str::FromStr>() -> Vec<T> {
    read::<String>()
        .split_ascii_whitespace()
        .map(|t| t.parse().ok().unwrap())
        .collect()
}

fn reads() -> Vec<char> {
    read::<String>().chars().collect()
}

fn mapv<T, S, F: Fn(&T) -> S>(arr: &Vec<T>, f: F) -> Vec<S> {
    arr.iter().map(f).collect()
}

fn join<T: ToString>(arr: &[T], sep: &str) -> String {
    arr.iter()
        .map(|x| x.to_string())
        .collect::<Vec<String>>()
        .join(sep)
}

Inspect 4 Neighbors

for (dr, dc) in [(1, 0), (!0, 0), (0, 1), (0, !0)] {
    let nr = r.wrapping_add(dr);
    let nc = c.wrapping_add(dc);
    if nr >= n || nc >= m {
        continue;
    }
}

or

for (dr, dc) in [(0, 1), (0, -1), (1, 0), (-1, 0)] {
    let nr = r.checked_add_signed(dr).unwrap_or(n);
    let nc = c.checked_add_signed(dc).unwrap_or(m);
    if nr >= n || nc >= m {
        continue;
    }
}

IO Flush

use std::io::Write;
std::io::stdout().flush();

String Conversion

// String to int
"100".parse::<i32>().unwrap();
// char to u32
'c'.to_digit(10); // or 'c' as u32
// u32 to char
char::from_u32(97).unwrap(); // 'A'
char::from_digit(8, 10).unwrap();

Cargo.toml

cargo add proconio
[package]
name = "ac"
version = "0.1.0"
edition = "2021"
default-run = "main"

[dependencies]
proconio = { version = "0.4.5", features = ["derive"] }

[[bin]]
name = "main"
path = "src/main.rs"

[[bin]]
name = "ans"
path = "src/ans.rs"

Comparing Outputs

diff <(cargo run < inp.txt) <(cargo run --bin ans < inp.txt)