2017-10-11 68 views
1

我在通過列表時遇到問題。我做了這個代碼,它給了我一個數字的列表,它們被數字的總和平分。例如,考慮數字123:123/6 = 20.5,所以它不會在列表中。一個另一方面280將在名單上,因爲10分之280= 28查找數字列表中的「空白」

let inaHelper x = (floor(x)`mod`10)+ (floor(x/10)`mod`10)+(floor(x/100)`mod`10) 

let ina = [x | x <- [1..999] , x `mod` (inaHelper x) == 0 ] 

[1,2,3,4,5,6,7,8,9,10,12,18,20,21,24,27,30,36,40,42,45,48,50,54,60,63,70,72,80,81,84,90,100,102,108,110,111,112,114,117,120,126,132,133,135,140,144,150,152,153,156,162,171,180,190,192,195,198,200,201,204,207,209,210,216,220,222,224,225,228,230,234,240,243,247,252,261,264,266,270,280,285,288,300,306,308,312,315,320,322,324,330,333,336,342,351,360,364,370,372,375,378,392,396,399,400,402,405,407,408,410,414,420,423,432,440,441,444,448,450,460,465,468,476,480,481,486,500,504,506,510,511,512,513,516,518,522,531,540,550,552,555,558,576,588,592,594,600,603,605,612,621,624,629,630,640,644,645,648,660,666,684,690,700,702,704,711,715,720,730,732,735,736,738,756,770,774,777,780,782,792,800,801,803,804,810,820,825,828,832,840,846,864,870,874,880,882,888,900,902,910,912,915,918,935,936,954,960,966,972,990,999]

但現在我的問題是:從上面的列表,我只希望這些數字不會有「鄰居」在5個單位的差距內。例如,數字300將在新列表中,因爲它的鄰居(288和306)不在5單位差距內。

,我想出了此代碼:

let rare = [ x | x <- [ina] , ((x-5) >= [ina-1]) && ((x+5) <= [ina+1]) ] 

我是初學者,能有人幫助?

+0

不要使用地板,使用div。 – augustss

回答

2

一個簡單的,雖然不是很有效,方法是使一個輔助函數,它檢查是否有一定的範圍內的一個列表的元素:

hasElemInRange :: (Int,Int) -> [Int] -> Bool 
hasElemInRange (lo, hi) xs = -- left as exercise 

(提示:你可以使用any功能)

,然後你可以將其包含在你的列表理解:

let rare = [ x | x <- ina, hasElemInRange (x-5,x+5) ina ] 

另一個你可能會考慮的習慣是用自己的尾巴壓縮一個列表。所以你可以這樣做:

ghci> let xs = [1,2,3,4,5,6,7] 
ghci> zip3 xs (tail xs) (tail (tail xs)) 
[(1,2,3),(2,3,4),(3,4,5),(4,5,6),(5,6,7)] 

這將給你列表的每個元素與其「上下文」,該元素前後的元素。也許你可以弄清楚如何使用它來滿足你的需求。