-
Notifications
You must be signed in to change notification settings - Fork 0
/
score.rs
107 lines (95 loc) · 2.93 KB
/
score.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
use clap::{App, Arg};
use icfpc::models::*;
use icfpc::parse::read_all_inputs;
use std::fs::File;
use std::io::Read;
struct ScoreInfo {
width: usize,
height: usize,
best_estimated: usize,
team_time: usize,
}
impl ScoreInfo {
fn log_wh(&self) -> f64 {
let wh = self.width as f64 * self.height as f64;
wh.log2()
}
fn ratio(&self) -> f64 {
self.best_estimated as f64 / self.team_time as f64
}
fn debug(&self) -> String {
format!(
"1000.0 * {:5.2} * {:4.2} = {:8.2} ({:6} steps)",
self.log_wh(),
self.ratio(),
self.score(),
self.team_time
)
}
fn score(&self) -> f64 {
1000.0 * self.log_wh() * self.ratio()
}
}
fn score_small(task: Task, output_len: usize) -> ScoreInfo {
let map_points = task.map.enumerate_points();
let width = map_points.iter().map(|p| p.x).max().unwrap() + 1;
let height = map_points.iter().map(|p| p.y).max().unwrap() + 1;
let mut remaining = 0;
let mut passed = vec![vec![true; width]; height];
let mut valid = vec![vec![false; width]; height];
for p in &map_points {
passed[p.y][p.x] = false;
valid[p.y][p.x] = true;
remaining += 1;
}
for o in &task.obstacles {
for p in o.enumerate_points().iter() {
if p.y < height && p.x < width && valid[p.y][p.x] {
valid[p.y][p.x] = false;
passed[p.y][p.x] = true;
remaining -= 1;
}
}
}
ScoreInfo {
width,
height,
best_estimated: remaining,
team_time: output_len,
}
}
fn main() {
let matches = App::new("Score checker")
.version("0.1.0")
.arg(
Arg::with_name("input")
.long("input")
.takes_value(true)
.help("input root directory"),
)
.arg(
Arg::with_name("output")
.long("output")
.takes_value(true)
.help("output directory"),
)
.get_matches();
let input_root = matches.value_of("input").expect("no input specified");
let output_root = matches.value_of("output").expect("no output specified");
let inputs = read_all_inputs(input_root);
let mut sum_scores = 0.0;
for input in inputs {
let output_len = {
let output_path = format!("{}/{}", output_root, input.output_file_name());
let mut output_file = File::open(&output_path).unwrap();
let mut output_str = String::new();
output_file.read_to_string(&mut output_str).unwrap();
output_str.trim_end().len()
};
let score_info = score_small(input.task, output_len);
eprintln!("{}: {}", input.id, score_info.debug());
sum_scores += score_info.score();
}
println!("output: {}", output_root);
println!("total_score: {}", sum_scores);
}