aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs24
-rw-r--r--src/position.rs4
-rw-r--r--src/solve.rs14
3 files changed, 24 insertions, 18 deletions
diff --git a/src/main.rs b/src/main.rs
index f7b6a6e..e77ce2b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,6 +1,6 @@
use std::io;
use std::io::prelude::*;
-use std::collections::HashMap;
+use std::time::{Instant,Duration};
pub mod position;
pub mod solve;
@@ -10,6 +10,9 @@ use solve::solve;
fn main() {
+ let mut total_time = Duration::new(0, 0);
+ let mut total_solve = 0;
+
for result in io::stdin().lock().lines() {
let line = result.unwrap();
let fields: Vec<&str> = line.split_ascii_whitespace().collect();
@@ -26,20 +29,17 @@ fn main() {
};
match fields[0].parse::<Position>() {
Ok(pos) => {
- // println!("{:?}", pos);
- let mut cache = HashMap::with_capacity(30000);
- println!("score: {:3} {:3}", solve(pos, -10000, 10000, &mut cache), expected_score);
+ print!("{:?}", pos);
+ let begin = Instant::now();
+ let score = solve(pos);
+ let elapsed = begin.elapsed();
+ total_time += elapsed;
+ total_solve += 1;
+ println!("score: {:3} {:3}, time: {:?}\n", score, expected_score, elapsed);
}
Err(msg) =>
eprintln!("wrong score format {:?}: {}", fields[1], msg),
}
}
-
- // let mut p = "7422341735647741166133573473242566".parse::<Position>().unwrap();
- // p = p.play(2);
- // p = p.play(2);
- // p = p.play(1);
- // p = p.play(5);
- // println!("{:?}", p);
- // println!("{}", solve(p.clone(), -10000, 100000));
+ println!("mean time {:?}", total_time / total_solve);
}
diff --git a/src/position.rs b/src/position.rs
index 953881c..9ed617d 100644
--- a/src/position.rs
+++ b/src/position.rs
@@ -156,8 +156,8 @@ use std::fmt;
impl fmt::Debug for Position {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use Cell::*;
- write!(f, "play_count: {}\n", self.play_count)?;
- write!(f, "{:10}{:10}{:10}\n", "position", "mask", "player")?;
+ writeln!(f, "play_count: {}", self.play_count)?;
+ writeln!(f, "{:10}{:10}{:10}", "position", "mask", "player")?;
for y in (0..FULL_HEIGHT).rev() {
for x in 0..WIDTH {
match self.at(y, x) {
diff --git a/src/solve.rs b/src/solve.rs
index e9c8c04..b950ab6 100644
--- a/src/solve.rs
+++ b/src/solve.rs
@@ -2,8 +2,14 @@ use std::collections::HashMap;
use crate::position::{Position, WIDTH, HEIGHT};
+const COLUMNS_ORDER: [u64; 7] = [3, 2, 4, 1, 5, 0, 6];
-pub fn solve(p: Position, a: i32, b: i32, cache: &mut HashMap<u64, i32>) -> i32 {
+pub fn solve(p: Position) -> i32 {
+ let mut cache = HashMap::with_capacity(30000);
+ solve_rec(p, -100000, 100000, &mut cache)
+}
+
+fn solve_rec(p: Position, a: i32, b: i32, cache: &mut HashMap<u64, i32>) -> i32 {
if let Some(score) = cache.get(&p.key()) {
return *score;
}
@@ -28,12 +34,13 @@ pub fn solve(p: Position, a: i32, b: i32, cache: &mut HashMap<u64, i32>) -> i32
}
}
- for x in 0..WIDTH {
+ for x_unordered in 0..(WIDTH as usize) {
+ let x = COLUMNS_ORDER[x_unordered];
if !p.is_valid_play(x) {
continue
}
- let score = -solve(p.play(x), -beta, -alpha, cache);
+ let score = -solve_rec(p.play(x), -beta, -alpha, cache);
if score >= beta {
return score;
@@ -47,4 +54,3 @@ pub fn solve(p: Position, a: i32, b: i32, cache: &mut HashMap<u64, i32>) -> i32
return alpha;
}
-