am_dot_com

FP 2022-12-05

Dec 5th, 2022 (edited)
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.96 KB | None | 0 0
  1. # EM_v6.py
  2.  
  3. import random
  4.  
  5. class EM:
  6. # membros de dados estáticos (partilhados por todas as instâncias)
  7. DEFAULT_MIN = 1
  8. DEFAULT_MAX = 50
  9. DEFAULT_Q = 5
  10. DEFAULT_ACCEPT_REP = False
  11.  
  12. @staticmethod
  13. def contadorDeCoincidenciasEntreColecoes(
  14. pCol1:list,
  15. pCol2:list
  16. ):
  17. iAcertos=0
  18. iFalhas=0
  19. listQuaisOsAcertos = list()
  20. listFalhas = []
  21. for el1 in pCol1:
  22. for el2 in pCol2:
  23. bCoincidencia = el1==el2
  24. bNotCoincidencia = el1!=el2
  25. bNotCoincidencia = not bCoincidencia
  26. if(bCoincidencia):
  27. iAcertos+=1
  28. listQuaisOsAcertos.append(el1)
  29. # if
  30. else: # not da expressao original
  31. iFalhas+=1
  32. listFalhas.append(el1)
  33. # if-else
  34.  
  35. # estudar
  36. if (not bCoincidencia):
  37. pass
  38. # for
  39. # for
  40. return iAcertos, listQuaisOsAcertos #, iFalhas, listFalhas
  41. # def contadorDeCoincidenciasEntreColecoes
  42.  
  43. # método estático
  44. @staticmethod
  45. def colEnquantoFrase(
  46. pCol:list,
  47. pSeparador:str=" "
  48. ):
  49. r = ""
  50. pCol.sort() # ordenação ascendente da col recebida
  51. iUltimoEndereco = len(pCol)-1
  52. for endereco in range(len(pCol)):
  53. elemento = pCol[endereco]
  54. r+=f"{elemento}"
  55.  
  56. bUltimoEndereco =\
  57. endereco == iUltimoEndereco
  58. if(not bUltimoEndereco):
  59. r+=f"{pSeparador}"
  60. # if
  61. # for
  62. return r
  63. # def colEnquantoFrase
  64.  
  65. @staticmethod
  66. def procuraGenerica(pCol, pE) -> list:
  67. enderecosEmQueSeEncontra = list()
  68. for endereco in range(0, len(pCol)):
  69. el = pCol[endereco]
  70. bEncontrei = el == pE
  71. if (bEncontrei):
  72. enderecosEmQueSeEncontra.append(endereco)
  73. # if
  74. # for
  75. return enderecosEmQueSeEncontra
  76. # def procuraGenerica
  77.  
  78. @staticmethod
  79. def inteirosAleatorios(
  80. # self, # proibido de se usar, pq o método é partilhado por todas as instâncias
  81. pMin: int = DEFAULT_MIN,
  82. pMax: int = DEFAULT_MAX,
  83. pQ: int = DEFAULT_Q,
  84. pbAcceptRepetitions: bool = DEFAULT_ACCEPT_REP
  85. ):
  86. colComOsInteiros: list = []
  87.  
  88. iAmplitude: int = pMax - pMin + 1
  89. bPossivelTrabalhar = pQ <= iAmplitude
  90. if (not bPossivelTrabalhar):
  91. return colComOsInteiros
  92.  
  93. while (len(colComOsInteiros) < pQ):
  94. i = random.randint(pMin, pMax)
  95. if (pbAcceptRepetitions):
  96. colComOsInteiros.append(i)
  97. else: # rejeitar repetições
  98. # procurar!
  99. resultadoDaProcura = \
  100. EM.procuraGenerica(colComOsInteiros, i)
  101. bEncontrei = len(resultadoDaProcura) > 0
  102. if (not bEncontrei):
  103. colComOsInteiros.append(i)
  104. # if
  105. # else
  106. # while
  107. return colComOsInteiros
  108.  
  109. # membros de dados
  110. # propriedades / atributos
  111. # caracterizadores de instâncias da class
  112. # instâncias da class = vars da class
  113. def __init__(
  114. self, # o objeto em construção
  115. pNumeros=None,
  116. pEstrelas=None,
  117. pTitulo:str="",
  118. pbFavorita:bool=False
  119. ):
  120. self.mTitulo = pTitulo
  121. self.mFavorita = pbFavorita
  122.  
  123. if(pNumeros!=None):
  124. self.mNumeros = pNumeros
  125. else:
  126. # decidimos números aleatórios
  127. self.mNumeros =\
  128. EM.inteirosAleatorios(
  129. EM.DEFAULT_MIN,
  130. EM.DEFAULT_MAX,
  131. EM.DEFAULT_Q
  132. )
  133.  
  134. if(pEstrelas!=None):
  135. # m - o meu prefixo para sinalizar "data member" / "membros de dados"
  136. self.mEstrelas = pEstrelas
  137. else:
  138. # decidimos estrelas aleatórias
  139. self.mEstrelas =\
  140. EM.inteirosAleatorios(
  141. 1,
  142. 10,
  143. 2
  144. )
  145. # if-else
  146.  
  147. # comportamentos
  148. # escrever
  149. # obter uma aposta [aleatória]
  150. # classificar/corrigir
  151.  
  152. def __str__(self):
  153. # a representação direta da instância como frase
  154. r = ""
  155.  
  156. bTemTitulo:bool = ""!=self.mTitulo.strip()
  157. if(bTemTitulo):
  158. r += f"Título: {self.mTitulo}\n"
  159. # if
  160.  
  161. if(self.mFavorita):
  162. r+="Favorita: SIM\n"
  163. else:
  164. r+="Favorita: NÃO\n"
  165.  
  166. # números
  167. r += "Números: "
  168. r += EM.colEnquantoFrase(
  169. self.mNumeros,
  170. pSeparador=", "
  171. )
  172. r +="\n"
  173.  
  174. # estrelas
  175. r += "Estrelas: "
  176. r += EM.colEnquantoFrase(
  177. self.mEstrelas,
  178. pSeparador=", "
  179. )
  180.  
  181. r+="\n"+("_"*60)
  182. return r
  183. # def __str__
  184.  
  185. """
  186. Escreva o método dinâmico de nome
  187. quantosAcertosRelativamenteA
  188. que, recebida uma aposta EM,
  189. classifica a instância corrente relativamente
  190. à aposta recebida; isto é, contabiliza em quantos
  191. números e em quantos estrelas, as apostas
  192. coincidem.
  193. O retorno deverá ser um tuplo
  194. qDeNumerosAcertados, qEstrelasAcertadas
  195. """
  196. def quantosAcertosRelativamenteA(
  197. self,
  198. pOutra,
  199. pbVerEscritoOQueTemEmComum:bool=True
  200. ):
  201. setNumerosSelf = set(self.mNumeros)
  202. setEstrelasSelf = set(self.mEstrelas)
  203. setNumerosOutra = set(pOutra.mNumeros)
  204. setEstrelasOutra = set(pOutra.mEstrelas)
  205. numerosEmComum =\
  206. setNumerosSelf.intersection(setNumerosOutra)
  207.  
  208. estrelasEmComum =\
  209. setEstrelasOutra.intersection(setEstrelasSelf)
  210.  
  211. if(pbVerEscritoOQueTemEmComum):
  212. print(numerosEmComum)
  213. print(estrelasEmComum)
  214.  
  215. return len(numerosEmComum), len(estrelasEmComum)
  216. # def quantosAcertosRelativamenteA
  217.  
  218. def quantosAcertosRelativamenteA_v2(
  219. self,
  220. pOutra,
  221. pbVerEscritoOQueTemEmComum: bool = True
  222. ):
  223. iQNums, listQuaisNums =\
  224. EM.contadorDeCoincidenciasEntreColecoes(
  225. self.mNumeros,
  226. pOutra.mNumeros
  227. )
  228.  
  229. iQEstrelas, listQuaisEstrelas = \
  230. EM.contadorDeCoincidenciasEntreColecoes(
  231. self.mEstrelas,
  232. pOutra.mEstrelas
  233. )
  234.  
  235. if(pbVerEscritoOQueTemEmComum):
  236. #EM.colEnquantoFrase(listQuaisNums, " ")
  237. print(listQuaisNums)
  238. print(listQuaisEstrelas)
  239. # if
  240.  
  241. return iQNums, iQEstrelas
  242. # def quantosAcertosRelativamenteA_v2
  243.  
  244. @staticmethod
  245. def lerBDDeChaves\
  246. (pNomeDaBD:str="CHAVES.TSV"):
  247.  
  248. ret = list()
  249. fr = open(pNomeDaBD, "rt")
  250. if(fr):
  251. conteudoTodo:str = fr.read()
  252. fr.close()
  253.  
  254. colLinhas =\
  255. conteudoTodo.split("\n")
  256.  
  257. for linha in colLinhas:
  258. linhaLimpa = linha.strip()
  259. if (linhaLimpa!=""):
  260. colPartes =\
  261. linhaLimpa.split("\t")
  262.  
  263. bFormatoCorreto = len(colPartes)==3
  264. if(bFormatoCorreto):
  265. data = colPartes[0]
  266. nums = colPartes[1].split(" ")
  267. est = colPartes[2].split(" ")
  268.  
  269. dict3Parts = dict()
  270. # TODO: garantir listas de inteiros e NÃO listas de frases
  271. dict3Parts["data"] = data
  272. dict3Parts["nums"] = nums
  273. dict3Parts["estrelas"] = est
  274. ret.append(dict3Parts)
  275. # if 3 partes
  276. # if linha limpa
  277. # for para todas as linhas
  278. # if conseguimos abrir ficheiros
  279. return ret
  280. # def lerBDDeChaves
  281. # class EM
  282.  
  283. a1:EM = EM(
  284. pTitulo="O primeiro objeto EM q fizemos hoje",
  285. pNumeros = [1,2,3,4,5],
  286. pEstrelas = [1,2],
  287. pbFavorita = False,
  288. ) # será de números e estrelas aleatórios, porque NÃO argumentamos
  289. a2:EM = EM(
  290. pTitulo="O segundo objeto EM q fizemos hoje",
  291. pNumeros=[2,3,4,5,6],
  292. pEstrelas=[2,3],
  293. pbFavorita=True
  294. ) # será de números e estrelas aleatórios, porque NÃO argumentamos
  295.  
  296. print(a1.__str__())
  297. print(a2)
  298. """
  299. print(a2.quantosAcertosRelativamenteA(a1)) # 4 acertos nums + 1 acerto estrelas
  300.  
  301. print("Usando v2:")
  302. print(a2.quantosAcertosRelativamenteA_v2(a1)) # 4 acertos nums + 1 acerto estrelas
  303. """
  304.  
  305. chaveMaisRecentes = EM(
  306. [10,22,23,44,45],
  307. [8,9],
  308. "sorteio 2022-12-02"
  309. )
  310. print(chaveMaisRecentes)
  311.  
  312. """
  313. Sempre o que título não for vazio, quando se pede
  314. a escrita de um objeto EM, deve aparecer o título.
  315. """
  316.  
  317. """
  318. sempre que for para mudar as características de TODAS
  319. as instâncias (por exemplo, para ganharem + um atributo)
  320. TEM QUE TRABALHAR-SE em __init__
  321.  
  322. sempre q for para mudar a representação/apresentação
  323. enquanto frase de TODAS as instâncias (por exemplo,
  324. para se escrever, ou não de uma maneira, ou de outra)
  325. TEM QUE TRABALHAR-SE em __str__
  326. """
  327.  
  328. """
  329. Você decidiu q o formato para uma base de dados TSV
  330. de chaves é:
  331. <data do sorteio>\t<números>\t<estrelas>\n
  332.  
  333. Escreva um método, capaz de ler esta base de dados
  334. e representa-la nalguma estrutura de dados.
  335. """
  336.  
  337. leitura = EM.lerBDDeChaves()
  338. print(leitura)
  339.  
  340. """
  341. escrever uma função que, recebida uma coleção de
  342. frases que representam inteiros
  343. retorna a coleção equivalente, mas de inteiros.
  344.  
  345. """
  346.  
  347. def solucao(pCol):
  348. ret = list()
  349. for el in pCol:
  350. iEl = int(el)
  351. ret.append(iEl)
  352. # for
  353. return ret
  354. # def solucao
  355.  
Advertisement
Add Comment
Please, Sign In to add comment