0votos

Llanura de numeros iguales con longitud igual a n. En Python simple 3.2 en Haskell

por josejuan hace 4 años

En la hipótesis que una llanura es la repetición consecutiva de un mismo elemento.

Especificar, implementar y demuestrar correctitud para el problema de indicar si una lista de enteros tiene una llanura de longitud mayor o igual a n.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
-- Usando funciones estándar sobre listas (group) 
llanura n = any (n<=) . map length . group 
 
 
 
-- Usando funciones estándar de Haskell (scan) *** la más eficiente, no cuenta la llanura completa si no hace falta 
llanura0 _     [] = False 
llanura0 n (w:ws) = not.null.dropWhile ((n>).fst).scanl (\(z, y) x -> if y == x then (z + 1, y) else (1, x)) (1, w) $ ws 
 
 
 
-- Usando funciones estándar de Haskell (take/drop) 
llanura1 _     []   = False 
llanura1 n xs@(x:_) = length (takeWhile (x==) xs) >= n || llanura1 n (dropWhile (x==) xs) 
 
 
 
-- Sin usar ningún tipo de función 
llanura2 _       [] = False 
llanura2 n xs@(x:_) = ll n xs 
                      where ll 0  _         = True 
                            ll _ []         = False 
                            ll z yss@(y:ys) | x == y = ll (z - 1) ys 
                                            | x /= y = llanura2 z yss 
 
 
{- 
 
 Podemos testear fácilmente sobre miles de instancias que las cuatro funciones producen el mismo resultado: 
 
*Main Test.QuickCheck> quickCheckWith (stdArgs {maxSuccess = 20000}) (\a b -> llanura (abs a) b == llanura0 (abs a) b) 
+++ OK, passed 20000 tests. 
*Main Test.QuickCheck> quickCheckWith (stdArgs {maxSuccess = 20000}) (\a b -> llanura (abs a) b == llanura1 (abs a) b) 
+++ OK, passed 20000 tests. 
*Main Test.QuickCheck> quickCheckWith (stdArgs {maxSuccess = 20000}) (\a b -> llanura (abs a) b == llanura2 (abs a) b) 
+++ OK, passed 20000 tests. 
*Main Test.QuickCheck> 
 
 
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.