2017-10-11 3 views
1

J'ai des difficultés à parcourir une liste. J'ai fait ce code qui me donne une liste de nombres qui sont également divisés par la somme de leurs chiffres. Par exemple, considérons le nombre 123: 123/6 = 20,5, de sorte qu'il ne sera pas dans la liste. D'une autre part 280 sera sur la liste, parce que 280/10 = 28.Trouver des "lacunes" dans une liste de nombres

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]

Mais mon problème est maintenant: dans la liste ci-dessus, je ne veux que les chiffres qui ne sera pas un "voisin" dans un écart de 5 unités. Par exemple, le nombre 300 sera dans la nouvelle liste parce que ses voisins (288 et 306) ne sont pas dans l'écart de 5 unités.

Je suis arrivé ce code:

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

Je suis un débutant, quelqu'un peut-il aider?

+0

Ne pas utiliser le sol, utiliser div. – augustss

Répondre

2

Un facile, mais pas très efficace, moyen serait de faire une fonction d'assistance qui vérifie s'il y a un élément d'une liste dans une certaine plage:

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

(indice: vous pouvez utiliser le any fonction)

et vous pouvez l'inclure dans votre liste de compréhension:

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

Un autre idiome que vous pourriez envisager est de compresser une liste avec sa propre queue. Ainsi, vous pouvez faire:

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)] 

Ce qui vous donnera chaque élément de la liste avec son « contexte », l'élément juste avant et après. Peut-être que vous pouvez comprendre comment l'utiliser pour ce dont vous avez besoin.