Aplicació: Castells i catapultes
Aquesta lliçó presenta una simple modelació amb booleans de l'èxit o el fracàs d'un atac a un castell medieval.
El problema
Un castell medieval està assetjat. Disposem dels valors de l'alçada de les muralles, i també de l'alçada de les escales dels atacants. A més, sabem si els atacants tenen o no catapultes, i quantes pedres grosses poden disparar.
Les regles que regeixen l'èxit de l'atac són:
- Si els atacants tenen escales més altes que les muralles del castell, l'atac té èxit.
- Si els atacants tenen alguna catapulta i almenys deu pedres grosses, l'atac té èxit.
En qualsevol altre cas, l'atac fracassa.
La formulació booleana
Les dades que se'ns han donat es poden descriure en Python d'aquesta forma:
alcada_muralles : float # alçada de les muralles del castell (en metres)
alcada_escales : float # alçada de les escales dels atacants (en metres)
catapultes : bool # indica si els atacants disposen o no d'alguna catapulta
pedres : int # nombre de pedres grosses disponibles
El tipus d'alcada_muralles
i d'alcada_escales
s'ha triat com a un real perquè contenen una mida amb possibles decimals. El tipus de pedres
s'ha triat com a un enter perquè, justament, conté un nombre natural (no es poden tenir tres perdre grosses i quart). El tipus de catapultes
s'ha triat com a un booleà, perquè indica la mera presència o no de catapultes.
Suposem que aquestes variables s'han omplert amb unes certes dades. Ara volem calcular si l'atac té èxit o no, i guardar-ho en una variable booleana:
atac_amb_exit : bool # indica si l'atac al castell té èxit
Segons les regles descrites anteriorment, ens cal fer servir una operació de disjunció (or
) per unir les dues condicions. La primera condició és el resultat d'una comparació: alcada_escales > alcada_muralles
. La segona condició és la conjunció (and
) de dues nessitats: la presència de catapultes i l'existència de prou pedres grosses. Per tant, es pot escriure com catapultes and pedres >= 10
.
Tot plegat, tenim:
atac_amb_exit = alcada_escales > alcada_muralles or (catapultes and pedres >= 10)
Els parèntesis són importants per desambigüar aquesta expressió de (alcada_escales > alcada_muralles or catapultes) and pedres
, que és diferent (i incorrecta segons les nostres regles).
Jordi Petit, Salvador Roura
Lliçons.jutge.org
© Universitat Politècnica de Catalunya, 2024