結果

問題 No.24 数当てゲーム
ユーザー yo-kondoyo-kondo
提出日時 2019-01-01 22:49:58
言語 Rust
(1.77.0 + proconio)
結果
AC  
実行時間 1 ms / 5,000 ms
コード長 3,032 bytes
コンパイル時間 12,956 ms
コンパイル使用メモリ 378,940 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-11-08 14:38:13
合計ジャッジ時間 13,780 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 1 ms
5,248 KB
testcase_02 AC 1 ms
5,248 KB
testcase_03 AC 1 ms
5,248 KB
testcase_04 AC 1 ms
5,248 KB
testcase_05 AC 1 ms
5,248 KB
testcase_06 AC 1 ms
5,248 KB
testcase_07 AC 1 ms
5,248 KB
testcase_08 AC 1 ms
5,248 KB
testcase_09 AC 1 ms
5,248 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
warning: field `count` is never read
  --> src/main.rs:13:5
   |
11 | struct InputData {
   |        --------- field in this struct
12 |     /// データの個数
13 |     count: i32,
   |     ^^^^^
   |
   = note: `InputData` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
   = note: `#[warn(dead_code)]` on by default

ソースコード

diff #

//! No.24 数当てゲーム
//! https://yukicoder.me/problems/no/24

use std::io::stdin;

#[cfg(test)]
mod test;

/// 入力データ
#[derive(Debug)]
struct InputData {
    /// データの個数
    count: i32,
    /// 回答
    answers: Vec<([i32; 4], bool)>,
}

/// エントリポイント
fn main() {
    let input = input_data();
    println!("{}", correct(input));
}

/// 回答の列挙体
#[derive(PartialEq)]
enum YesNo {
    /// 不明
    Unknown,
    /// YES
    YES,
    /// NO
    NO,
}

/// 回答から正解を導出します。
fn correct(input: InputData) -> i32 {

    // 正解候補(0:不明、1:YES、2:NO)
    let mut candidates: [YesNo; 10] = [
        YesNo::Unknown,
        YesNo::Unknown,
        YesNo::Unknown,
        YesNo::Unknown,
        YesNo::Unknown,
        YesNo::Unknown,
        YesNo::Unknown,
        YesNo::Unknown,
        YesNo::Unknown,
        YesNo::Unknown,
    ];

    for ans in input.answers {
        if !ans.1 {
            // NO
            for n in ans.0.iter() {
                candidates[*n as usize] = YesNo::NO;
            }
        } else {
            // YES
            for i in 0..10 {
                let find = match ans.0.iter()
                    .find(|&&x| x == i as i32) {
                    Some(_) => true,
                    None => false,
                };

                candidates[i] = match candidates[i] {
                    YesNo::Unknown if find => YesNo::YES,
                    YesNo::Unknown => YesNo::Unknown,
                    // answersに数字があればYES、なければNO
                    // 1度YESになっても、つぎにYESにならなければNO
                    YesNo::YES if find => YesNo::YES,
                    YesNo::YES => YesNo::NO,
                    YesNo::NO => YesNo::NO,
                }
            }
        }
    }

    // 結果を探す
    for (i, v) in candidates.iter().enumerate() {
        if *v == YesNo::YES {
            return i as i32;
        }
    }

    for (i, v) in candidates.iter().enumerate() {
        if *v == YesNo::Unknown {
            return i as i32;
        }
    }

    // ここには来ないはず
    0
}

/// 標準入力から文字列を取得します。
fn input_data() -> InputData {
    // 1行目
    let mut s1 = String::new();
    stdin().read_line(&mut s1).unwrap();
    let count: i32 = s1.trim().parse().unwrap();

    // 2行目以降
    let mut answers = Vec::new();

    for _i in 0..count {
        let mut s2 = String::new();
        stdin().read_line(&mut s2).unwrap();

        // 空白で分割してVecに格納
        let sp: Vec<&str> = s2.trim().split_whitespace().collect();

        let array: [i32; 4] = [
            sp[0].parse().unwrap(),
            sp[1].parse().unwrap(),
            sp[2].parse().unwrap(),
            sp[3].parse().unwrap(),
        ];
        let yn = if sp[4] == "YES" { true } else { false };

        answers.push((array, yn));
    }

    InputData {
        count,
        answers,
    }
}
0