import Data.Bool (bool) import Data.List (inits, intercalate, transpose) ------------------------ REP-CYCLES ---------------------- repCycles :: String -> [String] repCycles cs = filter ((cs ==) . take n . cycle) ((tail . inits) $ take (quot n 2) cs) where n = length cs --------------------------- TEST ------------------------- main :: IO () main = putStrLn $ fTable "Longest cycles:\n" id ((flip bool "n/a" . last) <*> null) repCycles [ "1001110011", "1110111011", "0010010010", "1010101010", "1111111111", "0100101101", "0100100", "101", "11", "00", "1" ] ------------------------- GENERIC ------------------------ fTable :: String -> (a -> String) -> (b -> String) -> (a -> b) -> [a] -> String fTable s xShow fxShow f xs = let rjust n c = drop . length <*> (replicate n c <>) w = maximum (length . xShow <$> xs) in unlines $ s : fmap ( ((<>) . rjust w ' ' . xShow) <*> ((" -> " <>) . fxShow . f) ) xs