am_dot_com

FP 2022-11-21

Nov 21st, 2022 (edited)
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.96 KB | None | 0 0
  1. # am_tools.py
  2.  
  3. import random
  4.  
  5. # ferramenta genérica de nome
  6. # "inteirosAleatorios"
  7. # para gerar
  8. # coleções de inteiros aleatórios
  9. # entre um mínimo e um máximo,
  10. # em quantidade configurável.
  11.  
  12. DEFAULT_MIN = 1
  13. DEFAULT_MAX = 50
  14. DEFAULT_Q = 5
  15. DEFAULT_ACCEPT_REP = False
  16.  
  17. def inteirosAleatorios(
  18. pMin:int=DEFAULT_MIN,
  19. pMax:int=DEFAULT_MAX,
  20. pQ:int=DEFAULT_Q,
  21. pbAcceptRepetitions:bool=DEFAULT_ACCEPT_REP
  22. ):
  23. colComOsInteiros:list=[]
  24.  
  25. iAmplitude:int = pMax-pMin+1
  26. bPossivelTrabalhar = pQ<=iAmplitude
  27. if (not bPossivelTrabalhar):
  28. return colComOsInteiros
  29.  
  30. while(len(colComOsInteiros)<pQ):
  31. i=random.randint(pMin, pMax)
  32. if(pbAcceptRepetitions):
  33. colComOsInteiros.append(i)
  34. else: # rejeitar repetições
  35. # procurar!
  36. resultadoDaProcura =\
  37. procuraGenerica_v3(colComOsInteiros, i)
  38. bEncontrei = len(resultadoDaProcura)>0
  39. if(not bEncontrei):
  40. colComOsInteiros.append(i)
  41. # if
  42. # else
  43. #while
  44. return colComOsInteiros
  45.  
  46.  
  47.  
  48. def inteirosAleatorios_v0(
  49. pMin:int=DEFAULT_MIN,
  50. pMax:int=DEFAULT_MAX,
  51. pQuantidade:int=DEFAULT_Q,
  52. )->list:
  53. retorno:list=[] # 0 elementos
  54.  
  55. while(len(retorno)<pQuantidade):
  56. i:int = random.randint(
  57. pMin,
  58. pMax
  59. )
  60. retorno.append(i)
  61. return retorno
  62. # def inteirosAleatorios_v0
  63.  
  64. def procuraGenerica_v0(
  65. pCol:list, # a coleção / o espaço de dados onde procurar
  66. pE:int # o elemento a procurar na coleção
  67. )->bool: # retorna True se encontrar pE em pCol; False c.c.
  68. return pE in pCol
  69. # procuraGenerica_v0
  70.  
  71. def procuraGenerica_v1(
  72. pCol:list, # a coleção / o espaço de dados onde procurar
  73. pE:int # o elemento a procurar na coleção
  74. )->bool: # retorna True se encontrar pE em pCol; False c.c.
  75. bColVazia = len(pCol)==0
  76. if (not bColVazia):
  77. enderecosValidos = range(0, len(pCol))
  78. for passeio in enderecosValidos:
  79. quemResideNoEndereco = pCol[passeio]
  80. bEncontreiOQueProcuro =\
  81. pE == quemResideNoEndereco
  82. if (bEncontreiOQueProcuro):
  83. return True # termina a função
  84. # if
  85. # for
  86. else:
  87. # se vazia, não tem elementos
  88. return False # uma col vazia não tem els
  89. # if-else
  90.  
  91. return False
  92. # procuraGenerica_v1
  93.  
  94. def procuraGenerica_v2(pCol, pE)->True:
  95. for el in pCol:
  96. if(el==pE):
  97. return True
  98. # if
  99. # for
  100. return False
  101. # def procuraGenerica_v2
  102.  
  103. def procuraGenerica_v3(pCol, pE)->list:
  104. enderecosEmQueSeEncontra = list()
  105. for endereco in range(0, len(pCol)):
  106. el = pCol[endereco]
  107. bEncontrei = el==pE
  108. if(bEncontrei):
  109. enderecosEmQueSeEncontra.append(endereco)
  110. #if
  111. # for
  112. return enderecosEmQueSeEncontra
  113. # def procuraGenerica_v3
  114.  
  115. """
  116. Escreva uma função de nome numComXDigitos
  117. que, recebidos um número pN, e uma quantidade
  118. de digitos pD
  119. retorna uma string q representa
  120. o número com pD digitos
  121. Exemplo:
  122. numComXDigitos(pN=2, pD=4)
  123. "0002"
  124. """
  125. def numComXDigitos(pN, pD):
  126. strRet = str(pN) #"333"
  127.  
  128. bCautela = len(strRet)<=pD
  129.  
  130. if (bCautela):
  131. while(len(strRet)<pD):
  132. strRet="0"+strRet
  133. #while
  134. # if
  135. return strRet
  136. # def numComXDigitos
  137.  
  138.  
  139. **************************************************
  140.  
  141. # em10.py
  142. # em9.py
  143.  
  144. from am_tools import *
  145.  
  146. KEY_NUMS = "nums"
  147. KEY_STARS = "estrelas"
  148.  
  149. apostaEM = dict()
  150. apostaEM = {}
  151.  
  152. apostaEM = {
  153. "nums":[],
  154. "estrelas":[]
  155. }
  156. print(apostaEM)
  157.  
  158.  
  159. apostaEM = {
  160. "nums":inteirosAleatorios(1, 50, 5, pbAcceptRepetitions=False),
  161. "estrelas":inteirosAleatorios(1, 10, 2, False)
  162. }
  163. print(apostaEM)
  164.  
  165. nums = inteirosAleatorios(
  166. pMin=1,
  167. pMax=50,
  168. pQ=5,
  169. pbAcceptRepetitions=False)
  170.  
  171. # forma equivalente, que confia em valores por defeito
  172. #nums = inteirosAleatorios()
  173.  
  174. stars = inteirosAleatorios(
  175. pMin=1,
  176. pMax=10,
  177. pQ=2,
  178. pbAcceptRepetitions=False)
  179.  
  180. #operando esquerdo objeto do tipo lista
  181. #operando direito é o comportamento de "sort"
  182. #objeto.comportamento()
  183. nums.sort() # sorting in-place
  184. stars.sort() # sorting in-place
  185.  
  186. apostaEM = {
  187. "nums": nums,
  188. "estrelas": stars
  189. }
  190. print(apostaEM)
  191.  
  192. """
  193. Escreva uma função de nome
  194. obterColecaoEMApostasSimples
  195. que, recebendo uma quantidade de apostas,
  196. retorna uma coleção de apostas de EM,
  197. aleatórias.
  198. """
  199.  
  200. def obterColecaoEMApostasSimples\
  201. (pQ:int)->list:
  202.  
  203. col:list = list()
  204. #col = []
  205. for contadorDeAposta in range(pQ):
  206. #print(contadorDeAposta)
  207. #aposta = dict()
  208. nums = inteirosAleatorios(1,50,5,False)
  209. estrelas = inteirosAleatorios(1,10,2,False)
  210. nums.sort()
  211. estrelas.sort()
  212. aposta = {
  213. KEY_NUMS:nums,
  214. KEY_STARS:estrelas, # trailing comma
  215. }
  216. col.append(aposta)
  217. # for
  218.  
  219. return col
  220. # def obterColecaoEMApostasSimples
  221.  
  222. def apresentarColDeApostasEM_v0(pCol):
  223. for a in pCol:
  224. print(a)
  225. # for
  226. # def apresentarColDeApostasEM_v0
  227.  
  228. def apresentarColDeApostasEM_v1(pCol):
  229. # cada a é um dict que vive numa list
  230. contadorDeApostas = 1
  231. for a in pCol:
  232. nums = a[KEY_NUMS]
  233. stars = a[KEY_STARS]
  234. strNums = ""
  235. strStars = ""
  236. for n in nums:
  237. strNums += str(n)+" "
  238. # for
  239. for n in stars:
  240. strStars += str(n) + " "
  241. # for
  242.  
  243. strAposta = f"Aposta #{contadorDeApostas}: "
  244. strAposta+=f" números: {strNums} "
  245. strAposta+= f" estrelas: {strStars}"
  246. print(strAposta)
  247. contadorDeApostas+=1
  248.  
  249. # for
  250. # def apresentarColDeApostasEM_v1
  251.  
  252. def apresentarColDeApostasEM_v2(pCol):
  253. # cada a é um dict que vive numa list
  254. contadorDeApostas = 1
  255. for a in pCol:
  256. nums = a[KEY_NUMS]
  257. stars = a[KEY_STARS]
  258. strNums = ""
  259. strStars = ""
  260. for n in nums:
  261. strNums += numComXDigitos(n, 2)+" "
  262. # for
  263. for n in stars:
  264. strStars += numComXDigitos(n, 2) + " "
  265. # for
  266.  
  267. strAposta = f"Aposta #{numComXDigitos(contadorDeApostas,2)}: "
  268. strAposta+=f" números: {strNums} "
  269. strAposta+= f" estrelas: {strStars}"
  270. print(strAposta)
  271. contadorDeApostas+=1
  272.  
  273. # for
  274. # def apresentarColDeApostasEM_v2
  275.  
  276. #print(numComXDigitos(2, 10)) # 002
  277. #print(numComXDigitos(333, 1)) # 333
  278.  
  279. """
  280. Escreva um função de nome loadApostas
  281. capaz de retornar uma coleção de apostas EM
  282. a partir de um ficheiro de texto
  283. no seguinte formato:
  284. - uma aposta por linha terminada em \n
  285. - cada aposta tem primeiro os números, depois as estrelas
  286. - os números estão separados das estrelas por \t
  287. - os números que compõem as sequência estão separados pelo
  288. espaço em branco
  289. """
  290.  
  291. def loadApostas(pNomeDoFicheiro:str):
  292. ret:list=[]
  293. try:
  294. fr = open(pNomeDoFicheiro, 'rt')
  295. conteudoDoFicheiro:str = fr.read()
  296. linhas = conteudoDoFicheiro.split("\n")
  297. fr.close()
  298.  
  299. for linha in linhas:
  300. strippedLinha = linha.strip()
  301. if(strippedLinha!=""):
  302. duasPartes = strippedLinha.split("\t")
  303. bCautela = len(duasPartes)==2
  304. if (bCautela):
  305. strNums = duasPartes[0]
  306. strStars = duasPartes[1]
  307. listStrNums = strNums.split(" ")
  308. listStrStars = strStars.split(" ")
  309. listNums = []
  310. listStars = []
  311. for strNum in listStrNums:
  312. listNums.append(int(strNum))
  313. # for
  314.  
  315. for strStar in listStrStars:
  316. listStars.append(int(strStar))
  317. # for
  318.  
  319. listNums.sort()
  320. listStars.sort()
  321.  
  322. dictAposta = {
  323. KEY_NUMS:listNums,
  324. KEY_STARS:listStars
  325. }
  326. ret.append(dictAposta)
  327. # if cautela
  328. # if linha com aposta
  329. # para cada linha
  330.  
  331. #print(conteudoDoFicheiro)
  332. # try
  333. except Exception as e:
  334. print(str(e))
  335. # try-except
  336.  
  337. return ret
  338. # def loadApostas
  339.  
  340. FICH_TESTE = "apostas_favoritas.txt"
  341. col = loadApostas(FICH_TESTE)
  342. print(col)
  343.  
  344. """
  345. Escreva uma função de nome
  346. classificaApostas
  347. que, recebidas duas coleções,
  348. pApostas
  349. pChave
  350. classifica cada uma das apostas em pApostas
  351. relativamente à chave em pChave
  352. respondendo uma coleção de tuplos
  353. (#acertos-números, #acertos-estrelas)
  354. que medem as coincidências entre
  355. cada aposta e a chave
  356.  
  357. """
  358. def classificaAposta(pA:dict, pC:dict):
  359. numsAposta = pA[KEY_NUMS]
  360. starsAposta = pA[KEY_STARS]
  361. numsChave = pC[KEY_NUMS]
  362. starsChave = pC[KEY_STARS]
  363.  
  364. setNumsAposta:set = set(numsAposta)
  365. setStarsAposta:set = set(starsAposta)
  366. setNumsChave:set = set(numsChave)
  367. setStarsChave:set = set(starsChave)
  368.  
  369. acertosDeNumeros =len(
  370. setNumsAposta.intersection(setNumsChave)
  371. )
  372. acertosDeEstrelas = len(
  373. setStarsAposta.intersection(setStarsChave)
  374. )
  375. return (acertosDeNumeros, acertosDeEstrelas)
  376. # def classificaAposta
  377.  
  378. def classificaApostas(
  379. pApostas:list,
  380. pChave:dict
  381. )->list:
  382. ret = []
  383. for aposta in pApostas:
  384. r=classificaAposta(aposta, pChave)
  385. ret.append(r)
  386. #for
  387. return ret
  388. # def classificaApostas
  389.  
  390.  
  391. CHAVE = {
  392. KEY_NUMS:[3,22,27,30,42],
  393. KEY_STARS:[6,7]
  394. }
  395. print(classificaApostas(col, CHAVE))**********************
  396.  
  397.  
  398. 03 06 17 32 47 04 10
  399. 08 14 19 27 40 07 08
  400. 05 09 18 20 37 03 09
  401. 11 22 28 34 49 06 07
  402. 05 06 14 33 38 01 02
  403. 14 19 25 37 48 06 09
  404. 03 12 35 40 42 01 03
  405. 01 06 16 24 32 04 10
  406. 08 18 38 42 50 02 04
  407. 06 14 19 27 35 03 10
  408.  
Advertisement
Add Comment
Please, Sign In to add comment