(* Cube - Utility to help solve the rubix cube *) (* * Top * +---+ * / /| * +---+ + Right * | |/ * +---+ * Front *) open Printf type color = | Red | Green | Yellow | Orange | Blue | White let color_to_string = function | Red -> "R" | Green -> "G" | Yellow -> "Y" | Orange -> "O" | Blue -> "B" | White -> "W" type square = color array array type side = { mutable s: square; north: int; east: int; south: int; west: int; } let solved_square n color = Array.make n (Array.make n color) let print_three_squares s1 s2 s3 = for i = 0 to Array.length s1 - 1 do for j = 0 to Array.length s1.(i) - 1 do printf "%s" (color_to_string s1.(i).(j)) done; printf " "; for j = 0 to Array.length s1.(i) - 1 do printf "%s" (color_to_string s2.(i).(j)) done; printf " "; for j = 0 to Array.length s1.(i) - 1 do printf "%s" (color_to_string s3.(i).(j)) done; printf "\n" done let print_square s = for i = 0 to Array.length s - 1 do for j = 0 to Array.length s.(i) - 1 do printf "%s" (color_to_string s.(i).(j)) done; printf "\n" done let print_square_indent indent s = for i = 0 to Array.length s - 1 do printf "%s" indent; for j = 0 to Array.length s.(i) - 1 do printf "%s" (color_to_string s.(i).(j)) done; printf "\n" done type cube = side array let solved_cube n = let red_side = { s = solved_square n Red; north= 3; east= 5; south= 1; west= 4} in let green_side = { s = solved_square n Green; north= 0; east= 5; south= 2; west= 4} in let orange_side = { s = solved_square n Orange; north= 1; east= 5; south= 3; west= 4} in let blue_side = { s = solved_square n Blue; north= 2; east= 5; south= 0; west= 4} in let white_side = { s = solved_square n White; north= 3; east= 0; south= 1; west= 2} in let yellow_side = { s = solved_square n Yellow; north= 3; east= 2; south= 1; west= 0} in [| red_side; green_side; orange_side; blue_side; white_side; yellow_side |] (* 0 1 2 3 4 5 *) let turn_side c num = let face = c.(num).s in let new_face = [| [| face.(2).(0) ; face.(1).(0) ; face.(0).(0) |]; [| face.(2).(1) ; face.(1).(1) ; face.(0).(1) |]; [| face.(2).(2) ; face.(1).(2) ; face.(0).(2) |]; |] in let n = c.(c.(num).north).s in let e = c.(c.(num).east).s in let s = c.(c.(num).south).s in let w = c.(c.(num).west).s in if num < 4 then begin let new_n = [| [| n.(0).(0) ; n.(0).(1) ; n.(0).(2) |]; [| n.(1).(0) ; n.(1).(1) ; n.(1).(2) |]; [| w.(2).(2) ; w.(1).(2) ; w.(0).(2) |]; |] in let new_e = [| [| n.(2).(0) ; e.(0).(1) ; e.(0).(2) |]; [| n.(2).(1) ; e.(1).(1) ; e.(1).(2) |]; [| n.(2).(2) ; e.(2).(1) ; e.(2).(2) |]; |] in let new_s = [| [| e.(2).(0) ; e.(1).(0) ; e.(0).(0) |]; [| s.(1).(0) ; s.(1).(1) ; s.(1).(2) |]; [| s.(2).(0) ; s.(2).(1) ; s.(2).(2) |]; |] in let new_w = [| [| s.(0).(0) ; s.(0).(1) ; s.(0).(2) |]; [| w.(1).(0) ; w.(1).(1) ; w.(1).(2) |]; [| w.(2).(0) ; w.(2).(1) ; w.(2).(2) |]; |] in c.(num).s <- new_face; c.(c.(num).north).s <- new_n; c.(c.(num).east).s <- new_e; c.(c.(num).south).s <- new_s; c.(c.(num).west).s <- new_w; c end else if num = 4 then begin let new_n = [| [| w.(0).(0) ; n.(0).(1) ; n.(0).(2) |]; [| w.(1).(0) ; n.(1).(1) ; n.(1).(2) |]; [| w.(2).(0) ; n.(2).(1) ; n.(2).(2) |]; |] in let new_e = [| [| n.(0).(0) ; e.(0).(1) ; e.(0).(2) |]; [| n.(1).(0) ; e.(1).(1) ; e.(1).(2) |]; [| n.(2).(0) ; e.(2).(1) ; e.(2).(2) |]; |] in let new_s = [| [| e.(0).(0) ; s.(0).(1) ; s.(0).(2) |]; [| e.(1).(0) ; s.(1).(1) ; s.(1).(2) |]; [| e.(2).(0) ; s.(2).(1) ; s.(2).(2) |]; |] in let new_w = [| [| s.(0).(0) ; w.(0).(1) ; w.(0).(2) |]; [| s.(1).(0) ; w.(1).(1) ; w.(1).(2) |]; [| s.(2).(0) ; w.(2).(1) ; w.(2).(2) |]; |] in c.(num).s <- new_face; c.(c.(num).north).s <- new_n; c.(c.(num).east).s <- new_e; c.(c.(num).south).s <- new_s; c.(c.(num).west).s <- new_w; c end else begin let new_n = [| [| n.(0).(0) ; n.(0).(1) ; e.(0).(2) |]; [| n.(1).(0) ; n.(1).(1) ; e.(1).(2) |]; [| n.(2).(0) ; n.(2).(1) ; e.(2).(2) |]; |] in let new_e = [| [| e.(0).(0) ; e.(0).(1) ; s.(0).(2) |]; [| e.(1).(0) ; e.(1).(1) ; s.(1).(2) |]; [| e.(2).(0) ; e.(2).(1) ; s.(2).(2) |]; |] in let new_s = [| [| s.(0).(0) ; s.(0).(1) ; w.(0).(2) |]; [| s.(1).(0) ; s.(1).(1) ; w.(1).(2) |]; [| s.(2).(0) ; s.(2).(1) ; w.(2).(2) |]; |] in let new_w = [| [| w.(0).(0) ; w.(0).(1) ; n.(0).(2) |]; [| w.(1).(0) ; w.(1).(1) ; n.(1).(2) |]; [| w.(2).(0) ; w.(2).(1) ; n.(2).(2) |]; |] in c.(num).s <- new_face; c.(c.(num).north).s <- new_n; c.(c.(num).east).s <- new_e; c.(c.(num).south).s <- new_s; c.(c.(num).west).s <- new_w; c end let print_cube c = for i = 0 to Array.length c - 1 do print_square c.(i).s; printf "\n" done let nice_print_cube c = print_square_indent " " c.(0).s; printf "\n"; print_three_squares c.(4).s c.(1).s c.(5).s; printf "\n"; print_square_indent " " c.(2).s; printf "\n"; print_square_indent " " c.(3).s; printf "\n" let _ = let cube = solved_cube 3 in let cube = ref cube in for i = 0 to 10 do let twists = [ 0 ] in cube := List.fold_left turn_side !cube twists; print_newline(); print_newline(); print_newline(); print_newline(); print_newline(); print_newline(); nice_print_cube !cube; print_newline(); Unix.sleep 1 done