fn f8823( s: & str) -> String {
let isop = | c: char | c == 'c' || c == '+' || c == '-' ;
// Sに数字が含まれていなかったり、cと+と-が先頭や最後に出てきたり2文字以上続いたらERRORと出力
if ! s.chars ( ) .any ( | c| '0' <= c && c <= '9' ) { return "E0" .to_string ( ) ; }
if isop( s.chars ( ) .nth ( 0 ) .unwrap ( ) ) { return "E1" .to_string ( ) ; }
if isop( s.chars ( ) .last ( ) .unwrap ( ) ) { return "E2" .to_string ( ) ; }
if s.chars ( ) .collect ::< Vec< _>> ( ) .windows ( 2 ) .any ( | w| isop( w[ 0 ] ) && isop( w[ 1 ] ) ) { return "E3" .to_string ( ) ; }
let mut nums = vec! ( 0 ) ;
for c in s.rsplitn ( 2 , 'c' ) .nth ( 0 ) .unwrap ( ) .chars ( ) {
match c {
'0' ... '9' => { let i = nums.len ( ) - 1 ; nums[ i] = nums[ i] * 10 + c as i32 - '0' as i32} ,
'+' => { nums.push ( - 1 ) ; nums.push ( 0 ) ; } ,
'-' => { nums.push ( - 2 ) ; nums.push ( 0 ) ; } ,
_ => ( )
}
}
// +は左辺に1を足し、-は右辺に1を引く
for i in 0 ..nums .len ( ) {
match nums[ i] {
- 1 => nums[ i - 1 ] += 1 ,
- 2 => nums[ i + 1 ] -= 1 ,
_ => ( )
}
}
//nums.iter().filter(|&n| 0 <= *n).map(|i| i.to_string()).collect::<String>()
//nums.iter().filter(|&n| 0 <= *n).map(|i| i.to_string()).collect::<Vec<_>>().join("")
nums.iter ( ) .filter ( |& n| 0 <= * n) .fold ( String:: new ( ) , | acc, i| acc + & i.to_string ( ) )
}
fn main( ) {
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" ] {
println! ( "{}\t {}" , s, f8823( s) ) ;
}
}
Zm4gZjg4MjMoczogJnN0cikgLT4gU3RyaW5nIHsKICAgIGxldCBpc29wID0gfGM6IGNoYXJ8IGMgPT0gJ2MnIHx8IGMgPT0gJysnIHx8IGMgPT0gJy0nOwogICAgLy8gU+OBq+aVsOWtl+OBjOWQq+OBvuOCjOOBpuOBhOOBquOBi+OBo+OBn+OCiuOAgWPjgagr44GoLeOBjOWFiOmgreOChOacgOW+jOOBq+WHuuOBpuOBjeOBn+OCijLmloflrZfku6XkuIrntprjgYTjgZ/jgolFUlJPUuOBqOWHuuWKmwogICAgaWYgIXMuY2hhcnMoKS5hbnkofGN8ICcwJyA8PSBjICYmIGMgPD0gJzknKSB7cmV0dXJuICJFMCIudG9fc3RyaW5nKCk7fQogICAgaWYgaXNvcChzLmNoYXJzKCkubnRoKDApLnVud3JhcCgpKSB7cmV0dXJuICJFMSIudG9fc3RyaW5nKCk7fQogICAgaWYgaXNvcChzLmNoYXJzKCkubGFzdCgpLnVud3JhcCgpKSB7cmV0dXJuICJFMiIudG9fc3RyaW5nKCk7fQogICAgaWYgcy5jaGFycygpLmNvbGxlY3Q6OjxWZWM8Xz4+KCkud2luZG93cygyKS5hbnkofHd8IGlzb3Aod1swXSkgJiYgaXNvcCh3WzFdKSkge3JldHVybiAiRTMiLnRvX3N0cmluZygpO30KICAgIGxldCBtdXQgbnVtcyA9IHZlYyEoMCk7CiAgICBmb3IgYyBpbiBzLnJzcGxpdG4oMiwgJ2MnKS5udGgoMCkudW53cmFwKCkuY2hhcnMoKSB7CiAgICAgICAgbWF0Y2ggYyB7CiAgICAgICAgICAgICcwJyAuLi4gJzknID0+IHtsZXQgaSA9IG51bXMubGVuKCkgLSAxOyBudW1zW2ldID0gbnVtc1tpXSAqIDEwICsgYyBhcyBpMzIgLSAnMCcgYXMgaTMyfSwKICAgICAgICAgICAgJysnID0+IHtudW1zLnB1c2goLTEpOyBudW1zLnB1c2goMCk7fSwKICAgICAgICAgICAgJy0nID0+IHtudW1zLnB1c2goLTIpOyBudW1zLnB1c2goMCk7fSwKICAgICAgICAgICAgXyA9PiAoKQogICAgICAgIH0KICAgIH0KICAgIC8vICvjga/lt6bovrrjgasx44KS6Laz44GX44CBLeOBr+WPs+i+uuOBqzHjgpLlvJXjgY8KICAgIGZvciBpIGluIDAuLm51bXMubGVuKCkgewogICAgICAgIG1hdGNoIG51bXNbaV0gewogICAgICAgICAgICAtMSA9PiBudW1zW2kgLSAxXSArPSAxLAogICAgICAgICAgICAtMiA9PiBudW1zW2kgKyAxXSAtPSAxLAogICAgICAgICAgICBfID0+ICgpCiAgICAgICAgfQogICAgfQogICAgLy9udW1zLml0ZXIoKS5maWx0ZXIofCZufCAwIDw9ICpuKS5tYXAofGl8IGkudG9fc3RyaW5nKCkpLmNvbGxlY3Q6OjxTdHJpbmc+KCkKICAgIC8vbnVtcy5pdGVyKCkuZmlsdGVyKHwmbnwgMCA8PSAqbikubWFwKHxpfCBpLnRvX3N0cmluZygpKS5jb2xsZWN0Ojo8VmVjPF8+PigpLmpvaW4oIiIpCiAgICBudW1zLml0ZXIoKS5maWx0ZXIofCZufCAwIDw9ICpuKS5mb2xkKFN0cmluZzo6bmV3KCksIHxhY2MsIGl8IGFjYyArICZpLnRvX3N0cmluZygpKQp9CmZuIG1haW4oKSB7CiAgICBmb3IgcyBpbiB2ZWMhWyIiLCAiYyIsICIrIiwgIi0iLCAiYzEiLCAiKzEiLCAiLTEiLCAiMWMiLCAiMSsiLCAiMS0iLCAiMWNjMSIsICIxKysxIiwgIjEtLTEiLCAiMWMrLTEiLCAiMCIsICIxIiwgIjBjMWMyIiwgIjExOSs1IiwgIjExOS01IiwgIjExOWM1IiwgIjErMS0xIiwgIjErMSsxIiwgIjEtMS0xIiwgIjEtMSsxIl0gewogICAgICAgIHByaW50bG4hKCJ7fVx0e30iLCBzLCBmODgyMyhzKSk7CiAgICB9Cn0=