Two Fer

Two Fer

Fácil

Introducción

En algunos acentos del inglés, cuando dices «two for» rápido, suena como «two fer». Two-for-one es una forma de decir que si compras uno, también te llevas otro gratis. Así que la frase «two-fer» a menudo implica una oferta de dos por uno.

Imagina una panadería que tiene una oferta de temporada en la que puedes comprar dos galletas por el precio de una («two-fer one!»). Aceptas la oferta y (con mucha generosidad) decides darle la galleta extra a otra persona en la fila.

Instrucciones

Tu tarea es determinar qué dirás al regalar la galleta extra.

Si sabes el nombre de la persona (por ejemplo, si se llama Do-yun), dirás:

One for Do-yun, one for me.

Si no sabes el nombre de la persona, en su lugar dirás you.

One for you, one for me.

Aquí tienes algunos ejemplos:

Nombre Diálogo
Alice One for Alice, one for me.
Bohdan One for Bohdan, one for me.
One for you, one for me.
Zaphod One for Zaphod, one for me.

Instrucciones específicas de Odin

Odin admite argumentos predeterminados. Los argumentos predeterminados son una funcionalidad muy útil que permite llamar a un procedimiento con distintos conjuntos de parámetros para casos de uso en los que necesitas API relacionadas pero diferentes.

Sin argumentos predeterminados, podrías terminar con una explosión en la cantidad de procedimientos que tu API necesita. Los lenguajes que no admiten argumentos predeterminados, como Java, recurren a la sobrecarga de métodos para lograr el mismo efecto (con más código) o tienen que ofrecer procedimientos con, potencialmente, un gran conjunto de argumentos.

Veamos el ejemplo de un procedimiento greeting en el que queremos poder especificar el idioma, si el nombre va en mayúsculas y si debemos incluir un signo de exclamación al final del saludo. Después de algunos análisis, descubrimos que el grupo más grande de usuarios especifica inglés como idioma, no escribe el nombre en mayúsculas y no quiere un signo de exclamación al final; el segundo grupo más grande agrega un signo de exclamación al final del saludo.

Podríamos crear un único procedimiento con todos los argumentos:

greeting :: proc(name: string, language: Language, do_uppercase: bool, add_exclamation: bool) {
	...
}

Esto obligaría a todos los usuarios a leer la documentación de todos los argumentos y a llenarlos siempre.

Sin argumentos predeterminados, también podríamos definir varios procedimientos con distintos conjuntos de parámetros:

greeting_common :: proc(name: string) {...}

greeting_with_exclamation :: proc(name: string) {...}

greeting_general :: proc(name: string, language: Language, do_uppercase: bool, add_exclamation: bool) {...}

// Odin supports overloading but it has to be explicitly defined
greeting :: proc {
	greeting_common,
	greeting_with_exclamation,
	greeting_general,
}

Si tu lenguaje admite argumentos predeterminados, como lo hace Odin, puedes simplemente dar valores predeterminados razonables a los argumentos menos usados. Quien llama puede omitir los argumentos predeterminados, con lo que el procedimiento usa los valores predeterminados provistos, o sobrescribirlos.

greeting :: proc(name: string, language: Language = Language.English, do_uppercase : bool = false, add_exclamation: bool = false) {...}

// Note: because Odin supports type inference, we can simplify the interface.
greeting :: proc(name: string, language:= Language.English, do_uppercase := false, add_exclamation:= false) {...}

Se puede llamar al procedimiento con todos los argumentos predeterminados:

greeting("John Doe")

Los argumentos importantes para quien llama se pueden sobrescribir:

greeting("John Doe", Language.Spanish)

Si los argumentos que necesitas están en orden posicional, como en el ejemplo anterior, no hace falta nombrarlos, pero si necesitas omitir algunos, entonces tienes que nombrar los argumentos a partir del primero que omitas.

greeting("John Doe", add_exclamation=true)

Gestión de memoria

En este ejercicio vas a implementar un procedimiento que debe asignar memoria para el string que devuelve. Liberar ese string es responsabilidad de quien llama al procedimiento.

// The procedure will be called like that:
str := two_fer("Alice")
// ...
// and eventually the caller will delete the string
delete(str)

También puede interesarte la documentación oficial de Odin sobre argumentos predeterminados y los argumentos con nombre de Odin.


Fuente

Explora la fuente de este ejercicio.

Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Odin Exercism

¿Todo listo para empezar Two Fer?

Regístrate en Exercism para aprender y dominar Odin con 73 ejercicios y mentoría humana real, todo gratis.