Skip to content
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
53 lines (38 sloc) 2.47 KB
import Text.Show.Functions
data Tesoro = UnTesoro String Int deriving (Show, Eq)
data Pirata = UnPirata String [Tesoro] deriving (Show, Eq)
type FormaDeSaqueo = (Tesoro->Bool)
data Barco = UnBarco [Pirata] FormaDeSaqueo deriving Show
data Isla = UnaIsla Tesoro
valor (UnTesoro _ unValor) = unValor
nombreTesoro (UnTesoro unNombre _) = unNombre
tesoros (UnPirata _ unosTesoros) = unosTesoros
nombrePirata (UnPirata unNombre _) = unNombre
cantidadTesoros pirata = (length.tesoros) pirata
valorTesoros pirata = map valor (tesoros pirata)
esAfortunado unPirata = sum (valorTesoros unPirata)
tienenMismoTesoro pirata1 pirata2 = compartenTesoro (tesoros pirata1) (tesoros pirata2)
compartenTesoro tesoros1 tesoros2 = any (loTieneEnLista tesoros1) tesoros2
loTieneEnLista tesoros unTesoro = any (igualPeroDistintoPrecio unTesoro) tesoros
igualPeroDistintoPrecio (UnTesoro n v) (UnTesoro n2 v2) = n == n2 && v == v2
pirataConTesoro (UnPirata nombre objetos) unTesoro = UnPirata nombre (unTesoro:objetos)
pirataSin criterio (UnPirata nombre objetos) = UnPirata nombre (filter criterio objetos)
pirataSinValiosos pirata = pirataSin barato pirata
parataSinNombre nombre pirata = pirataSin (nombreNoEs nombre) pirata
barato objeto = valor objeto < 100
nombreNoEs unNombre objeto = (nombreTesoro objeto) /= unNombre
saquearTesoroValioso tesoro = (not.barato) tesoro
saquearTesoroEspecifico tesoroQueDeberiaSer tesoro = tesoroQueDeberiaSer == (nombreTesoro tesoro)
saquearConjuncion formasDeSaquear tesoro = any (flip ($) tesoro) formasDeSaquear
saquear pirata formaDeSaqueo tesoro | formaDeSaqueo tesoro = pirataConTesoro pirata tesoro
| otherwise = pirata
-- saquear (UnPirata "asdf" []) (saquearConjuncion [saquearTesoroValioso, saquearTesoroEspecifico "asdf"]) (UnTesoro "asdf" 2)
incorporarPirata (UnBarco tripulantes forma) pirata = UnBarco (pirata:tripulantes) forma
-- incorporarPirata (UnBarco [] saquearTesoroValioso) (UnPirata "asdf" [])
-- UnBarco [UnPirata "asdf" []] <function>
tripulantesSin pirata tripulantes = filter (not.(== pirata)) tripulantes
abandonar (UnBarco tripulantes forma) pirata = UnBarco (tripulantesSin pirata tripulantes) forma
--abandonar (UnBarco [UnPirata "asdf" []] saquearTesoroValioso) (UnPirata "asdf" [])
-- UnBarco [] <function>
anclar (UnBarco tripulacion formaDeSaqueo) (UnaIsla tesoro) = UnBarco (todosToman tesoro tripulacion) formaDeSaqueo
todosToman tesoro tripulacion = map (flip pirataConTesoro tesoro) tripulacion
You can’t perform that action at this time.