結果
| 問題 | No.708 (+ー)の式 | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2018-09-28 00:57:33 | 
| 言語 | Rust (1.83.0 + proconio) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 1 ms / 2,000 ms | 
| コード長 | 1,945 bytes | 
| コンパイル時間 | 10,720 ms | 
| コンパイル使用メモリ | 403,816 KB | 
| 実行使用メモリ | 6,820 KB | 
| 最終ジャッジ日時 | 2024-10-12 04:41:35 | 
| 合計ジャッジ時間 | 11,640 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 12 | 
ソースコード
use std::io;
use std::io::prelude::*;
use std::iter;
use std::str;
// expr   ::= term (('+'|'-') term)*
// term   ::= ('+'|'-')? (number | '(' expr ')')
// number ::= \d
fn number(chars: &mut iter::Peekable<str::Chars>) -> i64 {
    let c = chars.next().unwrap();
    c.to_digit(10).unwrap() as i64
}
fn term(chars: &mut iter::Peekable<str::Chars>) -> i64 {
    let mut sign = 1;
    let &c = chars.peek().unwrap();
    match c {
        '+' => { chars.next(); },
        '-' => { chars.next(); sign = -1; },
        _   => {},
    };
    let &c = chars.peek().unwrap();
    let mut res = if c == '(' {
        chars.next();
        let res = expr(chars);
        assert_eq!(')', chars.next().unwrap());
        res
    }
    else {
        number(chars)
    };
    res *= sign;
    res
}
fn expr(chars: &mut iter::Peekable<str::Chars>) -> i64 {
    let mut res = term(chars);
    while let Some(&c) = chars.peek() {
        match c {
            '+' => { chars.next(); res += term(chars); },
            '-' => { chars.next(); res -= term(chars); },
            _   => { break; },
        }
    }
    res
}
fn eval(s: &str) -> i64 {
    let mut chars = s.chars().peekable();
    expr(&mut chars)
}
#[test]
fn test_eval() {
    assert_eq!( 0, eval("0"));
    assert_eq!( 1, eval("1"));
    assert_eq!( 1, eval("+1"));
    assert_eq!(-1, eval("-1"));
    assert_eq!( 3, eval("1+2"));
    assert_eq!( 4, eval("8-4"));
    assert_eq!(-5, eval("-9+4"));
    assert_eq!(-7, eval("-3-4"));
    assert_eq!( 1, eval("(1)"));
    assert_eq!( 5, eval("(2+3)"));
    assert_eq!( 6, eval("(9-3)"));
    assert_eq!( 7, eval("+(4+3)"));
    assert_eq!(-4, eval("-(2+2)"));
    assert_eq!( 1, eval("-(2-3)"));
    assert_eq!(15, eval("-(1+2+3)+(1+2+3+4+5+6)"));
}
fn main() {
    let mut line = String::new();
    io::stdin().read_to_string(&mut line).unwrap();
    let line = line.trim();
    let ans = eval(&line);
    println!("{}", ans);
}
            
            
            
        