Introdução
Neste artigo, todo o código será em Python.
No desafio #48in24, o Exercism está explorando como a comunidade aborda diferentes desafios de programação. "Hello, World!" é o exercício mais básico do Exercism e foi considerado simples demais para ganhar um vídeo oficial. Mas eu não tenho tanta certeza, e achei que poderia ser divertido dar uma olhada em algumas abordagens mais interessantes para este exercício simples!
Conheça o "Hello, World!"
"Hello, World!" é provavelmente o programa mais famoso do mundo. Praticamente qualquer pessoa que aprendeu a programar já o escreveu pelo menos uma vez. A sua simplicidade e a mensagem amigável costumam representar o primeiro passo no maravilhoso mundo da programação.
No Exercism, você recebe uma função chamada hello que retorna "Goodbye, Mars!".
def hello():
return 'Goodbye, Mars!'
Sua tarefa é alterá-la para que retorne "Hello, World!".
A abordagem tradicional
Começando pela abordagem mais simples, aquela que o Exercism espera que você implemente. Com uma simples mudança da string de "Goodbye, Mars!" para "Hello, World!", já podemos retorná-la com segurança!
def hello() -> str:
return 'Hello, World'
Abordagens alternativas
Vou resolver este exercício usando todos os métodos diferentes que eu conseguir imaginar.
Para fins narrativos, vou me referir a essa função simples como a "máquina", uma máquina cujo único trabalho é retornar uma saudação "Hello, World!".
Vamos ver no que isso vai dar...!
A junção
A máquina já conhece algumas das palavras, mas parece que ela não consegue, hã, digamos, bem, juntá-las.
def hello() -> str:
words = ["Hello", " world!"]
return ",".join(words)
O título
A bateria da máquina está meio fraca hoje, porque todas as palavras estão sem energia e não estão sendo capitalizadas corretamente.
def hello() -> str:
words = "hello, world!"
return words.title()
A reversão
De algum modo, a máquina conhece a saudação, mas tem algo nela que parece um pouco... ao contrário.
def hello() -> str:
sdrow = "!dlroW ,olleH"
return sdrow[::-1]
Observação: Reverse String é um exercício em destaque no desafio #48in24. Lembre-se de dar uma olhada nas várias abordagens de como fazê-lo em linguagens diferentes!
Fatiar e picar
Talvez a máquina precise trocar o óleo, porque a mensagem de saudação normal parece estar um pouco embaralhada.
def hello() -> str:
w = "Holld, Werlo!"
return f"{w[0]}{w[8]}{w[2:4]}{w[1]}{w[5:8]}{w[-2]}{w[-4:-2]}{w[4]}{w[-1]}"
O curry
Opa, opa, algumas partes da máquina estão em modo de manutenção. Ela esqueceu a mensagem de saudação e agora só consegue aceitá-la parte por parte.
def hello(greet: str):
def world(location: str) -> str:
return f"{greet}, {location}!"
return world
hello = hello("Hello")
hello("World")
O ASCII
Você derramou um pouco de limonada na máquina sem querer e agora ela só mostra esses números estranhos em vez dos caracteres de sempre na mensagem.
def hello() -> str:
ascii = [72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33]
return ''.join(chr(value) for value in ascii)
O dicionário
Você assistiu ao noticiário e viu uma reportagem sobre um homem que foi resgatado usando um sinal de S.O.S. "Talvez a máquina também devesse saber lidar com código Morse!", você pensou, mas sem saber bem por quê. O único trabalho dela é retornar a mensagem de saudação...
def hello(morse) -> str:
morse_code = {
"...." : "H",
"." : "e",
".-.." : "l",
"---" : "o",
"--..--": ",",
"/" : " ",
".--" : "W",
".-." : "r",
"-.." : "d",
"-.-.--": "!"
}
return "".join(morse_code[value] for value in morse.split())
print(hello(".... . .-.. .-.. --- --..-- / .-- --- .-. .-.. -.. -.-.--"))
O funcional
Como sua máquina atual está sujeita a mudanças e danos, você decide construir uma máquina menor, mas imutável e indestrutível, que faz exatamente a mesma coisa. Sempre que a máquina normal não estiver funcionando ou estiver dando problemas, ela ativará a menor em seu lugar. Espera aí, por que não usamos logo a menor a partir de agora...
def hi() -> str:
return "Hello, World!"
def hello() -> str:
return hi()
A permutação
Uma forte tempestade passou por aqui e sua pobre máquina azarada foi atingida por um raio. Ela ainda liga, mas agora está se comportando de forma estranha. Todos os caracteres para montar a mensagem de saudação ainda estão lá, mas fora de ordem, e o dano na placa lógica faz com que a máquina não consiga mais acertar a ordem da mensagem. E, para a sua sorte, a máquina menor incrivelmente confiável e indestrutível que você construiu antes, na verdade, podia ser roubada (sim, ela sumiu!). Por isso, você decide simplesmente deixar seu velho amigo tentar todas as formas possíveis de embaralhar essas letras até formar a mensagem correta. Afinal, são só 13 caracteres e a máquina tem bastante memória. Isso deve ser rápido...
from itertools import permutations
def hello() -> str:
chars = ['H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!']
all_permutations = permutations(chars)
for perm in all_permutations:
if ("".join(perm) == "Hello, World!"):
return ''.join(perm)
A busca
Você decidiu atualizar a máquina para que ela pudesse cumprimentar em diferentes idiomas. Mas o ÚNICO trabalho dela é dizer "Hello, World!" em inglês, então, na sua confusão, ela decide baixar um zilhão de formas de dizer "Hello, World!", cada uma com letras maiúsculas e posições ligeiramente diferentes. Isso te deixou na dúvida, sem saber qual escolher, mas pelo menos todas estão em alguma ordem. Você precisa dizer à máquina a forma correta de escrever a frase, para que ela encontre a frase e volte ao normal (talvez).
def hello(my_fav_phrase) -> str:
combinations = [
"HELLO, WORLD!",
# many many many items later,
"hello, world!"
]
lower = 0
upper = len(combinations)
while lower <= upper:
mid = (lower + upper) // 2
mid_val = combinations[mid]
if mid_val == my_fav_phrase:
return combinations[mid]
elif mid_val < my_fav_phrase:
lower = mid + 1
else:
high = mid - 1
return "Error: Can't find {my_fav_phrase}"
hello("Hello, World!")
Seu irmão mais novo, que estava assistindo a tudo, perguntou por que você simplesmente não apagou a bagunça toda e depois deu à máquina a frase correta para ela memorizar. Você não respondeu e apenas o encarou.
Com classe
Você decide fazer experimentos e ajustar a máquina para se comportar de maneira diferente conforme o botão que for pressionado.
Você pensou em deixá-la um pouco mais informal, começando a dizer "Oi", mas, sendo uma pessoa de classe, você decide usar sempre o método hello e cobrir o outro com fita adesiva.
Você percebe que tem bastante tempo livre para essas coisas...
class Greeting:
location = "World"
def __init__(self) -> None:
pass
def hello(self):
return f"Hello, {self.location}!"
def hi(self):
return f"Hi, {self.location}!"
salutation = Greeting()
salutation.hello()
A recursão
Por algum motivo, você decidiu que seria engraçado se a máquina tivesse um pouco de atraso e só respondesse 10 segundos depois. Seu irmão mais uma vez levanta a questão da lógica por trás desse recurso, porque, segundo ele, você é a única pessoa que usa a máquina.
import time
def hello(n=10):
if n == 0:
return "Hello, World!"
else:
time.sleep(1)
return hello(n-1)
A aleatoriedade
De repente, um dia você simplesmente se cansa da mesma saudação repetidas vezes e decide deixá-la te cumprimentar uma última vez e aposentar a máquina de vez, sem nunca mais tocar nela. Como a máquina esteve com você nos bons e maus momentos por muito tempo, você decide deixar esse encontro final entre "amigos" nas mãos do destino. Você a liga uma última vez e simplesmente a deixa girar...
import random
def hello():
chars = list("Helo,Wrld!")
greeting = ""
while (greeting != "Hello, World!"):
greeting = "".join(random.choices(chars, k=13))
return greeting
O fim
Esse foi um passeio e tanto pela minha mente. Não sei se foi útil, mas com certeza foi divertido.
Obrigado pela leitura e boa programação!