coding challenge

Reto de programación 0: El famoso FizzBuzz

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.

¿Te ha resultado útil esta información? 🍺

Si este post te ha resuelto un problema, invítame a un café o a una cerveza. Con este pequeño gesto me animas a seguir escribiendo.

Comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *:

  • El fin del tratamiento es únicamente la moderación de comentarios para evitar spam
  • La legitimación es tu consentimiento al comentar
  • No se comunicará ningún dato a terceros salvo por obligación legal
  • Tienes derecho al acceso, rectificación y eliminación de los comentarios