FizzBuzz sans boucle If

Bon, j’ai passé deux-trois entretiens ou on m’a demandé d’implémenter “fizzbuz”

Les règles sont simples.

  • Écrire un programme qui écrit les nombres de 1 à 100.
  • Si le chiffre est divisible par 3 afficher seulement “fizz”
  • Si le chiffre est divisible par 5 afficher seulement “buzz”
  • Si divisible par 3 et 5 afficher “fizzbuzz”
  • sinon afficher le chiffre tout seul

Il y a plein de solutions possibles

la plus littérale

1
2
3
4
5
6
7
8
9
10
11
for ($i = 1; $i <= 100; $i++) {
    if ($i % 15 == 0) {
        echo 'fizzbuzz'. "\n";
    } elseif ($i % 3 == 0) {
        echo 'buzz'. "\n";
    } elseif ($i % 5 == 0) {
        echo 'fizz'. "\n";
    } else {
    echo $i ."\n";
    }
}

la version de wikipedia

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for ($i = 1; $i <= 100; $i++) {
    $output = '';
    if ( $i%3 == 0) {
        $output .= 'fizz';
    }
    if ( $i%5 == 0) {
        $output .= 'buzz';
    }

    if ($output == '') {
        $output .= $i;
    }
    echo $output. "\n";
}

Ma version que j’avais programmé

Le continue n’est pas souvent utilisé. Mais je trouve qu’il remplit son rôle ici.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for ($i = 1; $i <= 100; $i++) {
    if ($i % 15 == 0) {
        echo 'fizzbuzz'. "\n";
        continue;
    }
    if ($i % 3 == 0) {
        echo 'buzz'. "\n";
        continue;
    }
    if ($i % 5 == 0) {
        echo 'fizz'. "\n";
        continue;
    }
    echo $i ."\n";

}

Sans boucle if

Il existe une version qui n’utilise aucune boucle if.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$resp = array(
    'fizzbuzz',
    false,
    false,
    'fizz',
    false,
    'buzz',
    'fizz',
    false,
    false,
    'fizz',
    false,
    false,
    'fizz',
    false,
    false
);

for ($i = 1; $i <= 100; $i++) {
    ($output = $resp[$i%15]) || ($output = $i);
    echo $output. "\n";
}

En php on ne peux pas faire la commande suivante qui correcte en javascript;

1
var a = value || defautvalue ;
1
$output = $resp[i%15] || $i// => $output = true

C’est pour cela que l’on utilise cette ligne un peu bancale.

1
($output = $resp[$i%15]) || ($output = $i);

Il n’y a pas de boucle if. Si un jour on vous demande d’implémenter FizzBuzzb en essayer cette version.