結果

問題 No.539 インクリメント
ユーザー gyu-dongyu-don
提出日時 2017-07-23 21:56:13
言語 Rust
(1.77.0 + proconio)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,934 bytes
コンパイル時間 12,297 ms
コンパイル使用メモリ 381,312 KB
最終ジャッジ日時 2024-11-14 20:10:01
合計ジャッジ時間 13,711 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
error[E0782]: trait objects must include the `dyn` keyword
 --> src/main.rs:5:26
  |
5 | fn f() -> Result<(), Box<Error>> {
  |                          ^^^^^
  |
help: add `dyn` keyword before this trait
  |
5 | fn f() -> Result<(), Box<dyn Error>> {
  |                          +++

For more information about this error, try `rustc --explain E0782`.
error: could not compile `main` (bin "main") due to 1 previous error

ソースコード

diff #

use std::error::Error;
use std::io::{stdin};
use std::iter::FromIterator;

fn f() -> Result<(), Box<Error>> {
    let mut s = String::new();
    stdin().read_line(&mut s)?;
    let n: u32 = s.trim().parse()?;

    for _ in 0..n {
        let mut s = String::new();
        stdin().read_line(&mut s)?;
        let s = s.trim();
        println!("{}", g(s));
    }
    Ok(())
}

fn g(s: &str) -> String {
    let b = s.as_bytes();
    let mut num_end = (b.len() - 1) as isize;
    while num_end >= 0 {
        if '0' as u8 <= b[num_end as usize] && b[num_end as usize] <= '9' as u8 {
            break;
        }
        num_end -= 1;
    }
    if num_end < 0 {
        return s.to_owned();
    }
    // b[num_end] is number.

    let mut num_unmodified = num_end - 1;
    let num_end = num_end as usize;

    let mut num_buf = vec![];
    if b[num_end] == '9' as u8 {
        num_buf.push('0' as u8);
        loop {
            match b[num_unmodified as usize] {
                x if x == '9' as u8 => {
                    num_buf.push('0' as u8);
                    num_unmodified -= 1;
                },
                x if '0' as u8 <= x && x <= '8' as u8 => {
                    num_buf.push(x + 1);
                    num_unmodified -= 1;
                    break;
                }
                _ => {
                    num_buf.push('1' as u8);
                    break;
                }
            }
            if num_unmodified < 0 {
                num_buf.push('1' as u8);
                break;
            }
        }
    }
    else {
        num_buf.push(b[num_end] + 1);
    }
    let mut v = if num_unmodified >= 0 { Vec::from_iter(b[..num_unmodified as usize + 1].iter().cloned()) } else { Vec::new() };
    v.extend(num_buf.into_iter().rev());
    if num_end < b.len() - 1 {
        v.extend(b[num_end + 1..].iter().cloned());
    }
    String::from_utf8(v).unwrap()
}

fn main() {
    f().unwrap();
}
0