10print

Je suis tombé un peu par hasard sur la critique du livre 10 PRINT , le pdf du livre est gratuit et plutôt joli, il parle de programmation, d’art et d’aléatoire. Tout le livre est centré sur le programme de basic suivant qui donne l’image de la couverture.

1
2
3
4
5
6
7
8
9
10
11
12
10 PRINT CHR$(205.5+RND(1)); : GOTO 10
/\\\\\\//\\////\\/\/\/\//\///////\\/////\///\\/\\
\/\///\/\//\\//\\\/\\\/\///\\\\\\/\/\\\\\\/\\\/\\
\\////\/////\\\\\\\/\\\\\\\\\\\//////\/\/\\\\/\//
/\//\\\/\\\/\\///\\//\////\\/\/\//\\//\//\\/////\
///\\/\\\\///\\/\/////\\\/\\\///\//\\\\//\\//\//\
//\\\\//\\/\//\\//\///\\/////\///\/\//\/\//\//\\/
//\/\/\///\\\/\//\////\\\//\/\/\\\\\\//\\\\\///\/
//\\/\\\//\////\//\\\\\/\////\\\///\/\\/\//\\\///
//\//\/\\\\\//////\///\/\\\/\/\/\\//\\/\\\//\//\\
//\/\/\\\/\\/\/\////\//\\//\\//\/\///\/\/////\///
//\\//\\\/////\//\//\\/\\//\/\//\//\\/\//\\\\\//\

Bon la police d’écriture ne rend pas vraiment justice au code.

C’est possible de faire le même motif en PHP et en peu de code ?

Une solution

1
2
3
4
$out = array('/', '\\');
for($i = 0; $i < 1000; $i++){
    echo $out[array_rand($out)];
}

Attention array_rand renvoie la clé et non la valeur d’où le $out[array_rand($out)]

Et puis je me suis dit que array_rand ne sert pas à grand chose.

Donc j’ai essayé

1
2
3
4
$out = array('/', '\\');
for($i =0; $i < 1000; $i++){
 echo $out[rand(0,1)];
}

pour générer des nombres aléatoire, il vaut mieux utiliser mt_rand qui d’après la documentation génère des nombres aléatoires plus intéressants (?). Pour des vrai nombres aléatoires pour les mots de passe, on utilise des librairies voir cette présentation.

Mais il est possible d’initialiser plus d’une constante dans la boucle for.

1
2
3
for($i =0, $out = array('/', '\\'); $i < 1000; $i++){
 echo $out[mt_rand(0,1)];
}

On peut aussi faire plus d’une action dans l’incrémentation.

1
2
for($i = 0, $out = array('/', '\\'); $i < 1000; $i++, echo $out[mt_rand(0,1)])
);

On minimise les variables et la notation avec les []

Nous obtenons le code suivant

1
for($i =0, $o = ['/', '\\']; $i < 1000; $i++, echo $o[mt_rand(0,1)]);

Je n’avais jamais écris de boucle for sans corps({..}).

La documentation de PHP est plutôt claire sur le for