0votos

Shin Woo en Haskell

por josejuan hace 5 años

Definiciones y chequeo de propiedades.

Crea un diagrama y/0 pseudocódigo que imprima los números impares del 0 hasta n, que muestres cuantos pares e impares hay.

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import Data.List (partition) 
import Test.QuickCheck (quickCheck) 
 
 
esPar :: Int -> Bool 
esPar x = x `rem` 2 == 0                         -- Un número es par si es divisible por 2. 
 
shinWoo :: Int -> (Int, Int, [Int]) 
shinWoo n = (npares, nnones, nones)              -- Piden el nº de pares, de nones y los nones. 
  where numeros = [0..n]                         -- De entre los números entre 0 y n. 
        (pares, nones) = partition esPar numeros -- Partimos el conjunto por su paridad. 
        npares = length pares                    -- Contamos el nº de pares. 
        nnones = length nones                    -- Contamos el nº de impares. 
 
 
 
 
 
-- Tests -------------------------------------------------- 
 
-- Un número (entero) es par (en base 10) si su dígito menos significativo es par 
test_esPar = quickCheck (\x -> esPar x == ((last.show) x `elem` "02468")) 
 
-- La salida son el nº de impares, luego no puede ser muy grande 
quickCheck_ShinWoo prop = quickCheck (\n -> prop ((abs n) `mod` 1000)) 
 
-- El número de pares de 0..n es uno mas la mitad de n 
test_shinWooPares = quickCheck_ShinWoo (\n -> (\(p, _, _) -> p == 1 + (n `div` 2)) $ shinWoo n) 
 
-- El número de impares de 0..n es el del número de pares de 0..n-1 
test_shinWooNones = quickCheck_ShinWoo (\n -> (\(_, i, _) -> i == 1 + ((n - 1) `div` 2)) $ shinWoo n) 
 
-- La suma de los impares de 0..n es el cuadrado del nº de impares 
test_shinWooLNones = quickCheck_ShinWoo (\n -> (\(_, _, w) -> sum w == (1 + ((n - 1) `div` 2))^2) $ shinWoo n) 
 
 
-- Todos los tests 
tests = do 
  putStr "test_esPar " 
  test_esPar 
  putStr "test_shinWooPares " 
  test_shinWooPares 
  putStr "test_shinWooNones " 
  test_shinWooNones 
  putStr "test_shinWooLNones " 
  test_shinWooLNones 
 
 
{- 
 
*** Por ejemplo *** 
 
 
*Main> :l par.hs 
[1 of 1] Compiling Main             ( par.hs, interpreted ) 
Ok, modules loaded: Main. 
 
*Main> tests 
test_esPar +++ OK, passed 100 tests. 
test_shinWooPares +++ OK, passed 100 tests. 
test_shinWooNones +++ OK, passed 100 tests. 
test_shinWooLNones +++ OK, passed 100 tests. 
 
*Main> shinWoo 10 
(6,5,[1,3,5,7,9]) 
 
*Main> shinWoo 11 
(6,6,[1,3,5,7,9,11]) 
 
*Main> shinWoo 9 
(5,5,[1,3,5,7,9]) 
 
*Main> shinWoo 0 
(1,0,[]) 
 
*Main> shinWoo (-1) 
(0,0,[]) 
 
*Main> 
 
 
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.