54 lines
1.1 KiB
Haskell
54 lines
1.1 KiB
Haskell
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
|