fork download
  1. fn f8823(s: &str) -> String {
  2. let isop = |c: char| c == 'c' || c == '+' || c == '-';
  3. // Sに数字が含まれていなかったり、cと+と-が先頭や最後に出てきたり2文字以上続いたらERRORと出力
  4. if !s.chars().any(|c| '0' <= c && c <= '9') {return "E0".to_string();}
  5. if isop(s.chars().nth(0).unwrap()) {return "E1".to_string();}
  6. if isop(s.chars().last().unwrap()) {return "E2".to_string();}
  7. if s.chars().collect::<Vec<_>>().windows(2).any(|w| isop(w[0]) && isop(w[1])) {return "E3".to_string();}
  8. let mut nums = vec!(0);
  9. for c in s.rsplitn(2, 'c').nth(0).unwrap().chars() {
  10. match c {
  11. '0' ... '9' => {let i = nums.len() - 1; nums[i] = nums[i] * 10 + c as i32 - '0' as i32},
  12. '+' => {nums.push(-1); nums.push(0);},
  13. '-' => {nums.push(-2); nums.push(0);},
  14. _ => ()
  15. }
  16. }
  17. // +は左辺に1を足し、-は右辺に1を引く
  18. for i in 0..nums.len() {
  19. match nums[i] {
  20. -1 => nums[i - 1] += 1,
  21. -2 => nums[i + 1] -= 1,
  22. _ => ()
  23. }
  24. }
  25. //nums.iter().filter(|&n| 0 <= *n).map(|i| i.to_string()).collect::<String>()
  26. //nums.iter().filter(|&n| 0 <= *n).map(|i| i.to_string()).collect::<Vec<_>>().join("")
  27. nums.iter().filter(|&n| 0 <= *n).fold(String::new(), |acc, i| acc + &i.to_string())
  28. }
  29. fn main() {
  30. for s in vec!["", "c", "+", "-", "c1", "+1", "-1", "1c", "1+", "1-", "1cc1", "1++1", "1--1", "1c+-1", "0", "1", "0c1c2", "119+5", "119-5", "119c5", "1+1-1", "1+1+1", "1-1-1", "1-1+1"] {
  31. println!("{}\t{}", s, f8823(s));
  32. }
  33. }
Success #stdin #stdout 0s 11080KB
stdin
Standard input is empty
stdout
	E0
c	E0
+	E0
-	E0
c1	E1
+1	E1
-1	E1
1c	E2
1+	E2
1-	E2
1cc1	E3
1++1	E3
1--1	E3
1c+-1	E3
0	0
1	1
0c1c2	2
119+5	1205
119-5	1194
119c5	5
1+1-1	210
1+1+1	221
1-1-1	100
1-1+1	111