Prévia do material em texto
Exerćıcios resolvidos de python Lucas Ambrus 13 de dezembro de 2021 Figure 1: Slava Stalin 1 Funções e Tipos de dados..............................................................................3 Strings, Estrutura Condicional......................................................................4 Variáveis e atribuição, tuplas.........................................................................7 Manipulação de strings, tuplas e listas.........................................................10 Fatiamento e Manipulação de listas..............................................................15 Estruturas de repetição I - While.................................................................19 Estruturas de repetição II - For....................................................................23 Laços aninhados e matrizes...........................................................................29 2 Machine Teaching 2 1. Pedrinho quer comprar o maior número posśıvel de bombons com o dinheiro que tem. Faça uma função chamada num bombons para calcular quantos bombons ele consegue comprar, dados o dinheiro e o preço do bombom para realização da compra. def num_bombons(d, b): return d//b 2. Um grupo de amigos deseja fazer uma viagem e decidiram ir de carro. Pelas regras rodoviárias um véıculo convencional tem a capacidade de transportar até 5 passageiros, porém há véıculos com outras capacidades. Construa uma função em Python chamada carros para calcular e retornar o número exato de carros necessários para esta viagem, consderando que seja dado como entrada o número de pessoas. Caso os véıculos con- siderados sejam de capacidades não convencionais, será dado também como entrada a capacidade dos véıculos, considerando que todos os véıculos são iguais. import math def carros(p, v=5): return math.ceil(p / v) 3. Questão OBI (Olimṕıada Brasileira de Informática - OBI2012, Fase 2, Nı́vel Júnior) - (Receita de Bolo) João deseja fazer bolos para seus amigos, usando uma receita que indica que devem ser usadas 2 x́ıcaras de farinha de trigo, 3 ovos e 5 colheres de sopa de leite. Em casa ele tem **A** x́ıcaras de farinha de trigo, **B** ovos e **C** colheres de sopa de leite. João não tem muita prática com a cozinha, e portanto ele só se arriscará a¡br¿fazer medidas exatas da receita de bolo (por exemplo, se ele tiver material suficiente para fazer mais do que 2 e menos do que 3 bolos, ele fará somente 2 bolos). Sabendo disto, ajude João escrevendo uma função chamada **bolos** que determine qual a quantidade máxima de bolos que ele consegue fazer. **Entrada:** Os parâmetros de entrada da função são três números inteiros A, B e C, indicando respectivamente o número de x́ıcaras de farinha de trigo, o número de ovos e o número de colheres de sopa de leite que João tem em casa. **Sáıda:** Sua função deve retornar a quantidade máxima de bolos que João consegue fazer. import math def bolos(A,B,C): """inserir xı́caras, ovos e colheres""" return math.floor(min((A/2),(B/3),(C/5))) 3 Machine Teaching 3 1. Faça uma função chamada **PosNegZero** que determina se um número inteiro X passado como parâmetro é positivo, negativo ou zero. O valor de retorno da função deve ser uma dentre as strings “X e positivo”, “X e negativo” ou “X e zero”. def PosNegZero(x): if x > 0: return str(x) + ’ e positivo’ if x < 0: return str(x) + ’ e negativo’ elif x == 0: return str(x) + ’ e zero’ 2. Dois times, Cormengo e Flaminthians, participam de um campeonato de futebol, juntamente com outros times. Cada vitória conta três pontos, cada empate um ponto. Fica melhor classificado no campeonato um time que tenha mais pontos. Em caso de empate no número de pontos, fica melhor classificado o time que tiver maior saldo de gols. Se o número de pontos e o saldo de gols forem os mesmos para os dois times então os dois times estão empatados no campeonato. Faça uma função definida por classificacao(Cv, Ce, Cs, Fv, Fe, Fs). Dados os números de vitórias e empates, e os saldos de gols dos dois times, sua tarefa é determinar qual dos dois está melhor classificado, ou se eles estão empatados no campeonato. Entrada: Os parâmetros de entrada da função são seis números inteiros C, Ce, Cs, F v, F e e F s, que são, respectivamente, o número de vitórias do Cormengo, o número de empates do Cormengo, o saldo de gols do Cormengo, o número de vitórias do Flaminthians, o número de empates do Flaminthians e o saldo de gols do Flaminthians. Sáıda: A sua função deve retornar a string ’Cormengo’, se Cormengo estiver melhor classificado que Flaminthians ou a string ’Flaminthians’ se Flaminthians estiver melhor classificado que Cormengo; e se os dois times estiverem empatados a função deve retornar ’Empate’. Table 1: Exemplos: Entrada: 10,5,18,11,2,18 Sáıda: ’Empate’ Entrada: 10,5,18,11,1,18 Sáıda: ’Cormengo’ Entrada: 9,5,-1,10,2,10 Sáıda: ’Flaminthians’ 4 def classificacao(cv, ce, cs, fv, fe, fs): """informar vitorias, empates e gols de cada time""" #ptc = pontos totais cormengo #ptf = pontos totais flaminthians ptc = 3*cv + ce ptf = 3*fv + fe if (ptc == ptf): if (cs > fs): return ’Cormengo’ elif (cs < fs): return ’Flaminthians’ else: return ’Empate’ elif (ptc > ptf): return ’Cormengo’ else: return ’Flaminthians’ 5 3. Questão OBI (Olimṕıada Brasileira de Informática - 2009, Fase 1, Nı́vel Júnior) - (Aviões de Papel) Para descontrair os alunos após as provas da OBI, a Diretora da escola organizou um campeonato de aviões de papel. Cada aluno participante receberá uma certa quantidade de folhas de um papel especial para fazer os seus modelos de aviões. A quantidade de folhas que cada aluno deverá receber ainda não foi determinada: ela será decidida pelos júızes do campeonato. A diretora convidou, para atuarem como júızes, engenheiros da Embraer, uma das mais bem sucedidas empresas brasileiras, que vende aviões com tecnologia brasileira no mundo todo. O campeonato está programado para começar logo após a prova da OBI, mas os júızes ainda não chegaram à escola. A diretora está aflita, pois comprou uma boa quantidade de folhas de papel especial, mas não sabe se a quantidade comprada vai ser suficiente. Considere, por exemplo, que a Diretora comprou 100 folhas de papel especial, e que há 33 competidores. Se os júızes decidirem que cada competidor tem direito a três folhas de papel, a quantidade comprada pela di- retora é suficiente. Mas se os júızes decidirem que cada competidor tem direito a quatro folhas, a quantidade comprada pela diretora não seria suficiente. Você deve escrever uma função definida por avioes(competidores, papel comprado, papel competidor) que, dados o número de competidores, o número de folhas de papel especial compradas pela Diretora e o número de folhas que cada competidor deve receber, determine se o número de folhas comprado pela Diretora é suficiente. Table 2: Exemplos: Entrada: 10,100,10 Sáıda: ’Suficiente’ Entrada: 10,90,10 Sáıda: ’Insuficiente’ Entrada: 5,40,2 Sáıda: ’Suficiente’ def avioes(c, p_compr, p_compet): """int, int, int -> string""" total = p_compr/c if total >= p_compet: return ’Suficiente’ else: return ’Insuficiente’ 6 Machine Teaching 4 1. Considere que a e b são duas strings à escolha do usuário. Faça uma função, chamada concatenação, que retorne a concatenação delas no formato abba. def concatenacao(a, b): return str(a) + str(b) + str(b) + str(a) 2. Escreva uma função definida por **substitui(s, x, i)** que receba uma string *s*, um caractere *x* e um número inteiro *i* entre 0 e o comprimento da string, e retorne uma string igual a *s*, exceto que o elemento da posição *i* deve ser substitúıdo pelo caractere *x*. def substitui(s,x,i): ’’’Substitui letra na posiç~ao escolhida. Inserir palavra entre aspas. str--> str’’’parte1 = s[0:i] parte2 = s[i+1:len(s)] return parte1 + x + parte2 3. Escreva uma função chamada **hashtag** que receba uma string e insira o carac- tere ”#” no ińıcio, no meio e no final dela. Por exemplo, se a entrada for ”abcd”, a sáıda deve ser ”#ab#cd#”. Outro exemplo: se receber ”abcde”, a função deve retornar ”#ab#cde#”. def hashtag(s): ’’’Inserir palavra entre aspas. Inserir palavra entre aspas. str-> str ’’’ j = s[0:math.floor(len(s)/2)] k = s[math.floor(len(s)/2):len(s)] return ’#’ + j + ’#’ + k + ’#’ 7 4. Faça uma função chamada **filtra pares** que receba uma tupla com quatro elementos inteiros como parâmetro, e retorne uma nova tupla contendo apenas os elementos pares da tupla original, na mesma ordem em que se encontravam. Esse tipo de operação onde se selecionam elementos de um conjunto inicial que satisfazem uma determinada propriedade é bastante comum em computação, e se chama **filtragem**. def filtra_pares(elementos): ’’’Inserir elementos entre colchetes. Retorna tupla só com elementos pares. touple--> touple’’’ elementos_pares = () if elementos[0] % 2 == 0: elementos_pares = elementos_pares + (elementos[0],) if elementos[1] % 2 == 0: elementos_pares = elementos_pares + (elementos[1],) if elementos[2] % 2 == 0: elementos_pares = elementos_pares + (elementos[2],) if elementos[3] % 2 == 0: elementos_pares = elementos_pares + (elementos[3],) return elementos_pares 8 5. Questão OBI (Olimṕıada Brasileira de Informática) Detecção de colisão é uma das operações mais comuns (e importantes) em jogos eletrônicos. O objetivo, basicamente, é verificar se dois objetos quaisquer colidiram, ou seja, se a in- terseção entre eles é diferente de vazio. Isso pode ser usado para saber se duas naves colidiram, se um monstro bateu numa parede, se um personagem pegou um item, etc. Para facilitar as coisas, muitas vezes os objetos são aproximados por figuras geométricas simples (esferas, paraleleṕıpedos, triângulos etc). Neste problema, os objetos são aproxi- mados por retângulos num plano 2D. Escreva uma função chamada **colisao** que, dados dois retângulos, determine se eles se interceptam ou não. Cada retângulo é determinado pelas coordenadas x e y de dois de seus vértices diametralmente opostos, representando a diagonal que vai da esquerda para a direita e de baixo para cima. Os lados de cada retângulo são sempre paralelos aos eixos x e y. **Entrada:** Os parâmetros de entrada são duas tuplas com quatro valores inteiros cada uma, representando as coordenadas do primeiro retângulo e as coordenadas do segundo retângulo. **Sáıda:** A sua função deve retornar o valor booleano True caso haja interseção ou False, caso não haja. Table 3: Exemplos: Entrada: (0,0,1,1), (0,0,1,1) Sáıda: True Entrada: (0,0,2,2), (1,1,3,3) Sáıda: True Entrada: (0,0,1,1), (2,2,3,3) Sáıda: False def colisao(ret1,ret2): ’’’a funcao colisao recebe duas tuplas com quatro valores inteiros cada uma, representando as coordenadas dos vertices inferior esquerdo e superior esquerdo do primeiro retângulo e do segundo retângulo, nessa ordem, e devolve True se ha colisao entre os 2 retangulos e False, caso contrario. tuple, tuple --> bool’’’ if ret1[2]<ret2[0]: return False elif ret2[2]<ret1[0]: return False elif ret1[3]<ret2[1]: return False elif ret2[3]<ret1[1]: return False else: return True 9 Machine Teaching 5 1. Faça uma função definida por **quant palavras(frase)** que dada uma frase, retorne o número de palavras da frase. Considere que a frase pode ter espaços no ińıcio e no final. Dica: veja a função split( ) def quant_palavras(frase): """funç~ao que conta palavras de uma frase. string -> int""" contagem = frase.split(" ") return len(contagem) 2. Dado um texto armazenado em uma string, faça a função **conta frases** que conte o número de frases que aparecem neste texto. Cada frase no texto é terminada com um ponto final, um ponto de exclamação, um ponto de interrogação ou três pontos em sequência (reticências). Pontos de exclamação ou de interrogação não aparecerão repetidos em sequência no texto e esses śımbolos só aparecem no texto terminando uma frase. No exemplo a seguir, são contadas 4 frases: “Preciso tirar um cochilo. Meus Deus! Que horas são? Vou perder a minha aula...” def conta_frases(texto): cont1 = texto.split(’.’) cont2 = texto.split(’!’) cont3 = texto.split(’?’) cont4 = texto.count(’...’) return (len(cont1) - 2*cont4) + len(cont2) + len(cont3) - 3 3. Faça uma função chamada definida por **intercala(lista1, lista2)** que dadas duas listas L1 e L2 de tamanho 3, gera uma lista L3 que é formada intercalando os elementos de L1 e L2. Exemplo: L1 = [1, 3, 5] e L2 = [2, 4, 6] gera L3 = [1, 2, 3, 4, 5, 6]. def intercala(lis1, lis2): """recebe duas listas e gera uma terceira lista com elementos intercalados. list --> list""" lista3 = [lis1[0], lis2[0], lis1[1], lis2[1], lis1[2], lis2[2]] return lista3 10 4. Faça uma função **retira pontuacao** que, dada uma frase, retorne a frase onde todos os caracteres de pontuação (incluindo travessão, v́ırgula, dois pontos, ponto e v́ırgula, além da pontuação de encerramento de frase) tenham sido substitúıdos por espaço. def retira_pontuacao(frase): if ":" in frase: frase = frase.replace(":", " ") if ";" in frase: frase = frase.replace(";", " ") if "." in frase: frase = frase.replace(".", " ") if "!" in frase: frase = frase.replace("!", " ") if "-" in frase: frase = frase.replace("-", " ") if "," in frase: frase = frase.replace(",", " ") if "?" in frase: frase = frase.replace("?", " ") return frase 11 5. Faça uma função chamada **inverte** que dada uma frase retorne uma outra frase que contenha as mesmas palavras da frase de entrada na ordem inversa, sem letras maiúsculas, e sem a pontuação. Exemplo: frase lida: “Nossa, como eu gosto de chocolate.” frase alterada: “chocolate de gosto eu como nossa” DICA: Remova a pontuação da frase, usando a função que você fez pro exerćıcio anterior. Para reaproveitar uma função feita no Machine Teaching, copie o código com- pleto da função e cole na caixa de resposta do exerćıcio onde quer utilizá-la. Faça então a função pedida no exerćıcio, embaixo da que você colou, e dentro dela você irá chamar a que está reutilizando. def inverte(frase): """Funç~ao recebe frase e retorna frase invertida e sem pontuaç~oes. Informar frase entre aspas. str--> str""" if ":" in frase: frase = frase.replace(":", "") if ";" in frase: frase = frase.replace(";", "") if "." in frase: frase = frase.replace(".", "") if "!" in frase: frase = frase.replace("!", "") if "-" in frase: frase = frase.replace("-", " ") if "," in frase: frase = frase.replace(",", "") if "?" in frase: frase = frase.replace("?", "") fraselist = frase.split(" ") range_list = len(fraselist)+1 fat_inv = fraselist[-1:-(range_list):-1] inverso = str.join(’ ’,fat_inv) return str.lower(inverso) 12 6. Faça uma função **piramide num** que construa uma pirâmide de números inteiros, dados dois números. Uma pirâmide de números é na verdade uma sequência de números com as seguintes caracteŕısticas: I. o primeiro valor passado como parâmetro deverá ser o primeiro e o último elemento da sequência, marcando o ińıcio e fim da sequência II. cada valor dentro da sequência não pode ter uma diferença absoluta maior que um de seu vizinho à direita ou à esquerda. III. o maior número da sequência estará no meio dela, e corresponde ao segundo número dado como entrada. IV. todos os números na pirâmide aparecem duas vezes na sequência com exceção daquele que está no meio. Sua função receberá como entrada dois números inteiros, e deve retornar uma lista com a sequência correspondente à pirâmide. Table 4: Exemplos: Entrada: piramide(3,6) Sáıda: [3,4,5,6,5,4,3] Entrada: piramide(9,6)Sáıda: [9,8,7,6,7,8,9] Entrada: piramide(6,6) Sáıda: [6] def piramide_num(num1, num2): """Insira dois números inteiros. A funç~ao devolve uma lista pirâmide. int, int --> list""" lista1 = [num1] r1 = range(num1, num2, -1) r2 = range(num2, num1) r3 = range(num1, num2) r4 = range(num2, num1, -1) if num1 > num2: return list(r1) + list(r2) + lista1 elif num1 < num2: return list(r3) + list(r4) + lista1 else: return lista1 13 7. OBI 2012 (Colchão)* João está comprando móveis novos para sua casa. Agora é a vez de comprar um colchão novo, de molas, para substituir o colchão velho. As portas de sua casa têm **altura H** e **largura L** e existe um colchão que está em promoção com dimensões A x B x C. O colchão tem a forma de um paraleleṕıpedo reto retângulo e João só consegue arrastá-lo através de uma porta com uma de suas faces paralelas ao chão, mas consegue virar e rotacionar o colchão antes de passar pela porta. Entretanto, de nada adianta ele comprar o colchão se ele não passar através das portas de sua casa. Portanto ele quer saber se consegue passar o colchão pelas portas e para isso precisa de sua ajuda. Faça uma função definida por **colchao(medidas,H,L)** para resolver esse problema, onde medidas é uma lista com os tamanhos inteiros A, B e C, e H e L são os tamanhos inteiros da altura e largura da porta, respectivamente. - **Entrada:** Os parâmetros de entrada são uma lista com as dimensões do colchão em cent́ımetros, ordenadas da menor para a maior, e dois inteiros H e L, correspondentes respectivamente a altura e a largura das portas em cent́ımetros. - **Sáıda:** A sua função deve retornar True se o colchão passa pelas portas e False caso contrário. def colchao(medidas, H, L): """Funç~ao define se colch~ao passa pela porta de acordo com as medidas do colch~ao. list, float, float--> bool""" if medidas[1] <= H: return True if medidas[1] <= L: return True if medidas[2] <= H: return True if medidas[2] <= L: return True else: return False 14 Machine Teaching 6 1. Faça uma função chamada **altera frase** que receba uma frase, uma palavra e uma posição. - Caso a palavra já exista na frase, transforme a primeira ocorrência da palavra na frase para maiúscula. - Caso a palavra não exista, insira a palavra na frase na posição dada. Assuma que a primeira palavra está na posição 0. Retorne a nova frase. Exemplo1: - Frase: Meu nome é ana - Palavra: ana - Retorno: Meu nome é ANA Exemplo 2: - Frase: Meu nome é ana - Palavra: primeiro - Posição: 1 - Retorno: Meu primeiro nome é ana def altera_frase(frase, palavra, index): """funç~ao substitui palavra na posiç~ao desejada. Palavra repetida é coloca em maiúscula, palavra n~ao repetida é inserida na posiç~ao desejada. str, str, int--> str""" lista1 = frase.split() if palavra in lista1: lista1[lista1.index(palavra)] = str.upper(palavra) return str.join(’ ’, lista1) else: lista1.insert(index, palavra) return str.join(’ ’, lista1) 15 2. Faça uma função chamada **faltas** que receba uma lista no seguinte formato: [[Brasil, Italia, [10, 9]], [Brasil, Espanha, [5, 7]], [Italia, Espanha, [7,8]]] Esta lista in- dica o número de faltas que cada time fez em cada jogo. Na lista acima, no jogo entre Brasil e Itália, o Brasil fez 10 faltas e a Itália fez 9. Dada essa lista, a função deve retornar o total de faltas do campeonato. def faltas(lista): """funç~ao recebe uma lista, soma as faltas que as listas informam e retorna o total de faltas. list--> int""" faltas1 = int(lista[0][2][0]) + int(lista[0][2][1]) + int(lista[1][2][0]) faltas2 = int(lista[1][2][1]) + int(lista[2][2][0]) + int(lista[2][2][1]) total_faltas = faltas1 + faltas2 return faltas 3. Faça uma função definida por **insere(lista numero, n)** que dada uma lista ordenada (crescente) de números inteiros e um número inteiro n, inclua n na posição correta, ou seja, de tal maneira que a lista continue ordenada. def insere(lista_numero, n): """funç~ao recebe uma lista de números e um número, adiciona o número à lista, a ordena e retorna lista. list, int--> list""" lista_numero.insert(0, n) list.sort(lista_numero) return lista_numero 16 4. Faça uma função chamada **maiores** que dada uma lista de números inteiros e um número inteiro n, retorna outra lista, que contenha todos os números da lista original maiores que n, ordenados em ordem crescente def maiores(lista, n): """funç~ao recebe lista e número inteiro e retorna lista com elementos da entrada a partir do número inteiro list, int--> list""" if n in lista: list.sort(lista) lista1 = lista[list.index(lista, n) + 1:] return lista1 else: lista.insert(-1, n) list.sort(lista) lista1 = lista[list.index(lista, n) + 1:] return lista1 5. Faça uma função chamada **acima da media** que dada uma lista com as notas dos alunos de uma turma, retorne uma lista ordenada com as notas que ficaram acima da média. **DICA:** Aproveite a função desenvolvida no exerćıcio **maiores**. #colar aqui a funç~ao "maiores" do exercı́cio anterior def acima_da_media(lista): """funç~ao recebe lista e retorna lista ordenada list--> list""" media = int(sum(lista) / len(lista)) return maiores(lista, media) 17 6. Defina uma função chamada **eh ordenada** que dada uma lista não vazia contendo uma quantidade qualquer de valores numéricos diga se a lista está ordenada em ordem crescente, decrescente ou não ordenada. A retorno da função deve ser uma tupla cujo primeiro elemento é **True**, caso a lista esteja ordenada, e **False**, caso contrário e cujo segundo elemento seja crescente, decrescente ou desordenada, indicando se a lista está ordenada em ordem crescente, decrescente ou não está ordenada, respectivamente. **DICA**: Atenção! Lembre-se que algumas operações sobre listas alteram o valor da lista original ao invés de retornar uma nova lista com as alterações. Esse é o caso da função list.sort(lista), por exemplo. Então, se você precisar preservar o valor da lista original, faça uma cópia antes de alterá-la. def eh_ordenada(lista): """funç~ao recebe lista, retorna tupla com true e o tipo de ordem ou retorna tupla com false e desordenada list--> tuple""" tupla = () lista1 = lista[:] list.sort(lista) lista_ordenada = lista[:] list.reverse(lista) lista_invertida = lista[:] if lista_ordenada == lista1: tupla = tupla + (True,’crescente’) return tupla elif lista_invertida == lista1: tupla = tupla + (True,’decrescente’) return tupla else: tupla = tupla + (False,’desordenada’) return tupla 18 Machine Teaching 7 1. Faça uma função chamada **filtraMultiplos** para filtrar os múltiplos de um número n. Sua função deve receber como entrada uma lista de números e um número, e retornar outra lista contendo todos os elementos da lista original que forem diviśıveis por n. def filtraMultiplos(lista, n): """funç~ao que recebe lista e retorna lista com números múltiplos do número n list, int--> list""" multiplos = [] contador = 0 while contador < len(lista): if lista[contador] % n == 0: multiplos.insert(contador, lista[contador]) contador = contador + 1 return multiplos 2. Faça uma função chamada **uppCons** que receba como entrada uma frase e retorne a frase com todas as suas consoantes em maiúsculas (e os demais caracteres exatamente como estavam na frase original). def uppCons(texto): lista_texto = list(texto) contador = 0 letras = [] while contador < len(lista_texto): if lista_texto[contador] in ’çbcdfghjklmnpqrstvwxyz’: letras.insert(contador, lista_texto[contador].upper()) contador = contador + 1 else: letras.insert(contador, lista_texto[contador]) contador = contador + 1 return ’’.join(letras) 19 3. Faça uma função chamada **posLetra** que recebe como entrada uma string, uma letra, e um número que indica a ocorrência desejada da letra (1 para primeiraocorrência, 2 para segunda, etc). Sua função deve retornar em que posição da string aquela ocorrência da letra está. Caso exista menos ocorrências da letra do que a ocorrência pedida, a função deve retornar -1. Exemplo: >>>posLetra(”mariana come banana”, ’a’, 3) 6 (posição da terceira ocorrência da letra ’a’ na string dada) def posLetra(frase, letra, numero): ’’’funç~ao que retorna posiç~ao da letra na ocorrência desejada str, str, int--> int’’’ palavras = list(frase) contador = 0 ocorrencias = 0 while len(palavras) > contador: if letra in palavras[contador]: ocorrencias += 1 if ocorrencias == numero: return contador contador += 1 if ocorrencias < numero: return -1 else: return ocorrencias 20 4. Faça uma função chamada **repetidos** que receba como entrada uma lista de números, e retorne o número de vezes que um elemento da lista é igual ao elemento anterior. Exemplo: repetidos([1,4,3,3,2,3,3,3,3,5,4,6,6,7,6,8,8,7]); Resposta: 6. def repetidos(lista_num): ’’’funç~ao que conta quantas vezes um elemento apareceu repetido list--> int’’’ contador = 1 vezes = 0 while len(lista_num) > contador: if lista_num[contador] == lista_num[contador - 1]: vezes += 1 contador += 1 else: contador += 1 return vezes 5. Faça uma função chamada **fatorial** que dado um número, calcule o fatorial deste número. Não use a função factorial do módulo math. def fatorial(numero): """funç~ao calcula o fatorial de um número inteiro qualquer int--> int""" contador = 1 fatorial = numero while contador < numero: fatorial = fatorial * contador contador = contador + 1 return fatorial 21 6. Joãozinho adora quebra-cabeças, essa é sua brincadeira favorita. O grande problema, porém, é que às vezes o jogo vem com uma peça faltando. Isso irrita bastante o pobre menino, que tem de descobrir qual peça está faltando e solicitar uma peça de reposição ao fabricante do jogo. Sabendo que o quebra-cabeças tem N peças, numeradas de 1 a N e que exatamente uma está faltando, ajude Joãozinho a saber qual peça ele tem de pedir. Escreva uma função chamada **faltante** que, dada uma lista com N − 1 inteiros nu- merados de 1 a N, descubra qual número inteiro deste intervalo está faltando. *Entrada:** O parâmetro de entrada é uma lista L de tamanho N − 1 contendo números inteiros (não repetidos) de 1 a N. *Sáıda:** A sua função deve retornar o número inteiro x que pertence ao intervalo [1, N] mas que não pertence a lista de entrada L. Table 5: Exemplos: Entrada: [3,1] Sáıda: 2 Entrada: [1,2,3,5] Sáıda: 4 Entrada: [2,4,3] Sáıda: 1 def faltante(lista): """funç~ao recebe lista e retorna elemento que falta list--> int""" list.sort(lista) lista_ordenada = list(range(1, len(lista)+2)) contador = 0 while len(lista_ordenada) > contador+1: if lista[contador] != lista_ordenada[contador]: return lista_ordenada[contador] contador +=1 return lista_ordenada[-1] 22 Machine Teaching 8 1. Construa uma função chamada **freq palavras(frases)** que receba uma string e retorne um dicionário onde cada palavra dessa string seja uma chave e tenha como valor o número de vezes que a palavra aparece. Por exemplo: >>> freq_palavras(’dinheiro é dinheiro e vice versa’) #entrada de dados >>> {’dinheiro’:2, ’é’:1, ’e’:1, ’vice’:1, ’versa’:1} #saı́da de dados def freq_palavras(frase): ’’’funç~ao recebe frase e retorna dicionário com quantidade de cada palavra da string str--> dict’’’ palavras = frase.split() dict1 = {} counter = 0 for elementos in palavras: dict1[palavras[counter]] = palavras.count(palavras[counter]) counter += 1 return dict1 23 2. Escreva uma função chamada **total** que recebe uma lista de compras e um di- cionário contendo o preço de cada produto dispońıvel em uma determinada loja, e retorna o valor total dos itens da lista que estejam dispońıveis nesta loja. Por exemplo, para os dados: lista de compras = [’biscoito’, ’chocolate’, ’farinha’] produtos = ’amaciante’:4.99, ’arroz’:10.90, ’biscoito’:1.69, ’cafe’:6.98, ’chocolate’:3.79, ’farinha’:2.99 O valor retornado pela função será 8.47. *Retorne o resultado com 2 casas decimais, utilizando a função round(número, 2). def total(lista, produtos): ’’’funç~ao calcula total da lista de compras de acordo com os preços do dicionário list, dict--> float’’’ contador = 0 total = 0 for elementos in lista: if lista[contador] in produtos: total += produtos[lista[contador]] contador += 1 return round(total, 2) 24 3. Faça uma função chamada **lingua p** que receba como parâmetro uma palavra (em português) e retorne esta mesma palavra traduzida para a ĺıngua do P. Uma palavra foi traduzida para a ĺıngua do P quando, após cada vogal da palavra original, é inserida a sequência de letras mais a vogal original. A resposta deve ignorar a diferença entre minúsculas e maiúsculas e retornar a palavra traduzida toda em minúsculas. Por exemplo: >>>lingua_p(’exemplo’) #entrada de dados >>>epexepemplopo #saı́da de dados >>>lingua_p(’entao’) >>>epentapaopo >>>lingua_p(’Caderno’) >>>capadepernopo def lingua_p(palavra): ’’’funç~ao que recebe palavra em português e retorna palavra traduzida em lı́ngua do p. str--> str’’’ traduzido_p = [] contador = 0 for letra in list(palavra): if letra in ’aeiouáéı́óú’: traduzido_p.append(letra + ’p’ + letra) else: traduzido_p.append(letra) return ’’.join(traduzido_p) 25 4. Faça uma função chamada **qtd divisores** que conte quantos divisores um número tem. Este número será passado como entrada. Exemplo: Se o número for 10, os divisores são: 1, 2, 5 e 10; total de 4 divisores. def qtd_divisores(numero): ’’’funç~ao que verifica quantos divisores um número qualquer tem. int--> int’’’ contador = 0 for elemento in range(1, numero): if numero % elemento == 0: contador += 1 if numero < 0: return contador else: return contador + 1 26 5. Faça uma função chamada **primo** que dado um número inteiro positivo, verifique se este número é primo ou não. Retorne um valor booleano. Dica: uma estratégia simples para identificar a primalidade de um número é verificar se não existe nenhum número menor que ele próprio (e maior ou igual a 2) que o divida. Dica 2: O número de divisões indicado na dica anterior é maior que o necessário. Você consegue reduzi-lo? def primo(numero): ’’’funç~ao que verifica se um número qualquer é primo. int--> bool’’’ contador = 0 for elemento in range(2, numero): if numero % elemento == 0: contador += 1 if contador > 0: return False else: return True 27 6. Sendo H = 1+ 1 2 + 1 3 + 1 4 + ...+ 1 N faça uma função chamada **soma h** para calcular e retornar o valor H com N termos onde N é inteiro e dado com entrada. Retorne seu resultado somente com 2 casas decimais, utilizando a função round(número, 2). def soma_h(N): ’’’funç~ao calcula somatório de fraç~oes com N termos onde cada fraç~ao tem denominador igual a sua posiç~ao no somatório. int--> float’’’ lista_soma = [1] for numero in range(2, N+1): lista_soma.append((numero)**-1) somatorio = sum(lista_soma) return round(somatorio, 2) 28 Machine Teaching 9 1. Faça uma função booleana chamada **eh quadrada** para identificar se uma matriz é quadrada. Observação: uma matriz vazia (sem nenhuma linha nem coluna) é considerada quadrada. def eh_quadrada(matriz): ’’’verifica se a matriz é quadrada list--> bool’’’ contador = 0 if len(matriz) == 0: return True for item in matriz: if len(item) == len(matriz): contador += 1 if contador == len(matriz): return True else: return False 2. Faça uma função definida por **conta numero(numero, matriz)** que dado um número inteiro e uma matriz de inteiros de tamanho qualquer, conta e retorna quantas vezes aquele número aparece na matriz. def conta_numero(numero, matriz): ’’’percorre a matriz inteira e verifica se há numero int,list--> int ’’’ total = 0 for item in matriz: for item2 in item: if item2 == numero: total += 1 return total 29 3. Faça uma função chamada **media matriz** que dada uma matriz de inteiros não vazia, retorna a média de todos os números da matriz (com exatamente duas casas deci- mais de precisão). def media_matriz(matriz): ’’’calcula média de todos os elementos de uma matriz e retorna resultado com duas casas de precis~ao list--> float’’’ soma = 0 #inicia contador em zero contador = 0 #inicia contador em zero for item in matriz: for item2 in item: soma += item2 contador += 1 media = soma/contador return round(media, 2) 30 4. Uma pista de Kart permite 10 voltas para cada um dos 6 corredores. Faça uma função chamada **melhor volta** que receba como entrada uma matriz 6 x 10 com os tempos em segundos dos corredores em cada volta. A função deve retornar uma **tupla** informando: De quem foi a melhor volta da prova, com qual tempo e em que volta. Assuma que os corredores tem tempos diferentes. (dica: use a função ‘min‘). Obs: use números de 1 a 6 para os corredores e de 1 a 10 para as voltas (não esqueça que em Python os ı́ndices começam de 0) def melhor_volta(matriz): ’’’funç~ao que recebe matriz de voltas com tempos e verifica quem fez a melhor volta, com que tempo e em que volta, e retorna tupla com dados nessa ordem list--> tuple’’’ lista_tempos = [] lista_voltas = [] for voltas in range(6): for tempos in range(10): if matriz[voltas][tempos] == min(matriz[voltas]): lista_tempos.append(tempos) for i in range(6): lista_voltas.append(matriz[i][lista_tempos[i]]) volta = lista_voltas.index(min(lista_voltas)) tempo = min(lista_voltas) piloto = matriz[volta].index(tempo) + 1 tupla = (volta + 1, tempo, piloto) return tupla 31 5. Suponha que os dados de funcionários de uma empresa sejam armazenados em uma matriz como a do exemplo a seguir: ”AdalbertoFerreira” ”566” ”Contabilidade” ”(21)84564 - 5248” ”JulianaVasconcelos” ”465” ”RH” ”(21)3555 - 4552” ”FlaviaAmorim” ”565” ”Contabilidade” ”(21)2134 - 4845” Cada linha da matriz tem quatro entradas, representando as informações referentes a nome, registro, setor e telefone de um funcionário, nesta ordem. O número de linhas depende da quantidade de funcionários. Todas as entradas da matriz estão em formato de string. Escreva uma função chamada **busca** que receba uma matriz como a do exemplo e faça uma busca por setor, ou seja, dado um nome de um setor da empresa, a função retorna os dados de todos os funcionários daquele setor. Por exemplo: >>>busca("Contabilidade", matriz) #entrada de dados >>>[[‘Adalberto Ferreira’, ‘566’, ‘(21)84564-5248’],[‘Flavia Amorim’, ‘465’, ‘(21)2134-4845’]] #saı́da de dados Se nenhum registro for encontrado, a função deverá retornar uma lista vazia. def busca(setor, matriz): ’’’funç~ao retorna dados de todos os funcionários de determinado setor str--> list’’’ dados = [] for i in range(len(matriz)): if setor in matriz[i]: dados.append(matriz[i]) for j in range(len(dados)): if dados[j][2] == setor: del dados[j][2] 32