Task: | Säähavainnot |
Sender: | Bliz |
Submission time: | 2023-11-07 14:26:45 +0200 |
Language: | Rust |
Status: | READY |
Result: | 60 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 59.75 |
test | verdict | time | score | |
---|---|---|---|---|
#1 | ACCEPTED | 0.01 s | 7.5 | details |
#2 | ACCEPTED | 0.01 s | 8 | details |
#3 | ACCEPTED | 0.01 s | 7.75 | details |
#4 | ACCEPTED | 0.01 s | 7.25 | details |
#5 | ACCEPTED | 0.01 s | 7.63 | details |
#6 | ACCEPTED | 0.01 s | 7.25 | details |
#7 | ACCEPTED | 0.01 s | 7.13 | details |
#8 | ACCEPTED | 0.01 s | 7.25 | details |
Code
use std::{ io::{self, BufRead}, iter, }; const DAY_COUNT: usize = 6; const PREDICTION_STRENGTH: f64 = 0.7; fn main() { let reader = io::stdin().lock(); let predictions = predict(reader); print_predictions(predictions); } fn predict<T>(mut reader: T) -> Vec<Vec<Option<f64>>> where T: BufRead, { let mut input = String::new(); reader.read_line(&mut input).unwrap(); let _n: i32 = input .trim() .parse() .expect("first line of input should be the number of days"); let days = get_temperatures(reader); let diffs = calculate_average_diffs(&days); dbg!(&diffs); days.iter().map(|day| predict_day(day, &diffs)).collect() } fn get_temperatures<T>(reader: T) -> Vec<Vec<f64>> where T: BufRead, { reader .lines() .map(|line| { line.unwrap() .split_whitespace() .map(|x| x.parse::<f64>().unwrap()) .collect() }) .collect() } fn calculate_average_diffs(_days: &Vec<Vec<f64>>) -> Vec<f64> { // let n = days.len(); // let mut diffs = vec![0.0; 12]; // for day in days { // diffs // .iter_mut() // .zip(day.iter()) // .for_each(|(diff, temp)| *diff += temp); // } // let avg: f64 = days // .iter() // .map(|day| day.iter().skip(23).next().unwrap()) // .sum(); // diffs // .iter_mut() // .for_each(|diff| *diff = (*diff - avg) / n as f64); vec![ 0.1609500000000253, 0.13702500000002782, -0.02551249999999527, -0.3116000000000022, -0.6884124999999858, -1.142699999999956, -1.6627625000000026, -2.1764374999999965, -2.624075000000008, -2.9596124999999893, -3.2226249999999954, -3.4357250000000024, ] } fn predict_day(day: &Vec<f64>, diffs: &Vec<f64>) -> Vec<Option<f64>> { let base = day.iter().skip(23).next().unwrap(); diffs .iter() .map(|diff| Some(base + PREDICTION_STRENGTH * diff)) .take(DAY_COUNT) .chain(iter::repeat(None)) .take(12) .collect() } fn print_predictions(predictions: Vec<Vec<Option<f64>>>) { for prediction in predictions { println!( "{}", prediction .iter() .map(|x| match x { Some(t) => t.to_string(), None => String::from("?"), }) .collect::<Vec<String>>() .join(" ") ); } } #[cfg(test)] mod tests { use super::*; use std::{fs::File, io::BufReader}; #[test] fn example_input() { let file = File::open("in.txt").expect("there should be an example input file named `in.txt`"); let reader = BufReader::new(file); let predictions = predict(reader); print_predictions(predictions); } #[test] fn test_data_set() { const DATA_FILE_NAME: &str = "data.txt"; let file = File::open(DATA_FILE_NAME) .unwrap_or_else(|_| panic!("expected to find file `{}`", DATA_FILE_NAME)); let reader = BufReader::new(file); let predictions = predict(reader); let file = File::open(DATA_FILE_NAME) .unwrap_or_else(|_| panic!("expected to find file `{}`", DATA_FILE_NAME)); let reader = BufReader::new(file); let measurements = get_measurements(reader); let score = calculate_score(predictions, measurements); println!("Score: {}", score); } fn get_measurements(reader: BufReader<File>) -> Vec<Vec<f64>> { reader .lines() .map(|line| { line.unwrap() .split_whitespace() .map(|x| x.parse().unwrap()) .skip(24) .collect() }) .collect() } fn calculate_score(predictions: Vec<Vec<Option<f64>>>, measurements: Vec<Vec<f64>>) -> f64 { let n = predictions.len(); let a: f64 = predictions .iter() .flatten() .zip(measurements.iter().flatten()) .map(|x| { f64::from(match x { (Some(p), m) => (p - m).abs() < 0.75, (None, _) => false, }) }) .sum(); let b: f64 = predictions .iter() .flatten() .zip(measurements.iter().flatten()) .map(|x| { f64::from(match x { (Some(p), m) => (p - m).abs() >= 2.05, (None, _) => false, }) }) .sum(); 25.0 * (a - b) / n as f64 } }
Test details
Test 1
Verdict: ACCEPTED
input |
---|
1000 -0.4 -0.1 -0.2 -0.3 -0.4 -0.5 ... |
correct output |
---|
0.4 0.4 0.5 0.8 0.9 1.1 1.3 1.... |
user output |
---|
0.31266500000001773 0.29591750... Truncated |
Error:
[input/code.rs:29] &diffs = [ 0.1609500000000253, 0.13702500000002782, -0.0255...
Test 2
Verdict: ACCEPTED
input |
---|
1000 2.9 2.9 2.9 2.1 2.6 2 2 2.2 2.... |
correct output |
---|
2.3 1.6 1.5 1.1 1 0.7 0.6 0.8 ... |
user output |
---|
2.7126650000000176 2.695917500... Truncated |
Error:
[input/code.rs:29] &diffs = [ 0.1609500000000253, 0.13702500000002782, -0.0255...
Test 3
Verdict: ACCEPTED
input |
---|
1000 6.6 6 6.4 6 4.6 4.6 4.2 4.3 4.... |
correct output |
---|
10 10.9 10.3 10.1 9.1 7.3 5.7 ... |
user output |
---|
10.212665000000017 10.19591750... Truncated |
Error:
[input/code.rs:29] &diffs = [ 0.1609500000000253, 0.13702500000002782, -0.0255...
Test 4
Verdict: ACCEPTED
input |
---|
1000 19.4 20.2 19.1 18.9 18.3 17.3 ... |
correct output |
---|
18 18.2 17 17.5 17.2 16.2 12 8... |
user output |
---|
17.312665000000017 17.29591750... Truncated |
Error:
[input/code.rs:29] &diffs = [ 0.1609500000000253, 0.13702500000002782, -0.0255...
Test 5
Verdict: ACCEPTED
input |
---|
1000 -5.7 -5.8 -5.8 -5.9 -7.1 -6.9 ... |
correct output |
---|
-4.2 -4.1 -4 -3.8 -3.5 -3.2 -3... |
user output |
---|
-4.387334999999982 -4.40408249... Truncated |
Error:
[input/code.rs:29] &diffs = [ 0.1609500000000253, 0.13702500000002782, -0.0255...
Test 6
Verdict: ACCEPTED
input |
---|
1000 14.8 14.8 15.4 12.9 11.8 9.7 9... |
correct output |
---|
11.8 11 11.6 10.8 10.4 10.4 10... |
user output |
---|
12.712665000000017 12.69591750... Truncated |
Error:
[input/code.rs:29] &diffs = [ 0.1609500000000253, 0.13702500000002782, -0.0255...
Test 7
Verdict: ACCEPTED
input |
---|
1000 0.7 1 2 1.4 0.6 -0.4 -0.9 -0.7... |
correct output |
---|
-1.3 -0.5 -0.6 -1 -3.2 -7.2 -6... |
user output |
---|
-1.6873349999999823 -1.7040824... Truncated |
Error:
[input/code.rs:29] &diffs = [ 0.1609500000000253, 0.13702500000002782, -0.0255...
Test 8
Verdict: ACCEPTED
input |
---|
1000 15.1 15.3 14.9 14.4 14.4 13.7 ... |
correct output |
---|
15.6 15.9 16 15.2 14.6 14.4 13... |
user output |
---|
15.112665000000018 15.09591750... Truncated |
Error:
[input/code.rs:29] &diffs = [ 0.1609500000000253, 0.13702500000002782, -0.0255...