Faça funções Python para:
Determinar o máximo e o mínimo de manchas solares em um período dado. Exemplo: de janeiro de 1818 a julho de 1834.

Passo 1

Beleza, aqui a ideia é criar duas funções em Python que, dado um conjunto de dados de manchas solares (onde cada entrada tem uma data, tipo “janeiro/1818”, e o número de manchas naquele mês), retornem o valor máximo e o valor mínimo desse período.
Conteúdo da matéria: manipulação de listas, slicing (fatiamento) e uso das funções built-in max() e min() do Python; além de um jeitinho de filtrar datas.

Passo 2

Primeiro, vamos entender como os dados estão estruturados. Supondo que você tenha uma lista assim:
dados = [
    ("1818-01", 15),
    ("1818-02", 23),
    …
    ("1834-07",  5)
]
Cada tupla é (“ano-mês”, número_de_manchas). Aí precisamos transformar essas strings em algo que a gente possa comparar para “fatiar” o período desejado.

Passo 3

Para filtrar o período, a gente pode:
  1. transformar a data “YYYY-MM” em um número inteiro YYYY*100 + MM,
  2. comparar esse inteiro com o início e o fim.
Exemplo: “1818-01” → 181801.
Dessa forma, fica fácil ver se 181801 está entre 181801 (“jan/1818”) e 183407 (“jul/1834”).

Passo 4

Depois de filtrar, sobra só uma lista de valores de manchas. Aí aplicamos:
  • valor máximo:
    \max_i x_i = max(lista_de_valores)
  • valor mínimo:
    \min_i x_i = min(lista_de_valores)

Passo 5

Bora juntar tudo numa função só. Vamos criar duas: max_manchas(dados, inicio, fim) e min_manchas(dados, inicio, fim).

Resposta

def _date_para_int(ym):
    # ym no formato "YYYY-MM"
    ano, mes = ym.split('-')
    return int(ano) * 100 + int(mes)

def _filtrar_periodo(dados, inicio, fim):
    # inicio e fim no formato "YYYY-MM"
    ini = _date_para_int(inicio)
    fim = _date_para_int(fim)
    # retorna só os valores de manchas dentro do período
    return [
        valor
        for (ym, valor) in dados
        if ini <= _date_para_int(ym) <= fim
    ]

def max_manchas(dados, inicio, fim):
    """
    Retorna o número máximo de manchas solares
    no período de inicio até fim (inclusive).
    """
    valores = _filtrar_periodo(dados, inicio, fim)
    if not valores:
        raise ValueError("Nenhum dado no período solicitado")
    return max(valores)  # \max_i x_i

def min_manchas(dados, inicio, fim):
    """
    Retorna o número mínimo de manchas solares
    no período de inicio até fim (inclusive).
    """
    valores = _filtrar_periodo(dados, inicio, fim)
    if not valores:
        raise ValueError("Nenhum dado no período solicitado")
    return min(valores)  # \min_i x_i

# Exemplo de uso:
# dados = [("1818-01",15), ("1818-02",23), ..., ("1834-07",5)]
# print(max_manchas(dados, "1818-01", "1834-07"))  # ex: 100
# print(min_manchas(dados, "1818-01", "1834-07"))  # ex:   5

Exercícios relacionados