Introducción
A efectos de este artículo, todo el código estará en Python.
En su reto #48in24, Exercism explora cómo aborda la comunidad distintos retos de programación. «Hello, World!» es el ejercicio más básico de Exercism y se consideró demasiado simple como para hacer un vídeo oficial sobre él. Pero yo no lo tengo tan claro, y pensé que podría ser divertido echar un vistazo a algunos enfoques más interesantes para este sencillo ejercicio.
Conoce a «Hello, World!»
«Hello, World!» es probablemente el programa más famoso del mundo. Prácticamente cualquiera que haya aprendido a programar lo ha escrito al menos una vez. Su sencillez y su mensaje amistoso suelen marcar el primer paso en el maravilloso mundo de la programación.
En Exercism se te proporciona una función llamada hello que devuelve «Goodbye, Mars!».
def hello():
return 'Goodbye, Mars!'
Tu tarea es cambiarla para que devuelva «Hello, World!» en su lugar.
El enfoque tradicional
Para empezar, tenemos el enfoque más sencillo, el que Exercism espera que implementes. Con solo cambiar el string de «Goodbye, Mars!» a «Hello, World!», ¡ya podemos devolverlo sin problema!
def hello() -> str:
return 'Hello, World'
Enfoques alternativos
Voy a resolver este ejercicio usando todos los métodos distintos que se me ocurran.
A efectos narrativos, me referiré a esta sencilla función como «la máquina», una máquina cuyo único trabajo es devolver un saludo de «Hello, World!».
¡A ver adónde nos lleva...!
La unión
La máquina ya conoce algunas de las palabras, pero parece que no consigue encadenarlas, ejem, bueno, unirlas.
def hello() -> str:
words = ["Hello", " world!"]
return ",".join(words)
El título
Hoy la batería de la máquina está un poco baja, porque a todas las palabras les falta energía y no se escriben con mayúscula inicial como deberían.
def hello() -> str:
words = "hello, world!"
return words.title()
La inversión
La máquina de algún modo conoce el saludo, pero algo en él parece un poco... al revés.
def hello() -> str:
sdrow = "!dlroW ,olleH"
return sdrow[::-1]
Nota: Reverse String es un ejercicio destacado del reto #48in24. ¡No dejes de echar un vistazo a los distintos enfoques para resolverlo en diferentes lenguajes!
Cortar y trocear
Puede que haya que cambiarle el aceite a la máquina, porque el mensaje de saludo normal parece estar un poco desordenado.
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]}"
El curry
Ay, ay, algunas partes de la máquina están en modo mantenimiento. Ha olvidado el mensaje de saludo y ahora solo puede aceptarlo por partes.
def hello(greet: str):
def world(location: str) -> str:
return f"{greet}, {location}!"
return world
hello = hello("Hello")
hello("World")
El ASCII
Se te derramó sin querer un poco de limonada sobre la máquina y ahora solo te muestra estos números extraños en lugar de los caracteres habituales del mensaje.
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)
El diccionario
Viste las noticias y apareció un reportaje sobre un hombre rescatado gracias a una señal S.O.S. «¡Quizá la máquina también debería saber manejar el código morse!», pensaste, aunque no sabes muy bien por qué. Su único trabajo es devolver el mensaje de saludo...
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(".... . .-.. .-.. --- --..-- / .-- --- .-. .-.. -.. -.-.--"))
El enfoque funcional
Como tu máquina actual es propensa a cambios y averías, decides construir una máquina más pequeña pero inmutable e indestructible que hace exactamente lo mismo. Siempre que la máquina normal no funcione o se comporte de forma rara, activará la pequeña en su lugar. Un momento, ¿y por qué no usamos directamente la pequeña a partir de ahora...?
def hi() -> str:
return "Hello, World!"
def hello() -> str:
return hi()
La permutación
Pasó una fuerte tormenta eléctrica y un rayo alcanzó a tu pobre y desafortunada máquina. Todavía se enciende, pero ahora se comporta de forma extraña. Todos los caracteres para armar el mensaje de saludo siguen ahí, pero están desordenados, y el daño en la placa lógica hace que la máquina ya no pueda acertar con el orden del mensaje. Y para colmo de tu suerte, la pequeña máquina increíblemente fiable e indestructible que construiste antes resultó ser robable (sí, ¡ha desaparecido!). Así que decides dejar que tu vieja amiga pruebe todas las formas posibles de reordenar esas letras hasta dar con el mensaje correcto. Al fin y al cabo, solo son 13 caracteres y la máquina tiene mucha memoria. Esto debería 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)
La búsqueda
Decidiste actualizar la máquina para que pudiera saludar en distintos idiomas. Pero su ÚNICO trabajo es decir «Hello, World!» en inglés, así que, confundida, decide descargarse un montón de formas de decir «Hello, World!», cada una con mayúsculas y colocación ligeramente distintas. Eso te dejó confundido, sin saber cuál elegir, pero al menos todas están ordenadas de alguna manera. Tienes que decirle a la máquina la forma correcta de formularlo, para que pueda encontrar la frase y volver a ser normal (quizá).
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!")
Tu hermano pequeño, que ha estado mirando todo el rato, te preguntó por qué no borrabas simplemente todo ese lío y le dabas a la máquina la frase correcta para que la recordara. No le respondiste y te limitaste a mirarlo con el ceño fruncido.
La elegante
Decides experimentar y ajustar la máquina para que se comporte de forma distinta según el botón que se pulse.
Pensaste en hacerla un poco más informal, que empezara a decir «Hi», pero, como eres una persona elegante, decides usar siempre el método hello y tapar el otro con cinta aislante.
Te das cuenta de que tienes bastante tiempo libre para estas cosas...
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()
La recursión
Por alguna razón, decidiste que sería divertido que la máquina fuera un poco lenta y tardara 10 segundos en responder. Tu hermano vuelve a preguntarte por la lógica de esta funcionalidad, porque, según él, eres el único que usa la máquina.
import time
def hello(n=10):
if n == 0:
return "Hello, World!"
else:
time.sleep(1)
return hello(n-1)
La aleatoriedad
De repente, un día te cansas del mismo saludo una y otra vez, así que decides dejar que te salude una última vez y jubilar la máquina para siempre, sin volver a tocarla jamás. Como la máquina ha estado contigo en las buenas y en las malas durante mucho tiempo, decides dejar esta última cita entre «amigos» en manos del destino. La enciendes una última vez y dejas que gire...
import random
def hello():
chars = list("Helo,Wrld!")
greeting = ""
while (greeting != "Hello, World!"):
greeting = "".join(random.choices(chars, k=13))
return greeting
El final
Ese ha sido un viaje alocado por mi mente. No estoy seguro de que haya sido útil, pero desde luego ha sido divertido.
¡Gracias por leer y feliz programación!