Create a gist now

Instantly share code, notes, and snippets.

@gnarmis /gardner.hs
Last active Dec 10, 2015

What would you like to do?
Gardner's canceling digits puzzle, also related to Project Euler problem #33
-- turn an Integer into a list of digits
digits = map (read . (:[])) . show
-- is a given fraction special?
special :: Integer -> Integer -> Bool
special n d
| (n_rf / d_rf) == ((realToFrac (head ns)) / (realToFrac (head ds))) = True
| otherwise = False
where n_rf = realToFrac n
d_rf = realToFrac d
(ns, ds) = (cancel_digits (digits n) (digits d))
cancel_digits :: (Integral t) => [t] -> [t] -> ([t], [t])
cancel_digits num_digs den_digs
| (null ns) && (null ds) = ([1],[1])
| (null ns) && not (null ds) = ([1],ds)
| not (null ns) && (null ds) = (ns, [1])
| otherwise = (ns,ds)
where ns = [n | n <- num_digs, not (n `elem` den_digs)]
ds = [d | d <- den_digs, not (d `elem` num_digs)]
allCombosUnder100 :: [(Integer, Integer)]
allCombosUnder100 = [(x,y) | x <- [1..100], y <- [1..100]]
specialCombos :: [(Integer, Integer)]
specialCombos = filter (\t -> (special (fromIntegral (fst t))
(fromIntegral (snd t))))
allCombosUnder100
specialNonTrivial :: [(Integer, Integer)]
specialNonTrivial =
filter (\t -> (nonTrivial (orig t) (cancelled t))) specialCombos
where orig t = ((digits (fst t)), (digits (snd t)))
cancelled t = cancel_digits (digits (fst t)) (digits (snd t))
nonTrivial orig cancelled =
not_same && did_cancel && no_zeros
where not_same = (fst cancelled) /= (snd cancelled)
did_cancel = (length (fst orig)) > (length (fst cancelled))
no_zeros = not $ foldl (&&) True (map (elem 0) [(fst orig),(snd orig)])
@jontonsoup

This comment has been minimized.

Show comment Hide comment
@jontonsoup

jontonsoup Dec 28, 2012

haha I cant figure out anything to code in haskell to play around with it. good call :p

haha I cant figure out anything to code in haskell to play around with it. good call :p

@gnarmis

This comment has been minimized.

Show comment Hide comment
@gnarmis

gnarmis Dec 29, 2012

Lol yeah, I've been lookin around for stuff to do in Haskell too

Owner

gnarmis commented Dec 29, 2012

Lol yeah, I've been lookin around for stuff to do in Haskell too

@gnarmis

This comment has been minimized.

Show comment Hide comment
@gnarmis

gnarmis May 3, 2014

answer: specialNonTrivial (not for project euler, just for the 'weird numbers')

Owner

gnarmis commented May 3, 2014

answer: specialNonTrivial (not for project euler, just for the 'weird numbers')

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment