kotapiku
11/15/2017 - 3:13 PM

tsg03

rot :: Int -> [Char] -> [Char]
rot 0 a = a
rot n a = rot (n-1) [rotsucc x | x <- a]

rotsucc :: Char -> Char
rotsucc 'z' = 'a'
rotsucc 'Z' = 'A'
rotsucc a = if elem a (['a'..'z'] ++ ['A'..'Z']) then (succ a) else a

myzipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
myzipWith f [] a = []
myzipWith f a [] = []
myzipWith f a b = (f (head a) (head b)) : (myzipWith f (tail a) (tail b))

myflip :: (a -> b -> c) -> b -> (a -> c)
myflip f x y = f y x

mymap :: (a -> b) -> [a] -> [b]
mymap f a = [f x | x <- a]

myfilter :: (a -> Bool) -> [a] -> [a]
myfilter f a = [x | x <- a, f x]

mytakeWhile :: (a -> Bool) -> [a] -> [a]
mytakeWhile f a = if f (head a) then [head a] ++ (mytakeWhile f (tail a)) else []

collazlist :: Int -> [Int]
collazlist a
    | a == 1 = [a]
    | even a = a:(collazlist (div a 2))
    | otherwise = a:(collazlist (3*a+1))

collaztrue :: Int -> Bool
collaztrue n = (length (collazlist n)) > 15

collaz :: [Int] -> [Int]
collaz = filter collaztrue

lambda15 :: [a] -> Bool
lambda15 = \a -> (length a)>=15

isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral

isprime :: Int -> Bool
isprime n
    | n <= 1 = False
    | otherwise = foldr (\a b -> ((rem n a) /= 0 && b)) True [2..(isqrt n)]

-- filter isprime [1..] で無限素数リストを得る