Como todos nós sabemos, em trabalhos científicos, é comum usarmos abre- viaturas para citar autores. De acordo com a norma da ABNT (Associação Bra- sileira de Normas Técnicas), por exemplo, cada autor deve ser referenciado pelo último sobrenome, em
letras maiúsculas, seguido(s) do(s) prenome(s) e outro(s) sobrenome(s), abreviados. Para ilustrar, em um hipotético trabalho o cantor Humberto Gessinger deve ser citado pela abreviatura “GESSINGER, H.” .
Há uma lista contendo centenas de autores que devem ser citados em seu trabalho. Infelizmente, não há tempo para abreviar cada um deles manual- mente, pois, dentre outras coisas, você precisa estudar para várias provas. Considerando seus conhecimentos de programação, você decidiu escrever um programa para resolver este problema. O objetivo do seu programa é abre- viar adequadamente uma lista de nomes completos e imprimir o resultado na tela do computador. Deste modo, se a lista a ser processada contiver o nome do autor “Luis Fernando Verissimo”, seu programa deve imprimir a cadeia de caracteres “VERISSIMO, L. F.” na tela do computador.
Você pode assumir que em todos os nomes a serem abreviados:
  • haverá no mínimo um prenome e um sobrenome;
  • haverá somente um espaço separando uma palavra (nome, sobrenome ou prenome) da outra;
  • haverá somente caracteres puros e espaços ’ ’ (não havendo acentuação de qualquer tipo, pontuação, números ou outros símbolos que não pertencem ao alfabeto ocidental) e
  • não haverá preposições.

Passo 1

O que o problema pede e quais são os dados/hipóteses:
  • Pede-se transformar nomes completos em abreviaturas no formato: SOBRENOME (em maiúsculas), espaço, vírgula, espaço, e depois as iniciais dos demais nomes em maiúscula, cada inicial seguida de ponto e separada por um espaço. Ex.: “Luis Fernando Verissimo” deve virar “VERISSIMO, L. F.”.
  • Hipóteses fornecidas (vou usar exatamente as que você deu):
    • Há no mínimo um prenome e um sobrenome (ou seja, pelo menos \,2 palavras no nome).
    • Somente um espaço separa as palavras.
    • Somente letras do alfabeto e espaços (sem acentuação, sinais, números ou preposições).
    • Não há preposições.
  • O enunciado fala em “uma lista contendo centenas de autores”, então o programa deve processar várias linhas (cada linha sendo um nome completo) e emitir a abreviatura correspondente para cada linha.

Passo 2

Formato desejado da saída e exemplos concretos:
  • Para um nome com palavras (separadas por espaço) w_1, w_2, \dots, w_{k} com k\ge2:
    • O sobrenome é w_k (a última palavra).
    • As iniciais são as primeiras letras de w_1, w_2, \dots, w_{k-1}.
    • Saída: \text{MAIÚSCULAS}(w_k)Ú, seguido de ", " e depois as iniciais em maiúsculas cada uma com um ponto e separadas por espaço.
  • Exemplos:
    • “Humberto Gessinger” \Rightarrow “GESSINGER, H.”
    • “Luis Fernando Verissimo” \Rightarrow “VERISSIMO, L. F.”
    • “Joao Carlos Silva Pereira” \Rightarrow “PEREIRA, J. C. S.”

Passo 3

Ideia do algoritmo passo a passo (sem código ainda), com transformação aplicada a um exemplo:
Pegaremos o exemplo “Luis Fernando Verissimo”.
  1. Ler a linha e remover espaços extras nas pontas (trim). Resultado: “Luis Fernando Verissimo”.
  2. Quebrar a string em palavras usando o espaço como separador. Isso gera a lista de palavras:
    • w_1 = “Luis”
    • w_2 = “Fernando”
    • w_3 = “Verissimo”
  3. Identificar o sobrenome: w_3. Transformar em maiúsculas: “VERISSIMO”.
  4. Para cada palavra antes do sobrenome (ou seja, w_1 e w_2):
    • Pegar a primeira letra, transformar em maiúscula e acrescentar um ponto: w_1[0]\to “L.” e w_2[0]\to “F.”.
  5. Juntar as iniciais com um espaço entre elas: “L. F.”.
  6. Concatenar sobrenome, vírgula e espaço, e as iniciais: “VERISSIMO, L. F.”.

Passo 4

Ferramentas de string que usaremos e por que funcionam (explicação bem didática):
  • split: método que transforma uma string em uma lista de palavras separadas por espaços. Ex.: "a b c".split(' ') produz ["a","b","c"].
  • upper: método que converte letras para maiúsculas. Ex.: "abc".upper() -> “ABC”.
  • indexing / slicing: para obter a primeira letra de uma palavra usamos a posição zero: w[0].
  • join: para juntar várias strings com um separador. Ex.: ' '.join(['L.', 'F.']) -> “L. F.”.
    Por que isso basta:
  • As hipóteses garantem que há exatamente um espaço entre palavras e que não há caracteres estranhos; portanto, split por espaço e pegar a última palavra é seguro e simples.
  • A operação é linear no número de caracteres do nome, e funciona para qualquer k\ge2.

Passo 5

Casos de entrada e detalhes práticos (como o programa vai ler os nomes):
  • Em problemas semelhantes, às vezes a primeira linha contém um número n com a quantidade de nomes, e às vezes não — há listas até EOF. Para tornar o programa robusto, ele pode:
    • Ler todas as linhas do fluxo de entrada;
    • Se a primeira linha contiver apenas dígitos (ou seja, for um número inteiro n), interpretar as próximas n linhas como nomes; caso contrário, interpretar todas as linhas não vazias como nomes.
  • Para cada nome válido lido, aplicar o algoritmo dos passos anteriores e imprimir uma linha com a abreviatura correspondente.

Passo 6

Possíveis armadilhas e como evitá-las:
  • Nomes com espaços extras nas pontas: usar trim (strip) antes de split.
  • Linhas em branco: descartar linhas vazias.
  • Garantir que, ao pegar w[0], a palavra não seja vazia — com as hipóteses do enunciado isso não ocorre (cada palavra tem pelo menos uma letra), mas o trim + split evita strings vazias.
  • Manter o formato exatamente com vírgula e um espaço: “SOBRENOME, I. J.”.

Resposta

#!/usr/bin/env python3
import sys

def abbreviate(name):
    parts = name.strip().split(' ')
    last = parts[-1].upper()
    initials = ' '.join(p[0].upper() + '.' for p in parts[:-1])
    return f"{last}, {initials}"

def main():
    raw_lines = [line.rstrip('\n') for line in sys.stdin]
    lines = [line for line in raw_lines if line.strip() != '']
    if not lines:
        return
    first = lines[0].strip()
    names = []
    if first.isdigit():
        try:
            n = int(first)
            names = lines[1:1+n]
        except Exception:
            names = lines
    else:
        names = lines
    for name in names:
        print(abbreviate(name))

if __name__ == "__main__":
    main()

Exercícios relacionados