2017-10-11 19 views
1

私はあなたの専門知識をもう一度必要としています。経験が不足しているため、ハスケルと苦労しています。私はリスト(inac)を持っており、そのリスト内の数字をチェックする必要があります。例えば、5つの数字の半径には何もありません。たとえば、私のリストに300という数字があります。その後、存在しない場合と305は、300が別のリストになります(rInac)今リスト番号半径確認

dig :: Int -> [Int] 
dig 0 = [] 
dig n = dig (n `div` 10) ++ [n `mod` 10] 

inac :: [Int] 
inac = [x | x <- [1..999], x `mod` sum (dig x) == 0] 

rInac :: [Int] 
rInac = [x | x <- inac, rAux x] 

rAux :: Int -> Bool 
rAux n = n `elem` inac 

私は数字だけ(n)がリストに属していることを確認しています、私の問題があり、私はわかりませんよどのように5半径のことを行う方法の... ありがとうございます!

+0

ここでは、リストが効率的ではないので、リストはこのための良いデータ構造だとは思わない。 –

+0

@WillemVanOnsem inacとrInacはリストにする必要がありますが、今はチェックする方法がわかりません... – Wireless

答えて

0

any関数を使用して、リストに特定の述語を満たす値が含まれているかどうかを判断できます。たとえば:

any odd [1,2,3,4] -- True 
any odd [2,4]  -- False 

あなたがしなければならないが、数が5の半径であるかどうかを判断でしょう述語関数を作るです:

rAux :: Int -> Bool 
rAux n = any isWithinFive inac 
    where 
     isWithinFive x = x >= n-5 && x <= n+5 

しかし、これはあなたの空が得られますrInacリストすべての数値はそれ自身の半径5内にあるため、この述部はinacリストのすべての数値に対して保持されます。そのような(リストがソートされると仮定すると、

rAux :: Int -> Bool 
rAux n = any isWithinFive inac 
    where 
     isWithinFive x = x /= n && x >= n-5 && x <= n+5 
+0

ねえ、あなたがそこに書いたものを実行しました。両方の方法で、私が期待していたものを手に入れませんでした私は自分自身を間違って説明したかもしれない、私は数字のシリーズを持っているinacリストを持っている、とinacの数字から、私はどのようなものが孤立しているかをチェックしたい、意味は、前後に5つの数字を入れてrInacのリストに入れてください。 (inacリストには特定の番号があり、30個のrInac番号があるはずです) – Wireless

+0

リストに孤立した番号しか含まれないようにするには、近くに隣接するものは含めないでください。 'not'関数を使って条件を否定することができます。 –

0

、有界タイプの:私は本当に何をたいことは与えられた数から5以内の数字が存在するかどうかを確認、しかし、与えられた数自体を除くためにあると思われます64ビットマシンでは+/- 2^63)に近づかないことを心に留めておいてください。次のコードはかなり直感的かつ効率的でなければなりません(つまり、定数スペースでO(n) GHCオプティマイザ)は、その仕事をしている:例えば

gapped :: Int -> [Int] -> [Int] 
gapped g a = map fst $ filter test $ zip a $ zip (minBound:a) (tail a ++ [maxBound]) 
    where 
    test (x, (l, u)) = l+g < x && x < u-g 

、あなたの他のコードを使用して、gapped 5 inacの利回り:

[90,126,162,171,180,300,342,351,432,531,540,576,612,660,666,684,690,756,792,810,840,846,864,888,954,960,966,972,990,999]

答えは、あなたが探していたということですか?