結果

問題 No.24 数当てゲーム
ユーザー yo-kondoyo-kondo
提出日時 2019-01-01 22:23:56
言語 Rust
(1.77.0 + proconio)
結果
WA  
実行時間 -
コード長 2,945 bytes
コンパイル時間 15,163 ms
コンパイル使用メモリ 379,812 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-11-08 09:41:15
合計ジャッジ時間 16,087 ms
ジャッジサーバーID
(参考情報)
judge4 / 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 WA -
testcase_07 AC 1 ms
5,248 KB
testcase_08 WA -
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 {
                candidates[i] = match candidates[i] {
                    YesNo::Unknown => YesNo::YES,
                    YesNo::YES => {
                        // answersに数字があればYES、なければNO
                        // 1度YESになっても、つぎにYESにならなければNO
                        match ans.0.iter().find(|&&x| x == i as i32) {
                            Some(_) => YesNo::YES,
                            None => 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