pub mod bottom;
pub mod coll;
pub mod cpll;
pub mod cross;
pub mod daisy;
pub mod eoll;
pub mod epll;
pub mod middle;
use crate::facelet::Color;
use crate::moves::Formula;
use crate::{cubie::CubieCube, moves::Move};
pub use bottom::BottomCornerSolver;
pub use coll::COLLSolver;
pub use cpll::CPLLSolver;
pub use cross::CrossSolver;
pub use daisy::DaisySolver;
pub use eoll::EOLLSolver;
pub use epll::EPLLSolver;
pub use middle::MiddleEdgeSolver;
pub struct LBLSolver {
pub cube: CubieCube,
}
impl LBLSolver {
pub fn solve(&mut self) -> Vec<Move> {
let mut solution = Vec::new();
let mut cross = CrossSolver::new(self.cube, true);
let mut _cs = cross.solve();
assert!(cross.is_solved());
self.cube = cross.cube;
solution.append(&mut _cs);
let mut bottom = BottomCornerSolver { cube: self.cube };
let mut _bs = bottom.solve();
assert!(bottom.is_solved());
self.cube = bottom.cube;
solution.append(&mut _bs);
let mut middle = MiddleEdgeSolver { cube: self.cube };
let mut _ms = middle.solve();
assert!(middle.is_solved());
self.cube = middle.cube;
solution.append(&mut _ms);
let mut eoll = EOLLSolver { cube: self.cube };
let mut _eos = eoll.solve();
assert!(eoll.is_solved());
self.cube = eoll.cube;
solution.append(&mut _eos);
let mut coll = COLLSolver { cube: self.cube };
let mut _cos = coll.solve();
assert!(coll.is_solved());
self.cube = coll.cube;
solution.append(&mut _cos);
let mut cpll = CPLLSolver { cube: self.cube };
let mut _cps = cpll.solve();
assert!(cpll.is_solved());
self.cube = cpll.cube;
solution.append(&mut _cps);
let mut epll = EPLLSolver { cube: self.cube };
let mut _eps = epll.solve();
assert!(epll.is_solved());
self.cube = epll.cube;
solution.append(&mut _eps);
Formula { moves: solution }.optimise().moves
}
pub fn is_solved(&self) -> bool {
let cc = CubieCube::default();
self.cube == cc
}
}
pub fn get_move_face(step: Move) -> Color {
let face = format!("{:?}", step);
let face = face.as_bytes()[0];
let face = char::from(face);
let face = Color::try_from(face).unwrap();
face
}
pub fn get_put_move(i: usize, step: Move) -> Vec<Move> {
match i {
1 => vec![step],
2 => vec![step * 2],
3 => vec![step * 3],
_ => vec![],
}
}
#[cfg(test)]
mod tests {
use crate::{cubie::CubieCube, moves::Formula, solver::LBLSolver};
#[test]
fn test_lbl() {
let cc = CubieCube::default();
let moves = Formula::scramble();
let cc = cc.apply_formula(&moves);
let cc2 = cc.clone();
let mut solver = LBLSolver { cube: cc };
let solution = solver.solve();
assert!(solver.is_solved());
let cc2 = cc2.apply_moves(&solution);
assert_eq!(cc2, CubieCube::default());
println!("Scramble: {:?}\nSolution: {:?}", moves, solution);
}
}