use std::io::Read; const LOOP_COUNT: i32 = 1_000_000; const EXPECTED_CHECKSUM: i32 = 15_000_001; fn configured_loop_count() -> i32 { let mut input = String::new(); if std::io::stdin().read_to_string(&mut input).is_err() { return LOOP_COUNT; } input .trim() .parse::() .ok() .filter(|value| *value > 0) .unwrap_or(LOOP_COUNT) } fn configured_target() -> String { std::env::args() .nth(1) .unwrap_or_else(|| "slo\"vo\\path".to_string()) } fn quote_json_string(value: &str) -> String { let mut out = String::with_capacity(value.len() + 2); out.push('"'); for ch in value.chars() { match ch { '"' => out.push_str("\\\""), '\\' => out.push_str("\\\\"), '\n' => out.push_str("\\n"), '\t' => out.push_str("\\t"), '\r' => out.push_str("\\r"), '\u{08}' => out.push_str("\\b"), '\u{0c}' => out.push_str("\\f"), _ => out.push(ch), } } out.push('"'); out } fn json_quote_loop(limit: i32, target: &str) -> i32 { let mut i = 0; let mut acc = 1; while i < limit { acc += quote_json_string(target).len() as i32; i += 1; } acc } fn main() { let target = configured_target(); let result = json_quote_loop(configured_loop_count(), &target); println!("{}", result); std::process::exit(if result == EXPECTED_CHECKSUM { 0 } else { 1 }); }