Skip to content

Instantly share code, notes, and snippets.

@takeouchida
Created August 2, 2014 11:02
Show Gist options
  • Save takeouchida/a616ccd38c74e763ac71 to your computer and use it in GitHub Desktop.
Save takeouchida/a616ccd38c74e763ac71 to your computer and use it in GitHub Desktop.
import Data.List (foldl', intercalate)
import Test.HUnit (Test(..), runTestTT, (~=?))
process :: String -> String
process = intercalate "," . map show . take 10 . foldl' transf [1..]
isSquare n = let x = sqrt (fromIntegral n) in x - fromIntegral (floor x) == 0
--isCube n = let x = (fromIntegral n) ** (1 / 3) in x - fromIntegral (floor x) == 0
isCube n = round (fromIntegral n ** (1 / 3)) ^ 3 == n
doS :: [Int] -> [Int]
doS (n:ns) = doS' False n ns
doS' b n (m:ns)
| isSquare n && b = doS' True m ns
| isSquare n = n : doS' True m ns
| b = doS' False m ns
| otherwise = n : doS' False m ns
dos :: [Int] -> [Int]
dos (n:m:ns)
| isSquare m = dos (m:ns)
| otherwise = n : dos (m:ns)
doC :: [Int] -> [Int]
doC (n:ns) = doC' False n ns
doC' b n (m:ns)
| isCube n && b = doC' True m ns
| isCube n = n : doC' True m ns
| b = doC' False m ns
| otherwise = n : doC' False m ns
doc :: [Int] -> [Int]
doc (n:m:ns)
| isCube m = doc (m:ns)
| otherwise = n : doc (m:ns)
doh = drop 100
doNumber c = map snd . filter (\(i,_) -> mod i n /= 0) . zip [1..]
where
n = fromEnum c - fromEnum '0'
transf :: [Int] -> Char -> [Int]
transf ls c = case c of
'S' -> doS ls
's' -> dos ls
'C' -> doC ls
'c' -> doc ls
'h' -> doh ls
_ -> if c >= '2' && c <= '9'
then doNumber c ls
else ls
main = print =<< runTestTT (TestList $ map toTest testdata)
toTest :: (String, String) -> Test
toTest (input, expected) = expected ~=? process input
testdata =
[ ( "ss6cc24S", "1,9,21,30,33,37,42,44,49,56" )
, ( "h", "101,102,103,104,105,106,107,108,109,110" )
, ( "hh", "201,202,203,204,205,206,207,208,209,210" )
, ( "hhh", "301,302,303,304,305,306,307,308,309,310" )
, ( "2", "1,3,5,7,9,11,13,15,17,19" )
, ( "22", "1,5,9,13,17,21,25,29,33,37" )
, ( "222", "1,9,17,25,33,41,49,57,65,73" )
, ( "3", "1,2,4,5,7,8,10,11,13,14" )
, ( "33", "1,2,5,7,10,11,14,16,19,20" )
, ( "333", "1,2,7,10,14,16,20,23,28,29" )
, ( "s", "1,2,4,5,6,7,9,10,11,12" )
, ( "ss", "1,4,5,6,9,10,11,12,13,16" )
, ( "sss", "4,5,9,10,11,12,16,17,18,19" )
, ( "S", "1,3,4,6,7,8,9,11,12,13" )
, ( "SS", "1,4,7,8,9,12,13,14,15,16" )
, ( "SSS", "1,8,9,13,14,15,16,20,21,22" )
, ( "c", "1,2,3,4,5,6,8,9,10,11" )
, ( "cc", "1,2,3,4,5,8,9,10,11,12" )
, ( "ccc", "1,2,3,4,8,9,10,11,12,13" )
, ( "C", "1,3,4,5,6,7,8,10,11,12" )
, ( "CC", "1,4,5,6,7,8,11,12,13,14" )
, ( "CCC", "1,5,6,7,8,12,13,14,15,16" )
, ( "23", "1,3,7,9,13,15,19,21,25,27" )
, ( "32", "1,4,7,10,13,16,19,22,25,28" )
, ( "2h", "201,203,205,207,209,211,213,215,217,219" )
, ( "h2", "101,103,105,107,109,111,113,115,117,119" )
, ( "sC", "1,4,5,6,7,9,10,11,12,13" )
, ( "Cs", "1,4,5,6,7,8,10,11,12,13" )
, ( "s468", "1,2,4,6,7,11,12,16,17,20" )
, ( "S468", "1,3,4,7,8,12,13,16,18,21" )
, ( "cc579", "1,2,3,4,8,9,11,13,15,16" )
, ( "CC579", "1,4,5,6,8,11,13,15,17,18" )
, ( "85", "1,2,3,4,6,7,9,10,12,13" )
, ( "sh", "110,111,112,113,114,115,116,117,118,119" )
, ( "94h", "150,151,154,155,156,158,159,160,163,164" )
, ( "h9c8", "101,102,103,104,105,106,107,110,111,112" )
, ( "Cc3s", "1,3,5,6,10,11,13,16,17,19" )
, ( "cs4h6", "149,150,152,153,154,157,158,160,161,162" )
, ( "84523c", "1,3,11,15,23,26,34,38,46,49" )
, ( "54C78hS", "228,231,232,233,236,241,242,243,246,247" )
, ( "65h7ccs", "151,152,153,154,157,158,160,163,164,165" )
, ( "c95hSc2C", "145,147,151,153,156,159,162,164,168,171" )
, ( "c5h3Ss794", "130,131,133,137,138,142,148,150,152,157" )
, ( "7ShscC846", "129,130,131,134,135,139,141,142,146,148" )
, ( "cshSCCS7ch", "253,254,256,259,260,261,263,264,265,266" )
, ( "hhC7849Ss6C", "201,202,203,205,206,211,212,216,220,225" )
, ( "hhsc3C987Ccs", "201,202,204,205,207,208,214,217,218,220" )
, ( "SC7S8hc59ss2", "162,169,174,178,182,185,188,194,199,203" )
, ( "s7S6c35C9CShc", "367,371,377,379,380,385,387,388,392,395" )
, ( "4scC3hh982Cc5s", "422,426,430,434,447,451,459,463,471,479" )
, ( "23h465Ssc9CchC", "1027,1033,1045,1047,1057,1069,1071,1075,1081,1093" )
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment