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.
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.” .
Você pode assumir que em todos os nomes a serem abreviados:
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
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.
- Há no mínimo um prenome e um sobrenome (ou seja, pelo menos
- 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)
com : - O sobrenome é
(a última palavra). - As iniciais são as primeiras letras de
. - Saída:
, seguido de ", " e depois as iniciais em maiúsculas cada uma com um ponto e separadas por espaço.
- O sobrenome é
- Exemplos:
- “Humberto Gessinger”
“GESSINGER, H.” - “Luis Fernando Verissimo”
“VERISSIMO, L. F.” - “Joao Carlos Silva Pereira”
“PEREIRA, J. C. S.”
- “Humberto Gessinger”
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”.
Pegaremos o exemplo “Luis Fernando Verissimo”.
- Ler a linha e remover espaços extras nas pontas (trim). Resultado: “Luis Fernando Verissimo”.
- Quebrar a string em palavras usando o espaço como separador. Isso gera a lista de palavras:
-
“Luis” -
“Fernando” -
“Verissimo”
-
- Identificar o sobrenome:
. Transformar em maiúsculas: “VERISSIMO”. - Para cada palavra antes do sobrenome (ou seja,
e ): - Pegar a primeira letra, transformar em maiúscula e acrescentar um ponto:
“L.” e “F.”.
- Pegar a primeira letra, transformar em maiúscula e acrescentar um ponto:
- Juntar as iniciais com um espaço entre elas: “L. F.”.
- 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.:
produz . - upper: método que converte letras para maiúsculas. Ex.:
-> “ABC”. - indexing / slicing: para obter a primeira letra de uma palavra usamos a posição zero:
. - join: para juntar várias strings com um separador. Ex.:
-> “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
.
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
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
), interpretar as próximas 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
, 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()