Lucky and even lucky numbers: Difference between revisions

Haskell example using laziness. This example uses regular expressions and data types.
m (corrected a misspelling.)
(Haskell example using laziness. This example uses regular expressions and data types.)
Line 89:
* Entry [http://mathworld.wolfram.com/LuckyNumber.html lucky numbers] on The Eric Weisstein's World of Mathematics.
 
=={{header|Haskell}}==
 
<lang Haskell>Implementation:
import System.Environment
import System.Exit
import Data.Char
import Text.Regex.Posix
 
data Lucky = Lucky | EvenLucky
 
helpMessage :: IO ()
helpMessage = do
putStrLn " what is displayed (on a single line)"
putStrLn " argument(s) (optional verbiage is encouraged)"
putStrLn "======================|==================================================="
putStrLn " j | Jth lucky number "
putStrLn " j , lucky | Jth lucky number "
putStrLn " j , evenLucky | Jth even lucky number "
putStrLn " "
putStrLn " j k | Jth through Kth (inclusive) lucky numbers "
putStrLn " j k lucky | Jth through Kth (inclusive) lucky numbers "
putStrLn " j k evenlucky | Jth through Kth (inclusive) even lucky numbers "
putStrLn " "
putStrLn " j -k | all lucky numbers in the range j -> |k| "
putStrLn " j -k lucky | all lucky numbers in the range j -> |k| "
putStrLn " j -k evenlucky | all even lucky numbers in the range j -> |k| "
putStrLn "======================|==================================================="
 
oddNumbers :: [Int]
oddNumbers = filter odd [1..]
 
evenNumbers :: [Int]
evenNumbers = filter even [1..]
 
luckyNumbers :: [Int] -> [Int]
luckyNumbers xs =
let i = 3 in
sieve i xs
where
sieve i (ln:s:xs) =
ln : sieve (i + 1) (s : [x | (n, x) <- zip [i..] xs, rem n s /= 0])
 
nth :: Int -> Lucky -> Int
nth j l = case l of
Lucky -> last (take j (luckyNumbers oddNumbers))
EvenLucky -> last (take j (luckyNumbers evenNumbers))
 
range :: Int -> Int -> Lucky -> [Int]
range x x' l = case l of
Lucky -> let n = length (take x (luckyNumbers oddNumbers)) in
drop (n-1) (take x' (luckyNumbers oddNumbers))
EvenLucky -> let n = length (take x (luckyNumbers evenNumbers)) in
drop (n-1) (take x' (luckyNumbers evenNumbers))
 
interval :: Int -> Int -> Lucky -> [Int]
interval x x' l = let x'' = (-1 * x') in
case l of
Lucky -> let n = length (takeWhile (<x) (luckyNumbers oddNumbers)) in
drop (n-1) (takeWhile (<x'') (luckyNumbers oddNumbers))
EvenLucky -> let n = length (takeWhile (<x) (luckyNumbers evenNumbers)) in
drop (n-1) (takeWhile (<x'') (luckyNumbers evenNumbers))
 
lucky :: [String] -> Lucky
lucky xs =
if (not (null (filter (== "evenLucky") xs)))
then EvenLucky
else Lucky
 
readn :: String -> Int
readn s = read s :: Int
 
isInt :: String -> Bool
isInt s = length (s =~ "-?[0-9]{0,10}" :: String) > 0
 
main :: IO ()
main = do
args <- getArgs
if head args == "--help" || null args
then
helpMessage
else
let numArgs = map readn (filter isInt args) in
if null numArgs
then do
print "Invalid input, missing arguments"
print "Type --help"
exitWith ExitSuccess
else
let l = lucky args in case length numArgs of
1 -> do
print (nth (head numArgs) l)
exitWith ExitSuccess
2 -> if last numArgs > 0
then do
print (range (head numArgs) (last numArgs) l)
exitWith ExitSuccess
else do
print (interval (head numArgs) (last numArgs) l)
exitWith ExitSuccess
otherwise -> do
print "Invalid input, wrong number of arguments"
print "Type --help"
exitWith ExitSuccess</lang>
{{out}}
<pre>$ luckyNumbers 12
43
$ luckyNumbers 122 lucky
745
$ luckyNumbers 1231 evenLucky
10658
$ luckyNumbers 2 12
[3,7,9,13,15,21,25,31,33,37,43]
$ luckyNumbers 22 31 lucky
[93,99,105,111,115,127,129,133,135,141]
$ luckyNumbers 219 231 evenLucky
[1458,1462,1466,1476,1478,1482,1484,1492,1498,1508,1514,1524,1538]
$ luckyNumbers 100 -200
[99,105,111,115,127,129,133,135,141,151,159,163,169,171,189,193,195]
$ luckyNumbers 1 -100 lucky
[1,3,7,9,13,15,21,25,31,33,37,43,49,51,63,67,69,73,75,79,87,93,99]
$ luckyNumbers 1 -100 evenLucky
[2,4,6,10,12,18,20,22,26,34,36,42,44,50,52,54,58,68,70,76,84,90,98]</pre>
=={{header|J}}==
 
Anonymous user