hcube 0.1.0 → 0.1.1
raw patch · 15 files changed
+200/−103 lines, 15 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- HCube.Common: fourPagesOnOne :: String -> [String] -> [String]
- HCube.Common: getLine2 :: IO [Char]
- HCube.Common: padL :: Int -> String -> String
- HCube.Common: padR :: Int -> String -> String
- HCube.Common: plShow :: Show a => Int -> a -> String
- HCube.Common: prShow :: Show a => Int -> a -> String
- HCube.Common: twoPagesOnOne :: String -> [String] -> [String]
- HCube.Data: TestNumb :: Int -> TestNumb
- HCube.Data: instance Enum TestNumb
- HCube.Data: instance Eq ActualCube
- HCube.Data: instance Eq Color
- HCube.Data: instance Eq Direction
- HCube.Data: instance Eq Rotation
- HCube.Data: instance Eq Side
- HCube.Data: instance Eq Slab
- HCube.Data: instance Eq TestNumb
- HCube.Data: instance Eq View
- HCube.Data: instance Integral TestNumb
- HCube.Data: instance Num TestNumb
- HCube.Data: instance Ord Side
- HCube.Data: instance Ord TestNumb
- HCube.Data: instance Read ActualCube
- HCube.Data: instance Read Color
- HCube.Data: instance Read Direction
- HCube.Data: instance Read Rotation
- HCube.Data: instance Read Side
- HCube.Data: instance Read Slab
- HCube.Data: instance Read TestNumb
- HCube.Data: instance Read View
- HCube.Data: instance Real TestNumb
- HCube.Data: instance Show ActualCube
- HCube.Data: instance Show Color
- HCube.Data: instance Show Direction
- HCube.Data: instance Show Matrix
- HCube.Data: instance Show Rotation
- HCube.Data: instance Show Side
- HCube.Data: instance Show Slab
- HCube.Data: instance Show TestNumb
- HCube.Data: instance Show View
- HCube.Data: newtype TestNumb
- HCube.Lib: instance Eq Cube
- HCube.Lib: instance Eq Rubik
- HCube.Lib: instance Read Cube
- HCube.Lib: instance Read Rubik
- HCube.Lib: instance Show Cube
- HCube.Lib: instance Show Rubik
- HCube.OrientGroup: instance Eq Orient
- HCube.OrientGroup: instance Group Orient
- HCube.OrientGroup: instance Monoid Orient
- HCube.OrientGroup: instance Read Orient
- HCube.OrientGroup: instance Show Orient
- HCube.Test: instance Arbitrary TestNumb
+ HCube.Cons: fromPhysical :: FilePath -> IO Rubik
+ HCube.Data: instance [safe] Eq ActualCube
+ HCube.Data: instance [safe] Eq Color
+ HCube.Data: instance [safe] Eq Direction
+ HCube.Data: instance [safe] Eq Rotation
+ HCube.Data: instance [safe] Eq Side
+ HCube.Data: instance [safe] Eq Slab
+ HCube.Data: instance [safe] Eq View
+ HCube.Data: instance [safe] Ord Side
+ HCube.Data: instance [safe] Read ActualCube
+ HCube.Data: instance [safe] Read Color
+ HCube.Data: instance [safe] Read Direction
+ HCube.Data: instance [safe] Read Rotation
+ HCube.Data: instance [safe] Read Side
+ HCube.Data: instance [safe] Read Slab
+ HCube.Data: instance [safe] Read View
+ HCube.Data: instance [safe] Show ActualCube
+ HCube.Data: instance [safe] Show Color
+ HCube.Data: instance [safe] Show Direction
+ HCube.Data: instance [safe] Show Matrix
+ HCube.Data: instance [safe] Show Rotation
+ HCube.Data: instance [safe] Show Side
+ HCube.Data: instance [safe] Show Slab
+ HCube.Data: instance [safe] Show View
+ HCube.Lib: instance [safe] Eq Cube
+ HCube.Lib: instance [safe] Eq Rubik
+ HCube.Lib: instance [safe] Read Cube
+ HCube.Lib: instance [safe] Read Rubik
+ HCube.Lib: instance [safe] Show Cube
+ HCube.Lib: instance [safe] Show Rubik
+ HCube.OrientGroup: instance [safe] Eq Orient
+ HCube.OrientGroup: instance [safe] Group Orient
+ HCube.OrientGroup: instance [safe] Monoid Orient
+ HCube.OrientGroup: instance [safe] Read Orient
+ HCube.OrientGroup: instance [safe] Show Orient
+ HCube.Utility: squareRoot :: Int -> Maybe Int
- HCube.Cons: realToVirtual :: Size -> CubeSurf -> Rubik
+ HCube.Cons: realToVirtual :: CubeSurf -> Rubik
Files
- HCube/Common.hs +5/−2
- HCube/Cons.hs +21/−7
- HCube/Cube.hs +26/−48
- HCube/Data.hs +4/−5
- HCube/Lib.hs +5/−5
- HCube/OrientGroup.hs +3/−3
- HCube/Permutation.hs +5/−2
- HCube/Template.hs +4/−2
- HCube/Test.hs +8/−15
- HCube/Theory.hs +5/−3
- HCube/Utility.hs +14/−2
- HCube/store/physicalCubeExample +0/−6
- README +91/−0
- hcube.cabal +3/−3
- store/physicalCubeExample +6/−0
HCube/Common.hs view
@@ -1,15 +1,18 @@ ----------------------------------------------------------------------------- -- -- Module : HCube.Common--- Copyright : (c) Todd Wegner 2013+-- Copyright : (c) Todd Wegner 2012 -- License : BSD-style (see the LICENSE file) -- --- Maintainer : todd.w.wegner@gmail.com+-- Maintainer : echbar137@yahoo.co.in -- Stability : provisional -- Portability : portable -- -- Common utility functions that should not be exported. -----------------------------------------------------------------------------+{-# LANGUAGE Safe #-}+{-# OPTIONS_HADDOCK hide #-}+ module HCube.Common where import Control.Monad (liftM)
HCube/Cons.hs view
@@ -1,29 +1,35 @@ ----------------------------------------------------------------------------- -- | -- Module : HCube.Cons--- Copyright : (c) Todd Wegner 2013+-- Copyright : (c) Todd Wegner 2012 -- License : BSD-style (see the LICENSE file) -- --- Maintainer : todd.w.wegner@gmail.com+-- Maintainer : echbar137@yahoo.co.in -- Stability : provisional -- Portability : portable -- -- Provides functions for re-constructing internal data representation -- of virtual cube from a physical cube. ------------------------------------------------------------------------------module HCube.Cons (realToVirtual, consOrient) where+{-# LANGUAGE Safe #-} +module HCube.Cons (realToVirtual, fromPhysical, consOrient) where+ import Data.Monoid-import Data.Maybe (mapMaybe)-import Data.List (sort, mapAccumL)+import Data.Maybe (mapMaybe, fromMaybe)+import Data.List (sort, mapAccumL, nub) import HCube.Data import HCube.Utility import HCube.Lib import HCube.OrientGroup +fromPhysical :: FilePath -> IO Rubik+fromPhysical fn = readFile fn >>= f . read where+ f = return . realToVirtual+ -- | Constructs a virtual cube from a physical cube using CubeSurf.-realToVirtual :: Size -> CubeSurf -> Rubik-realToVirtual sz ci = f $ foldr g ([],[],[],[]) $ consCubeInfo sz ci where+realToVirtual :: CubeSurf -> Rubik+realToVirtual cs = f $ foldr g ([],[],[],[]) $ consCubeInfo sz cs where f (cr, ed, ce, hi) = Rubik sz cr ed ce hi True LeftV [] g (ci, ac, ct) (cr,ed,ce,hi) = h $ length ct where h 0 = (cr,ed,ce,i ci ac :hi)@@ -38,6 +44,14 @@ l (v1:v2:_) = consOrient v1 v2 m [] = 0 m ls = head ls+ --sz = fromJust $ getSize cs+ sz = fromMaybe (error "Improper format") $ getSize cs++getSize :: CubeSurf -> Maybe Size+getSize cs = f . nub $ map (squareRoot . length) $ map snd cs where+ f (hd:[]) = hd+ f _ = Nothing+ extractOrientInfo :: ActualCube -> [(Side,Color)] extractOrientInfo ac = mapMaybe f [(UpS, up ac), (FrontS, front ac), (DownS, down ac),
HCube/Cube.hs view
@@ -1,20 +1,23 @@------------------------------------------------------------------------------+---------------------------------------------------------------------------- -- | -- Module : HCube.Cube--- Copyright : (c) Todd Wegner 2013+-- Copyright : (c) Todd Wegner 2012 -- License : BSD-style (see the LICENSE file) -- --- Maintainer : todd.w.wegner@gmail.com+-- Maintainer : echbar137@yahoo.co.in -- Stability : provisional -- Portability : portable -- -- Executable of hcube. -----------------------------------------------------------------------------+{-# LANGUAGE Trustworthy #-}+ module Main where import System.Environment (getArgs) import Control.Monad (foldM, (>=>)) import Data.Maybe (fromMaybe)+import System.Directory (createDirectoryIfMissing) import HCube.Data import HCube.Lib import HCube.Utility@@ -28,36 +31,21 @@ {- ghci Cube.hs :set args 2+:set args "physicalCubeExample" -} +path = "store/"+ main :: IO () main = getArgs >>= f where- f args = runTests+ f args = createDirectoryIfMissing True path >> putStrLn "enter 'help' for menu"- >> loadCube g h+ >> getCube args >>= render >>= console- >>= saveCube h+ >>= saveCube2 >> return () where- g = getCubeSize args- h = show g ++ "x" ++ show g -main2 :: IO ()-main2 = getArgs >>= f where- f args = runTests- >> putStrLn "enter 'help' for menu"- >> return ( realToVirtual 3 myCube)- >>= render- >>= console- >> return () where- g = getCubeSize args- h = show g ++ "x" ++ show g--getCubeSize :: [String] -> Int -getCubeSize = f where- f [] = 3- f args = fromMaybe 3 $ maybeRead $ head args - console :: Rubik -> IO Rubik console = doM loop f where f = (getLine >>= parseCmd ~> processCmd) >=> render @@ -131,29 +119,19 @@ f _ _ 0 = NoCommand f sl dr nm = Operation [Rotation sl dr nm] --- On a face record cube color from left to right moving from top to bottom.--- Start with Top face--- Rotate cube so Front face comes to Top--- Top -> Front -> Bottom -> Back -> Top -> Left -> Top -> Right+getCube :: [String] -> IO Rubik+getCube = f where+ f [] = loadCube2 3+ f args = maybe g loadCube2 (maybeRead h) where+ g = fromPhysical $ concat [path, h]+ h = head args -{--FACE IDs- 1 2 - 3 4 - 1 2 1 2 1 2 - 3 4 3 4 3 4 - 1 2 - 3 4 - 4 3 1 2 4 3 - 2 1 3 4 2 1 - 1 2 - 3 4 --}+loadCube2 :: Size -> IO Rubik+loadCube2 sz = loadCube sz f where+ f = concat [path, g, "x", g, "x", g]+ g = show sz -myCube :: CubeSurf-myCube = [(UpS, [White,Green,Yellow,Green,White,Green,Red,White,Green]),- (FrontS, [Blue,Blue,White,Yellow,Orange,Yellow,Red,Yellow,White]),- (DownS, [Yellow,Blue,Green,White,Yellow,Blue,White,Orange,Green]),- (BackS, [Orange,Blue,Orange,Yellow,Red,Red,Red,Orange,Blue]),- (LeftS, [Orange,White,Yellow,Red,Green,Red,Orange,Red,Red]),- (RightS, [Blue,Green,Blue,Orange,Blue,White,Green,Orange,Yellow])]+saveCube2 :: Rubik -> IO ()+saveCube2 rk = saveCube f rk where+ f = concat [path, g, "x", g, "x", g]+ g = show $ n rk
HCube/Data.hs view
@@ -1,18 +1,17 @@ ----------------------------------------------------------------------------- -- | -- Module : HCube.Data--- Copyright : (c) Todd Wegner 2013+-- Copyright : (c) Todd Wegner 2012 -- License : BSD-style (see the LICENSE file) -- --- Maintainer : todd.w.wegner@gmail.com+-- Maintainer : echbar137@yahoo.co.in -- Stability : provisional -- Portability : portable -- ------------------------------------------------------------------------------{-# LANGUAGE GeneralizedNewtypeDeriving #-}-module HCube.Data where+{-# LANGUAGE Safe #-} -newtype TestNumb = TestNumb Int deriving (Integral, Enum, Num, Real, Eq, Ord, Read, Show)+module HCube.Data where -- | Integer type used in hcube. type Numb = Int
HCube/Lib.hs view
@@ -1,15 +1,18 @@ ----------------------------------------------------------------------------- -- | -- Module : HCube.Lib--- Copyright : (c) Todd Wegner 2013+-- Copyright : (c) Todd Wegner 2012 -- License : BSD-style (see the LICENSE file) -- --- Maintainer : todd.w.wegner@gmail.com+-- Maintainer : echbar137@yahoo.co.in -- Stability : provisional -- Portability : portable -- -- Exposes virtual cube functionality. -----------------------------------------------------------------------------++{-# LANGUAGE Safe #-}+ module HCube.Lib (Rubik(..), Cube(..), posToId,@@ -251,6 +254,3 @@ fromFile :: FilePath -> IO Rubik fromFile fn = readFile fn >>= return . read---
HCube/OrientGroup.hs view
@@ -1,10 +1,10 @@ ----------------------------------------------------------------------------- -- | -- Module : HCube.OrientGroup--- Copyright : (c) Todd Wegner 2013+-- Copyright : (c) Todd Wegner 2012 -- License : BSD-style (see the LICENSE file) -- --- Maintainer : todd.w.wegner@gmail.com+-- Maintainer : echbar137@yahoo.co.in -- Stability : provisional -- Portability : portable --@@ -12,7 +12,7 @@ -- whole. ----------------------------------------------------------------------------- -{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts #-}+{-# LANGUAGE Safe, MultiParamTypeClasses, FlexibleContexts #-} module HCube.OrientGroup ( Group(..),
HCube/Permutation.hs view
@@ -1,15 +1,18 @@ ----------------------------------------------------------------------------- -- | -- Module : HCube.Permutation--- Copyright : (c) Todd Wegner 2013+-- Copyright : (c) Todd Wegner 2012 -- License : BSD-style (see the LICENSE file) -- --- Maintainer : todd.w.wegner@gmail.com+-- Maintainer : echbar137@yahoo.co.in -- Stability : provisional -- Portability : portable -- -- Generation of permutation representation of cube. -----------------------------------------------------------------------------++{-# LANGUAGE Trustworthy #-}+ module HCube.Permutation (genPerm) where import Math.Algebra.Group.PermutationGroup (Permutation, fromPairs')
HCube/Template.hs view
@@ -1,15 +1,17 @@ ----------------------------------------------------------------------------- -- | -- Module : HCube.Template--- Copyright : (c) Todd Wegner 2013+-- Copyright : (c) Todd Wegner 2012 -- License : BSD-style (see the LICENSE file) -- --- Maintainer : todd.w.wegner@gmail.com+-- Maintainer : echbar137@yahoo.co.in -- Stability : provisional -- Portability : portable -- -- Console visualization of virtual cube. -----------------------------------------------------------------------------+{-# LANGUAGE Trustworthy #-}+ module HCube.Template (render) where import Data.Text (Text, pack, unpack, replace, splitOn)
HCube/Test.hs view
@@ -1,10 +1,10 @@ ----------------------------------------------------------------------------- -- | -- Module : HCube.Test--- Copyright : (c) Todd Wegner 2013+-- Copyright : (c) Todd Wegner 2012 -- License : BSD-style (see the LICENSE file) -- --- Maintainer : todd.w.wegner@gmail.com+-- Maintainer : echbar137@yahoo.co.in -- Stability : provisional -- Portability : portable --@@ -13,17 +13,20 @@ module HCube.Test (runTests) where +{-# LANGUAGE Safe #-}++import Data.Int import Test.QuickCheck.Test(verboseCheckWith,quickCheck,quickCheckWith, Args(..)) import Test.QuickCheck.Arbitrary(Arbitrary, arbitrary, shrink, shrinkIntegral) import Test.QuickCheck.Gen(Gen,sized, choose)-import HCube.Data (Vec, TestNumb(..) )+import HCube.Data (Vec, Numb) import HCube.Lib (posToId, getPos, initCube) import HCube.OrientGroup (Orient (..), rawToOrientNumber, rawOrientNum, orientNumberToRaw) import HCube.Utility (mapVec, modNot, gateMinus, modMinus) -- invariants -idProperty (TestNumb sz) = f where+idProperty sz = f where f = [posToId sz . getPos sz $ a | a <- [1..g]] == [1..g] g = sz*sz*sz @@ -36,7 +39,7 @@ j = gateMinus cd k = modMinus cd 17 -orientProperty :: TestNumb -> Bool +orientProperty :: Numb -> Bool orientProperty _ = orientId args = Args {@@ -49,16 +52,6 @@ args2 = args {maxSuccess = 1, maxDiscardRatio = 1} --instance Arbitrary TestNumb where- arbitrary = arbitraryNumb- shrink = shrinkIntegral--arbitraryNumb :: Gen TestNumb-arbitraryNumb =- sized $ \n ->- let n' = toInteger n in- fmap fromInteger (choose (1, n')) runTests :: IO () runTests = f where
HCube/Theory.hs view
@@ -1,16 +1,18 @@ ----------------------------------------------------------------------------- -- | -- Module : HCube.Theory--- Copyright : (c) Todd Wegner 2013+-- Copyright : (c) Todd Wegner 2012 -- License : BSD-style (see the LICENSE file) -- --- Maintainer : todd.w.wegner@gmail.com+-- Maintainer : echbar137@yahoo.co.in -- Stability : provisional -- Portability : portable -- -- Module for generating tables exhibiting internals of hcube. -- See the design directory for output generated by these functions. -----------------------------------------------------------------------------+{-# LANGUAGE Safe #-}+ module HCube.Theory ( displayColors, displayOrientVecMapping,@@ -107,7 +109,7 @@ -} -- | Shows how colors on a cubie are mapped to orientation. displayColorToOrient :: IO ()-displayColorToOrient = writeFile "colorToOrient" $ unlines . twoPagesOnOne "\t\t"+displayColorToOrient = writeFile "store/colorToOrient" $ unlines . twoPagesOnOne "\t\t" . sort . map f $ map g sideColorDomain where f (((fd1,cl1),(fd2,cl2)), vs) = concat [show cl1 ++ show cl2, " ",
HCube/Utility.hs view
@@ -1,21 +1,33 @@ ----------------------------------------------------------------------------- -- | -- Module : HCube.Utility--- Copyright : (c) Todd Wegner 2013+-- Copyright : (c) Todd Wegner 2012 -- License : BSD-style (see the LICENSE file) -- --- Maintainer : todd.w.wegner@gmail.com+-- Maintainer : echbar137@yahoo.co.in -- Stability : provisional -- Portability : portable -- -- Common utility functions, simple linear algebra. -----------------------------------------------------------------------------+{-# LANGUAGE Safe #-}+ module HCube.Utility where import Control.Monad (foldM, (>=>), liftM, liftM2) import Data.List import HCube.Data import HCube.Common(padL)++-- | Returns square root of argument if argument is a perfect square. +squareRoot :: Int -> Maybe Int+squareRoot nn = f 1 nn where+ f lo hi | lo > hi = Nothing+ | nn == h = Just g+ | nn < h = f lo (g - 1)+ | otherwise = f (g + 1) h where+ g = (hi + lo) `div` 2+ h = g * g -- | Multiple a matrix on the left side of a vector. (|*|) :: Matrix -> Vec -> Vec
− HCube/store/physicalCubeExample
@@ -1,6 +0,0 @@-[(UpS, [White,Green,Yellow,Green,White,Green,Red,White,Green]),- (FrontS, [Blue,Blue,White,Yellow,Orange,Yellow,Red,Yellow,White]),- (DownS, [Yellow,Blue,Green,White,Yellow,Blue,White,Orange,Green]),- (BackS, [Orange,Blue,Orange,Yellow,Red,Red,Red,Orange,Blue]),- (LeftS, [Orange,White,Yellow,Red,Green,Red,Orange,Red,Red]),- (RightS, [Blue,Green,Blue,Orange,Blue,White,Green,Orange,Yellow])]
README view
@@ -0,0 +1,91 @@+----------------------------------------------------------------------------+-- +-- : hcube+-- Copyright : (c) Todd Wegner 2012+-- License : BSD-style (see the LICENSE file)+-- +-- Maintainer : echbar137@yahoo.co.in+-- Stability : provisional+-- Portability : portable+-- +-----------------------------------------------------------------------------++Command line arguments for hcube :++./hcube 2 Loads the 2x2x2 cube state.+./hcube 3 Loads the 3x3x3 cube state.+./hcube 4 Loads the 4x4x4 cube state.+./hcube 5 Loads the 5x5x5 cube state.+./hcube Loads the 3x3x3 cube state.+./hcube <name of physical cube file> Creates cube based on physical file.++Cube is created in a solved state if no previous state for that dimension exists.+Although the library supports cubes of arbitrary size, the hcube executable does not+support sizes beyond 5x5x5.++The state of cube is stored in the 'store' directory with a name based on the dimension+of the cube. For example a 3x3x3 cube is saved as 'solved/3x3x3'.++If the 'solve' directory does not exist it is created.++Loading a physical Cube state :+Physical file must be placed in the 'store' directory.++Sample contents of a physical file for a 3x3x3 cube is :++[(UpS, [White,Green,Yellow,Green,White,Green,Red,White,Green]),+ (FrontS, [Blue,Blue,White,Yellow,Orange,Yellow,Red,Yellow,White]),+ (DownS, [Yellow,Blue,Green,White,Yellow,Blue,White,Orange,Green]),+ (BackS, [Orange,Blue,Orange,Yellow,Red,Red,Red,Orange,Blue]),+ (LeftS, [Orange,White,Yellow,Red,Green,Red,Orange,Red,Red]),+ (RightS, [Blue,Green,Blue,Orange,Blue,White,Green,Orange,Yellow])]++This is a list of six tuples, corresponding to one for each six side of a cube.+A tuple consists of the cube side followed by a list of colors appearing on that cube side.+The tuples can be in any order, however it is easier to use the order given, rotating the cube+about the Left and Right axis to identify the colors of four of the sides.+The order of the colors appear in the list is important and is given by the following diagram :++1 2 3 Right 1 2 3 Up 1 2 3 Left +4 5 6 Side 4 5 6 Side 4 5 6 Side+7 8 9 7 8 9 7 8 9++ 1 2 3 Front+ 4 5 6 Side+ 7 8 9++ 1 2 3 Down+ 4 5 6 Side+ 7 8 9++ 1 2 3 Back+ 4 5 6 Side+ 7 8 9++Console commands for hcube :++help displays command list+l1+ rotate layer 1 clockwise+l2- rotate layer 2 counter+h3+ rotate horizontal slab 3 clockwise+h1- rotate horizontal slab 1 counter+v2+ rotate vertical slab 2 clockwise+v3- rotate vertical slab 3 counter+l left side view+r right side view+r+ rotate whole cube clockwise 90 degrees (z axis)+r- rotate whole cube counter clockwise 90 degrees (z axis)+r2 rotate whole cube 180 degrees+fh flip whole cube over along horizontal axis+fv flip whole cube over along vertical axis+u undo last cube operation++History :+0.1.0 Inital release.+0.1.1 hcube is able to physical cube from a file.++To Do :+1) Add two phase algorithm to solve 3x3x3 cube in minumal number of moves.+2) Add undo.+3) Add sequence macros.+4) Extend to 4x4x4 and 5x5x5.
hcube.cabal view
@@ -1,5 +1,5 @@ name: hcube-version: 0.1.0+version: 0.1.1 synopsis: Virtual Rubik's cube of arbitrary size. description: Provides virtual model of NxNxN Rubik's cube and console visualization for 2x2x2, 3x3x3 ,4x4x4, and 5x5x5. Console visualization is choosen in the interest@@ -9,7 +9,7 @@ The Rubik's cube exhibits many non-trival aspects of group theory. The package comes with an executable "hcube". - The command ./hcube 5 will create a 5x5x5 cube.+ Refer to the README file for details. license: BSD3 license-file: LICENSE @@ -22,7 +22,7 @@ stability: experimental category: Game -data-dir: HCube/store+data-dir: store data-files: physicalCubeExample extra-source-files: README design/common.txt
+ store/physicalCubeExample view
@@ -0,0 +1,6 @@+[(UpS, [White,Green,Yellow,Green,White,Green,Red,White,Green]),+ (FrontS, [Blue,Blue,White,Yellow,Orange,Yellow,Red,Yellow,White]),+ (DownS, [Yellow,Blue,Green,White,Yellow,Blue,White,Orange,Green]),+ (BackS, [Orange,Blue,Orange,Yellow,Red,Red,Red,Orange,Blue]),+ (LeftS, [Orange,White,Yellow,Red,Green,Red,Orange,Red,Red]),+ (RightS, [Blue,Green,Blue,Orange,Blue,White,Green,Orange,Yellow])]