diff --git a/rubiks/.gitignore b/rubiks/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/rubiks/.gitignore @@ -0,0 +1 @@ +/target diff --git a/rubiks/Cargo.toml b/rubiks/Cargo.toml new file mode 100644 index 0000000..0553498 --- /dev/null +++ b/rubiks/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "rubiks" +version = "0.1.0" +edition = "2021" + +[dependencies] +colored = "2.2.0" diff --git a/rubiks/cube.jpg b/rubiks/cube.jpg new file mode 100644 index 0000000..f8a7985 Binary files /dev/null and b/rubiks/cube.jpg differ diff --git a/rubiks/cube.txt b/rubiks/cube.txt new file mode 100644 index 0000000..6b4def6 --- /dev/null +++ b/rubiks/cube.txt @@ -0,0 +1,26 @@ +Colors: + WWW + WWW + WWW + +OOO GGG RRR BBB +OOO GGG RRR BBB +OOO GGG RRR BBB + + YYY + YYY + YYY + + +Indexs: + 012 0 + 345 + 678 + +901 234 567 890 10, 20 +123 456 789 012 30 +345 678 901 234 40 + + 567 50 + 890 + 123 diff --git a/rubiks/src/main.rs b/rubiks/src/main.rs new file mode 100644 index 0000000..ddd9ea2 --- /dev/null +++ b/rubiks/src/main.rs @@ -0,0 +1,173 @@ +use std::io::{stdin,stdout,Write}; +use colored::*; + +fn print_coloured(output: char) { + match output { + 'R' => print!("{}", "R".on_truecolor(255,0,0)), + 'G' => print!("{}", "G".on_truecolor(0,255,0).purple()), + 'B' => print!("{}", "B".on_truecolor(0,0,255).red()), + 'Y' => print!("{}", "Y".on_truecolor(255,255,0).black()), + 'W' => print!("{}", "W".on_truecolor(255,255,255).black()), + 'O' => print!("{}", "O".on_truecolor(255, 128, 0)), + _ => print!("{}", output), + } +} + +fn output_cube(cube: &Vec) { + // White square + print!(" "); + for i in 0..=2 { + print_coloured(cube[i]); + } + println!(); + print!(" "); + for i in 3..=5 { + print_coloured(cube[i]); + } + println!(); + print!(" "); + for i in 6..=8 { + print_coloured(cube[i]); + } + + // First layer + println!(); + for i in 9..=20 { + print_coloured(cube[i]); + } + // Second layer + println!(); + for i in 21..=32 { + print_coloured(cube[i]); + } + // Third layer + println!(); + for i in 33..=44 { + print_coloured(cube[i]); + } + // Yellow square + println!(); + print!(" "); + for i in 45..=47 { + print_coloured(cube[i]); + } + println!(); + print!(" "); + for i in 48..=50 { + print_coloured(cube[i]); + } + println!(); + print!(" "); + for i in 51..=53 { + print_coloured(cube[i]); + } + + println!() +} +fn move_cube(rotation: String, mut cube: &mut Vec) { + let mut initial_cube = cube.clone(); + // Up clockwise + if rotation == "U" { + cube[0] = initial_cube[6]; + cube[1] = initial_cube[3]; + cube[2] = initial_cube[0]; + cube[3] = initial_cube[7]; + // Cube 4 remains the same + cube[5] = initial_cube[1]; + cube[6] = initial_cube[8]; + cube[7] = initial_cube[5]; + cube[8] = initial_cube[2]; + + let indices = vec![12, 13, 14, 15, 16, 17, 18, 19, 20, 9, 10, 11]; + + for (i, &index) in indices.iter().enumerate() { + cube[9 + i] = initial_cube[index]; + } + } + if rotation == "D" { + cube[45] = initial_cube[51]; + cube[46] = initial_cube[48]; + cube[47] = initial_cube[45]; + cube[48] = initial_cube[52]; + // Cube 49 remains the same + cube[50] = initial_cube[46]; + cube[51] = initial_cube[53]; + cube[52] = initial_cube[50]; + cube[53] = initial_cube[47]; + + let indices = vec![42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41]; + + for (i, &index) in indices.iter().enumerate() { + cube[33 + i] = initial_cube[index]; + } + } + if rotation == "R" { + cube[15] = initial_cube[39]; + cube[16] = initial_cube[27]; + cube[17] = initial_cube[15]; + cube[27] = initial_cube[40]; + // Cube 28 remains the same + cube[29] = initial_cube[16]; + cube[39] = initial_cube[41]; + cube[40] = initial_cube[29]; + cube[41] = initial_cube[17]; + + // Other edge peices around the Right side + cube[42] = initial_cube[2]; + cube[30] = initial_cube[5]; + cube[18] = initial_cube[8]; + cube[2] = initial_cube[14]; + cube[5] = initial_cube[26]; + cube[8] = initial_cube[38]; + cube[14] = initial_cube[47]; + cube[26] = initial_cube[50]; + cube[38] = initial_cube[53]; + cube[47] = initial_cube[42]; + cube[50] = initial_cube[30]; + cube[53] = initial_cube[18]; + } +} +fn input() -> String{ + let mut s=String::new(); + let _=stdout().flush(); + stdin().read_line(&mut s).expect("Did not enter a correct string"); + if let Some('\n')=s.chars().next_back() { + s.pop(); + } + if let Some('\r')=s.chars().next_back() { + s.pop(); + } + return s; +} +fn main() { + + // Create a net of a cube, see cube.jpeg or cube.txt in the root of this project for a + // visualisation + let mut cube: Vec = vec![ + 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', // 0-8 (W) + 'O', 'O', 'O', // 9-11 (O) + 'G', 'G', 'G', // 12-14 (G) + 'R', 'R', 'R', // 15-17 (R) + 'B', 'B', 'B', // 18-20 (B) + 'O', 'O', 'O', // 21-23 (O) + 'G', 'G', 'G', // 24-26 (G) + 'R', 'R', 'R', // 27-29 (R) + 'B', 'B', 'B', // 30-32 (B) + 'O', 'O', 'O', // 33-35 (O) + 'G', 'G', 'G', // 36-38 (G) + 'R', 'R', 'R', // 39-41 (R) + 'B', 'B', 'B', // 42-44 (B) + 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', // 45-53 (Y) + ]; + + output_cube(&cube); + + 'game_loop: loop { + let rotation = input(); + if rotation == "q" { + break 'game_loop; + } + move_cube(rotation, &mut cube); + output_cube(&cube); + } +}