UTNianos

Versión completa: [APORTE] Paradigmas de Programación - Parciales resueltos
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola aca les dejo parciales resueltos por mi de la materia Paradigmas de Programación, que la curse en el segundo cuatrimestre del 2011.
Los resueltos de lógico son archivos .pl que pueden ser editados desde cualquier editor de texto y ejecutados desde SWI-Prolog. Los resueltos de funcional son archivos .hs que pueden ser editados desde cualquier editor de texto y ejecutados desde WinHugs en Windows. Y por último los resueltos de objetos pueden ser editados y ejecutados desde Smalltalk o Pharo. Si tienen dudas al respecto de estos programas y/o querer descargarlos pueden dirigirse a la página de la cátedra PDEP
Los enunciados de los parciales fueron obtenidos de la página de la cátedra de la materia.

Contenido del archivo:

- 4 parciales del paradigma lógico resueltos con sus enunciados adjuntos.
- 2 parciales del paradigma funcional resueltos con sus enunciados adjuntos.
- 1 parcial del paradigma orientado a objetos resuelto con su enunciado adjunto
Sos un genio! Esto me viene como anillo al dedo; estoy medio hasta las bolas con logico... Gracias!
Buenas noches, estoy tratando de resolver este ejercicio que nos dio Valeria Pennella Dragon Nube ( https://docs.google.com/document/d/1fNBC...AEvv0/edit ), si alguien lo tiene hecho para ver como lo hizo se lo agradecería.
Muchas gracias.
Subo solución del parcial de objetos que hizo el pibe a Texto plano

Object subclass: #Barco
instanceVariableNames: 'tripulantes capacidad mision'
classVariableNames: ''
package: 'YAAARPiratas'

Object subclass: #CiudadCostera
instanceVariableNames: 'ciudadanos'
classVariableNames: ''
package: 'YAAARPiratas'

Object subclass: #Mision
instanceVariableNames: ''
classVariableNames: ''
package: 'YAAARPiratas'

Mision subclass: #BusquedaDelTesoro
instanceVariableNames: ''
classVariableNames: ''
package: 'YAAARPiratas'

Mision subclass: #ConvertirseEnLeyenda
instanceVariableNames: 'itemObligatorio'
classVariableNames: ''
package: 'YAAARPiratas'

Mision subclass: #Saqueo
instanceVariableNames: 'objetivo'
classVariableNames: 'CantidadMonedas'
package: 'YAAARPiratas'

Object subclass: #Pirata
instanceVariableNames: 'items monedas nivelDeEbriedad invitadoPor'
classVariableNames: ''
package: 'YAAARPiratas'

Pirata subclass: #EspiaCorona
instanceVariableNames: ''
classVariableNames: ''
package: 'YAAARPiratas'


------------- ° -------------

#Barco
>>anclasEn: unaCiudadCostera
| elMasEbrio |
tripulantes do: [ : unTripulante | unTripulante pediteUnTrago ].
elMasEbrio := self tuPirataMasEbrio.
self perdisteA: elMasEbrio en: unaCiudadCostera.

>>cuantosTenesPasados
^ self tripulantesPasados size.

>>cuantosTiposDeItemsTenes
| tripulantesPasados |
tripulantesPasados := tripulantes select: [ : unTripulante | unTripulante estaPasado ].
^ tripulantesPasados inject: Set new into: [ : items : unTripulante | items union: (unTripulante susItems) ].

>>incorporaSiPodesA: unPirata
(self puedeEntrar: unPirata)
ifTrue: [ tripulantes add: unPirata ].

>>initialize
tripulantes := Bag new.

>>perdisteA: unTripulante en: unaCiudadCostera
tripulantes remove: unTripulante.
unaCiudadCostera tuNuevoCiudadanoEs: unTripulante.

>>podesSerVictimaDe: unPirata
^ unPirata estaPasado.

>>puedeCumplirSuMision
^(mision tieneSuficienteTripulacion: self) and: [ mision puedeRealizarla: self ].

>>puedeEntrar: unPirata
^(tripulantes size +1 <= capacidad) and: [ mision esUtil: unPirata ].

>>quienInvitoMas: unTripulante o: otroTripulante
| invitados1 invitados2 |
invitados1 := tripulantes select: [ : tripulante | tripulante fuisteInvitadoPor: unTripulante ].
invitados2 := tripulantes select: [ : tripulante | tripulante fuisteInvitadoPor: otroTripulante ].
(invitados1 size >= invitados2 size )
ifTrue: [ ^unTripulante. ]
ifFalse: [ ^otroTripulante. ].

>>sosTemible
^ self puedeCumplirSuMision.

>>sosVulnerableA: unBarco
^ (self susTripulantes size) <= (unBarco susTripulantes size / 2).

>>suCapacidad
^capacidad.

>>susTripulantes
^tripulantes.

>>tieneA: unItem
^ tripulantes anySatisfy: [ : unTripulante | unTripulante unItemEs: unItem ] .

>>tripulantesPasados
^tripulantes select: [ : unTripulante | unTripulante estaPasado ].

>>tuNuevaMisionEs: unaMision
| noSirvenMas |
mision := unaMision.
noSirvenMas := tripulantes reject: [ : unTripulante | unTripulante esUtil: unaMision ].
noSirvenMas do: [ : unTripulante | tripulantes remove: unTripulante ].

>>tuPirataMasEbrio
^tripulantes inject: (tripulantes anyOne) into: [ : masEbrio : unTripulante | unTripulante esMasEbrioQue: masEbrio ].

>>tuTripulacionEstaPasada
^ tripulantes allSatisfy: [ : unTripulante | unTripulante estaPasado ].

>>tuTripulantePasadoMasRico
| tripulantesPasados |
tripulantesPasados := self tripulantesPasados.
^ tripulantesPasados inject: (tripulantesPasados anyOne) into: [ : masRico : unTripulante | unTripulante esMasRicoQue: masRico ].

>>tuTripulanteQueInvitoMasGente
^ tripulantes inject: (tripulantes anyOne) into: [ : elMasInvitador : unTripulante | self quienInvitoMas: unTripulante o: elMasInvitador ].

#CiudadCostera
>>podesSerVictimaDe: unPirata
^ unPirata nivelDeEbriedad >= 50.

>>sosVulnerableA: unBarco
^ (unBarco susTripulantes >= (0.4 * ciudadanos size)) | (unBarco tuTripulacionEstaPasada).

>>tuNuevoCiudadanoEs: unCiudadano
ciudadanos add: unCiudadano.

#Mision
>>tieneSuficienteTripulacion: unBarco.
^ (unBarco susTripulantes size) >= (0.9 * unBarco suCapacidad).

#BusquedaDelTesoro
>>esUtil: unPirata
^((unPirata tenes: 'brujula') | (unPirata tenes:'mapa') | (unPirata tenes:'botella de grogXD')) and:[ unPirata susMonedas < 5 ].

>>puedeRealizarla: unBarco
^ unBarco tieneA: 'llaveDeCofre'.

#ConvertirseEnLeyenda
>>esUtil: unPirata
^ (unPirata susItems size >= 10) and: [ unPirata tenes: itemObligatorio ].

>>puedeRealizarla: unBarco
^true.

#Saqueo
>>esUtil: unPirata
^ (unPirata susMonedas < CantidadMonedas) and: [ unPirata teAnimasASaquear: objetivo ].

>>puedeRealizarla: unBarco
^objetivo sosVulnerableA: unBarco.

#Pirata
>>esMasEbrioQue: otroPirata
self nivelDeEbriedad esMayorQue: otroPirata nivelDeEbriedad.

>>esMasRicoQue: otroPirata
^ self susMonedas esMayorQue: otroPirata susMonedas.

>>esMayorQue: otroValor
(self > otroValor)
ifTrue: [ ^self. ]
ifFalse: [ ^otroValor. ].

>>estaPasado
^ nivelDeEbriedad >= 90.

>>fuisteInvitadoPor: unTripulante
^ invitadoPor = unTripulante.

>>initialize
items := Bag new.

>>nivelDeEbriedad
^nivelDeEbriedad.

>>pediteUnTrago
nivelDeEbriedad := nivelDeEbriedad + 5.
monedas := monedas - 1.

>>susItems
^items.

>>susMonedas
^monedas.

>>teAnimasASaquear: unObjetivo
^unObjetivo podesSerVictimaDe: self.

>>tenes: unItem
^items includes: unItem.

>>unItemEs: unItem
^ items includes: unItem.

#EspiaCorona
>>estaPasado
^false.

>>teAnimasASaquear: unObjetivo
items includes: 'permisoDeLaCorona'.
super teAnimasASaquear: unObjetivo.
Algunas correcciones y mejoras que me parecen

1- Misión no es una clase, entonces:
Object subclass: #BusquedaDelTesoro
instanceVariableNames: ''
classVariableNames: ''
package: 'YAAARPiratas'

Object subclass: #ConvertirseEnLeyenda
instanceVariableNames: 'itemObligatorio'
classVariableNames: ''
package: 'YAAARPiratas'

Object subclass: #Saqueo
instanceVariableNames: 'objetivo'
classVariableNames: 'CantidadMonedas'
package: 'YAAARPiratas'

//#Mision
//>>tieneSuficienteTripulacion: unBarco.
//^ (unBarco susTripulantes size) >= (0.9 * unBarco suCapacidad).

#Barco
//>>suCapacidad
//^capacidad.

2- Otra manera de método "anclasEn: unaCiudadCostera"
#Barco
>>anclasEn: unaCiudadCostera
| elMasEbrio |
tripulantes do: [ : unTripulante | unTripulante pediteUnTrago ].
elMasEbrio := self tuPirataMasEbrio.
tripulantes remove: elMasEbrio
unaCiudadCostera tuNuevoCiudadanoEs: elMasEbrio

//>>perdisteA: unTripulante en: unaCiudadCostera
//tripulantes remove: unTripulante.
//unaCiudadCostera tuNuevoCiudadanoEs: unTripulante.

3- Pide cantidad en "cuantosTiposDeItemsTenes" y mejora del código, entonces:
#Barco
>>cuantosTiposDeItemsTenes
| tripulantesPasados |
tripulantesPasados := self tripulantesPasados
^ (tripulantesPasados inject: Set new into: [ : items : unTripulante | items addAll: (unTripulante susItems) ]) size.

4- Clase Mision no existe, entonces en método "puedeCumplirSuMision":
#Barco
>>puedeCumplirSuMision
^(self tieneSuficienteTripulacion) and: [ mision puedeRealizarla: self ].

>>tieneSuficienteTripulacion
^ tripulacion size >= 0.9 * capacidad.

5- Es más expresivo decir "algunoLleva:" que "tieneA:". El método "unItemEs:" repite código, vuela
#Barco
>>algunoLleva: unItem
^ tripulantes anySatisfy: [ : unTripulante | unTripulante tenes: unItem ] .

#BusquedaDelTesoro
>>puedeRealizarla: unBarco
^ unBarco algunoLleva: 'llaveDeCofre'.

#Pirata
//>>unItemEs: unItem
//^ items includes: unItem.

6- Otra manera de método "tuPirataMasEbrio" usando asSortedCollection
#Barco
>>tuPirataMasEbrio
^(tripulantes asSortedCollection: [ : unTrip : otroTrip | unTrip nivelDeEbriedad > otroTrip nivelDeEbriedad ]) first.


7- Otra manera de método "tuTripulantePasadoMasRico" usando asSortedCollection
#Barco
>>tuTripulantePasadoMasRico
| tripulantesPasados |
tripulantesPasados := self tripulantesPasados.
^(tripulantesPasados asSortedCollection: [ : unTrip : otroTrip | unTrip susMonedas > otroTrip susMonedas ]) first.


8- Otra manera de método "tuTripulanteQueInvitoMasGente" usando asSortedCollection
#Barco
>>tuTripulanteQueInvitoMasGente
^(tripulantes asSortedCollection: [ : unTrip : otroTrip | self invitoMas: unTrip que: otroTrip ]) first.

>>invitoMas: unTripulante que: otroTripulante
| invitados1 invitados2 |
invitados1 := tripulantes select: [ : tripulante | tripulante fuisteInvitadoPor: unTripulante ].
invitados2 := tripulantes select: [ : tripulante | tripulante fuisteInvitadoPor: otroTripulante ].
^(invitados1 size >= invitados2 size )

9- Corrección en "esMasEbrioQue:" y "esMasRicoQue:". El método "esMayorQue:" terminaría ejecutandose sobre un objeto de clase Numero porque self nivelDeEbriedad y self susMonedas devuelven un número, así que vuela
#Pirata
>>esMasEbrioQue: otroPirata
self nivelDeEbriedad > otroPirata nivelDeEbriedad.
ifTrue: [ ^self. ]
ifFalse: [ ^otroPirata. ].

>>esMasRicoQue: otroPirata
^ self susMonedas > otroPirata susMonedas.
ifTrue: [ ^self. ]
ifFalse: [ ^otroPirata. ].

//>>esMayorQue: otroValor
//(self > otroValor)
//ifTrue: [ ^self. ]
//ifFalse: [ ^otroValor. ].

10- La variable "ciudadanos" en vez de una colección podría ser una variable que referencie a números, no importa que referencie al pirata que se va del barco, no hace nada con él después (y combinando con "2")
#Barco
>>anclasEn: unaCiudadCostera
tripulantes do: [ : unTripulante | unTripulante pediteUnTrago ].
tripulantes remove: self tuPirataMasEbrio.
unaCiudadCostera nuevoCiudadano.

#CiudadCostera
>>nuevoCiudadano
ciudadanos := ciudadanos + 1.
URLs de referencia