import Data.Ix import Data.Maybe import qualified Data.Set as S main = do dat <- readFile "pixel.in" mapM_ (pp.solve) $ parse dat parse dat = f $ lines dat where f (size:fs:rs) | size/="0" = let n = read size in (n, g n fs):f rs f _ = [] g n fs = foldr (\w f -> fromJust (lookup w funcs) n . f) id $ words fs funcs = [ ("id" ,\n -> id) , ("id-" ,\n -> id) , ("rot" ,\n (x,y) -> (y,n-1-x)) , ("rot-" ,\n (x,y) -> (n-1-y,x)) , ("sym" ,\n (x,y) -> (n-1-x,y)) , ("sym-" ,\n (x,y) -> (n-1-x,y)) , ("bhsym" ,\n (x,y) -> if y if y if y if y (x,y`div`2 + n`div`2*(y`mod`2))) , ("div-" ,\n (x,y) -> (x,(2*y`mod`n)+(2*y`div`n))) , ("mix" ,\n (x,y) -> let (a,b) = (x`div`(n`div`2),y`mod`2) in (2*x-n*a+b,y+a-b)) , ("mix-" ,\n (x,y) -> (x`div`2+(y`mod`2)*n`div`2,y+x`mod`2-y`mod`2)) ] solve (n,f) = inner S.empty (range ((0,0),(n-1,n-1))) where inner _ [] = 1 inner s (p:ps) | p `S.member` s = inner s ps | otherwise = let (n,ns) = g s p in lcm n (inner ns ps) where g s p | p `S.member` s = (0,s) | otherwise = let (n,ns) = g (p `S.insert` s) (f p) in (1+n,ns) pp n = print n