結果
| 問題 |
No.24 数当てゲーム
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-01-01 22:49:58 |
| 言語 | Rust (1.83.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
コンパイルメッセージ
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
ソースコード
//! 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,
}
}