deus-nqueens 0.3.0

NQueens Problem Solver
Documentation
use crate::NQueens;
use rayon::iter::{IntoParallelIterator, ParallelIterator};
use wolfram_library_link::{
    export,
    expr::{Expr, Number, Symbol},
};

fn failed() -> Expr {
    Expr::symbol(Symbol::new("System`$Failed"))
}

#[export(wstp)]
fn guess_number_ffi(args: Vec<Expr>) -> Expr {
    match args.as_slice() {
        [a, b, c] => {
            let min = match a.try_number().unwrap() {
                Number::Integer(i) if i >= 0 => i as usize,
                _ => return failed(),
            };
            let max = match b.try_number().unwrap() {
                Number::Integer(i) if i as usize > min => i as usize,
                _ => return failed(),
            };
            let times = match c.try_number().unwrap() {
                Number::Integer(i) if i > 0 => i as usize,
                _ => return failed(),
            };
            Expr::list(guess_number(min, max, times))
        }
        _ => failed(),
    }
}

fn guess_number_dichotomy(min: usize, max: usize, times: usize) -> Vec<Expr> {
    (0..times)
        .into_par_iter()
        .map(|_| {
            let mut game = NQueens::new(min, max);
            let a = game.dichotomy();
            let b = game.golden_divide();
            let c = game.random_select();
            Expr::list(vec![Expr::from(a as i32), Expr::from(b as i32), Expr::from(c as i32)])
        })
        .collect()
}

#[test]
fn test() {}