26 lines
838 B
Haskell
26 lines
838 B
Haskell
|
#!/usr/bin/env nix-script
|
||
|
#!>haskell
|
||
|
|
||
|
{- Mathematical way to convert a diceware number. -}
|
||
|
|
||
|
import Data.List (elemIndex)
|
||
|
|
||
|
-- | Convert a decimal numeral n into k-adic base system.
|
||
|
--
|
||
|
-- \boldsymbol{A}_k(n) = \sum_{j=0}^{m-1} 10^j \ [1 + \delta_j \mod k]
|
||
|
-- where m = \bigl \lfloor \log_k [n(k-1)+1] \bigr \rfloor
|
||
|
-- \delta_j = \left \lfloor\frac{n(k-1)+1-k^m}{k^j(k-1)} \right \rfloor
|
||
|
a :: Int -> Int -> Int
|
||
|
a k n = sum [(1 + (d j) `mod` k) * 10^j | j <- [0..m-1]]
|
||
|
where
|
||
|
m = floor $ logBase k' (n'*(k'-1) + 1)
|
||
|
d j = (n*(k-1) + 1 - k^m) `div` ((k-1) * k^j)
|
||
|
(k', n') = (fromIntegral k, fromIntegral n)
|
||
|
|
||
|
interact' :: (String -> String) -> IO ()
|
||
|
interact' f = interact (unlines . map f . lines)
|
||
|
|
||
|
main :: IO ()
|
||
|
main = interact' (show . d . read) where
|
||
|
d = flip elemIndex $ map (a 6 . (+1555)) [0..7775]
|