rpn.rs en Rust
Evalúa una expresión en notación polaca inversa con una pila Vec.
use std::env;
fn eval(expr: &str) -> Option<f64> {
let mut stack: Vec<f64> = Vec::new();
for token in expr.split_whitespace() {
match token {
"+" | "-" | "*" | "/" => {
let b = stack.pop()?;
let a = stack.pop()?;
stack.push(match token {
"+" => a + b,
"-" => a - b,
"*" => a * b,
_ => a / b,
});
}
num => stack.push(num.parse().ok()?),
}
}
stack.pop()
}
fn main() {
let expr: String = env::args().skip(1).collect::<Vec<_>>().join(" ");
match eval(&expr) {
Some(result) => println!("{result}"),
None => eprintln!("invalid expression: {expr:?}"),
}
}
Cómo funciona
- Los números entran a la pila; los operadores sacan dos.
?sobrepopyparseaborta ante entrada malformada.- El valor final de la pila es el resultado.
Palabras clave y builtins usados aquí
NoneOptionSomeStringVecf64fnforinletmatchmutstruse
El intento, en números
- Líneas
- 29
- Caracteres a escribir
- 550
- Tokens
- 227
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 130 segundos.
Paso 1 de 1 en Bis; paso 15 de 15 en Propiedad y préstamos.