Uploaded avatar of glaxxie

14 maneiras cada vez mais estranhas de resolver o Hello World!

@glaxxie
Mais de 2 anos atrás

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!

18 de janeiro de 2024 · Achou útil?