forked from cacaicedo/Mastermind
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfunciones.hs
113 lines (91 loc) · 3.52 KB
/
funciones.hs
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
{-
Archivo Funciones.hs
Autores : Leonardo Tamayo
Victor Rodriguez
Carlos Caicedo
Fecha: 3/02/2013
-}
module Funciones where
import Control.Monad
import Data.List
import System.Random
elem' :: Int -> [Int] -> Bool
elem' a [] = False
elem' a x =
if(a == (head x))
then True
else
elem' a (tail x)
------------------------------------------------------------------
--Recibo la cantidad inicial, la cantidad final, y el incremento
--for' :: Int-> Int-> Int-> ()
--for' :: Int-> Int-> Int-> [Char]->IO()
for' a b c cont =
if (a>=b) then return ()
else do
putStrLn (show cont)
for' (a+c) b c cont
-------------------------------------------------------------------
for'' a b c cont =
if (a<b) then do
putStrLn (show cont)
for' (a+c) b c cont
else
return ()
--------------------------------------------------------------------
add' lista elem =
if(null lista) then return elem
else do
let cabeza = head lista
cabeza ++ (add' (tail lista) elem)
add'' lista elem = lista ++ elem
add''' lista elem = return (lista ++ elem)
{--------------------------------------------------------------
Implementacion del 2do while del algoritmo
----------------------------------------------------------------}
while2 h maxgen ei maxsize =
if(h<=maxgen && length(ei)<=maxsize) then do
putStrLn("Generar poblacion")
putStrLn("Calcular fitness")
while2 (h+1) maxgen (add'' ei [1]) maxsize
else return()
{--------------------------------------------------------------
Implementacion del 1er while del algoritmo
----------------------------------------------------------------}
while1 = do
putStr " Ingrese cuantas colores correctos en lugares correctos: "
blancas<-getLine
putStr " Ingrese cuantas colores correctos en lugares incorrectos: "
negras<-getLine
when (blancas /= "4") $ do
while2 1 4 [3,4,6] 5
while1
{--------------------------------------------------------------
Funcion que retorna el numero de fichas que tienen el color correcto
en el lugar correcto
----------------------------------------------------------------}
fichasNegras :: [Int] -> [Int] -> Int
fichasNegras [] [] = 0
fichasNegras l1 l2 = do
let a = head l1
let b = head l2
if(a == b)then 1 + fichasNegras (tail l1) (tail l2)
else do 0 + fichasNegras (tail l1) (tail l2)
{--------------------------------------------------------------
Funcion que retorna el numero de fichas solo con el color correcto
----------------------------------------------------------------}
fichasBlancas :: [Int] -> [Int] -> Int
fichasBlancas l1 l2 = (length( l1 `intersect` l2)) - (fichasNegras l1 l2)
{--------------------------------------------------------------
Funcion de fitness para determinar combinaciones apropiadas
----------------------------------------------------------------}
fitness :: [Int] -> [Int] -> Int -> Int -> Bool
fitness l1 l2 fn fb = do
let fn1 = fichasNegras l1 l2
let fb1 = fichasBlancas l1 l2
if (fn==fn1 && fb==fb1) then True
else False
{--------------------------------------------------------------
Implementacion de la funcion de numeros Aleatorios
----------------------------------------------------------------}
generarAleatorio min max = randomRIO (min, max) :: IO Int