First perfect square in base n with n unique digits: Difference between revisions

Content added Content deleted
m (→‎{{header|Haskell}}: Applicative formulation of `digits` turns out, FWIW, to be a little faster.)
Line 799: Line 799:
import qualified Data.Set as Set
import qualified Data.Set as Set
import Text.Printf (printf)
import Text.Printf (printf)

digits :: Integral a => a -> a -> [a]
digits :: Integral a => a -> a -> [a]
digits b = unfoldr (\d -> guard (d /= 0) >> pure (d `mod` b, d `div` b))
digits b = unfoldr
(((>>) . guard . (0 /=)) <*> (pure . ((,) <$> (`mod` b) <*> (`div` b))))

sequenceForBaseN :: Integral a => a -> [a]
sequenceForBaseN :: Integral a => a -> [a]
sequenceForBaseN
sequenceForBaseN
b = unfoldr (\(v, n) -> Just (v, (v + n, n + 2))) (i ^ 2, i * 2 + 1)
b = unfoldr (\(v, n) -> Just (v, (v + n, n + 2))) (i ^ 2, i * 2 + 1)
where
where
i = succ $ round $ sqrt (realToFrac $ b ^ pred b)
i = succ (round $ sqrt (realToFrac (b ^ pred b)))

searchSequence :: Integral a => a -> Maybe a
searchSequence :: Integral a => a -> Maybe a
searchSequence
searchSequence
Line 814: Line 815:
where
where
digitsSet = Set.fromList [0 .. pred b]
digitsSet = Set.fromList [0 .. pred b]

display :: Integer -> Integer -> String
display :: Integer -> Integer -> String
display b = fmap (intToDigit . fromIntegral) . reverse . digits b
display b n = map (intToDigit . fromIntegral) $ reverse $ digits b n

main :: IO ()
main :: IO ()
main = mapM_
main = mapM_