Tras un tiempo sin escribir en el blog, he decidido desempolvar el teclado y comenzar con una serie de retos de programación.
¿De dónde surgió la idea? Hace unos días me topé con un tweet de Brais Moure que enlazaba a la web retosdeprogramacion.com, donde semanalmente se propone un reto a resolver.
Me picó el gusanillo y voy a tratar de cuando en cuando de ir resolviendo los retos que aquí se planteen.
/*
* Escribe un programa que muestre por consola (con un print) los
* números de 1 a 100 (ambos incluidos y con un salto de línea entre
* cada impresión), sustituyendo los siguientes:
* - Múltiplos de 3 por la palabra "fizz".
* - Múltiplos de 5 por la palabra "buzz".
* - Múltiplos de 3 y de 5 a la vez por la palabra "fizzbuzz".
*/
Como vemos, hay que pintar los números del 1 al 100, y tenemos 3 «condiciones» o «reglas de negocio». Si el número que toca pintar es múltiplo de 3, en su lugar pintaremos fizz. Si es múltiplo de 5 pintaremos buzz, y si lo es de 3 y 5 a la vez, pintaremos fizzbuzz.
Para recorrer los números del 1 al 100 utilizaremos un bucle for, y para las condiciones utilizaremos una estructura de control if-elseif-else.
Como lo primera condición es la que primero se evalúa, comprobaremos que el número sea divisible entre 3 y 5, porque en caso de no hacerlo así, siempre que se cumpla que es múltiplo de 3 ó de 5, se pintará fizz ó buzz, pero nunca fizzbuzz.
Y por hacerlo un poco más curioso, vamos a crear un método para cada una de estas reglas. Utilizando un nombre descriptivo, nuestro código será más legible (clean code) y será muy fácil de testear con unit tests.
<?php
declare(strict_types=1);
function FizzBuzz()
{
for ($i = 1; $i <= 100; $i++) {
if (isDivisibleBy3And5($i)) {
print("fizzbuzz\n");
} elseif (isDivisibleBy3($i)) {
print("fizz\n");
} elseif (isDivisibleBy5($i)) {
print("buzz\n");
} else {
print($i . "\n");
}
}
}
function isDivisibleBy3(int $number): bool
{
return ($number % 3) == 0;
}
function isDivisibleBy5(int $number): bool
{
return ($number % 5) == 0;
}
function isDivisibleBy3And5(int $number): bool
{
return ($number % 3) == 0 && ($number % 5) == 0;
}
FizzBuzz();
Cualquier sugerencia y/o mejora es bienvenida en los comentarios.
También puedes verlo en GitHub.