Dart : Génération de pseudo


Avant de commencer j’ai choisi Dartlang pour une raison : m’ouvrir de nouveaux horizons ! C’est un langage que je viens de découvrir (- d’un mois) et j’avais envie de l’essayer pour voir ce qu’il donne au niveau de la praticité. Je ferais un article entier sur mes impressions un autre jour.

C’est incroyable parce que ça m’a toujours attiré les générations de pseudo, de mots de passes etc. Bon maintenant je trouve ça vraiment facile, enfin quoi que car là c’est basique mais, quand j’arriverais à générer des vrais prénoms français par exemple, là ce sera vraiment magique.

Bon, pour commencer petite question : de quoi est composé un pseudo ?

De voyelles et de consonnes bravo !

Donc on va créer 2 listes, une liste contenant des consonnes et une autre contenant des voyelles :

List<String> vow =
[
"ai", "ey", "on", "en","an", "au",
"iu", "oe", "ay", "ei", "a", "e",
"i", "o", "u", "y", "ou", "io",
"hi", "oy", "eu"
];

List<String> con =
[
"b", "c", "d", "f", "g", "h",
"j", "k", "l", "m", "n", "p",
"r", "s", "t", "v", "w", "x",
"z", "pp", "ll", "qu", "ss", "tt",
"rr", "pr", "ch", "br", "dr", "rt",
"sr", "th", "sc", "gu"
];

C’est bien beau tout ça, mais qu’est ce qu’on va en faire ?

Explication de l’algorithme

Un pseudo contient des syllabes ok ? Ces syllabes contiennent des consonnes suivi de voyelles exemple de pseudo au pif : Tekura.

Te Consonne + voyelle, Ku Consonne + voyelle et Ra Consonne + voyelle.

De ce principe je vais faire une itération qui prend une consonne parmi la liste ‘con’ puis une voyelle dans la liste ‘vow’.

Pour faire ça on va déjà établir nos méthodes qui gèrent l’aléatoire hein, tout doux faut pas pousser mémé dans les orties:

int randomRange(int min, int max)
{
return new Random().nextInt(max-min)+min;
}
String pickRandom(List<String> list)
{
var elem = list[randomRange(0, list.length-1)];
return elem;
}
bool chanceOf(int chance) {
return randomRange(0, 100) <= chance;
}

Nous aurons également besoin d’une méthode pour mettre en majuscule la première lettre du pseudo, histoire d’être un peu plus calligraphique et un peu moins bourrin…

String capitalize(String s) => s[0].toUpperCase() + s.substring(1);

Voici à quoi ressemble la première version de notre code de génération de pseudo :

String generate01([String strBase = "", int syll = 2])
{
String finalStr = strBase;
for (var i = 0; i < syll; ++i) {
var c = pickRandom(con);
var v = pickRandom(vow);
finalStr += c + v;
}
return capitalize(finalStr);
}
[String strBase = "", int syll = 2] = paramètres optionnel avec une valeur par défaut.

Ici, on peut rapidement détecter un premier problème, parfois le random peut prendre une double consonne par exemple : Tt ou Ll. C’est impossible normalement (pour une première lettre) alors on va ajouter quelques petites lignes :

String generate02([String strBase = "", int syll = 2]) {
String finalStr = strBase;
for (var i = 0; i < syll; ++i) {
var c = pickRandom(con);
if (i == 0) {
while (c.length > 1)
c = pickRandom(con);

var v = pickRandom(vow);
finalStr += c + v;
}
}
return capitalize(finalStr);
}

Ici on dit : tant que c.lenght > 1 (donc s’il y a deux lettres) c = un nouveau tirage aléatoire. Tant que cette condition est fausse le reste du code ne pourra pas être exécuté.

Un deuxième problème survient : parfois, un pseudo peut commencer par une voyelle exemple : Omega.

String generate03({String strBase = "", int syll = 2}) {
String finalStr = strBase;
for (var i = 0; i < syll; ++i) {
var first = "";
bool vowPick = false;
if (i == 0 && chanceOf(40)) {
first = pickRandom(vow);
vowPick = true;
}

else {
first = pickRandom(con);
if (i == 0) {
while (first.length > 1)
first = pickRandom(con);
}
}
var second = pickRandom(vowPick ? con : vow);
finalStr += first + second;
}
return capitalize(finalStr);
}

J’ai rajouté un ternaire à la fin pour savoir s’il fallait ajouté une consonne ou une voyelle. Mais ce n’est pas suffisant, car si je commence à partir d’une voyelle, ça devrait faire: voyelle consonne voyelle consonne... Or là ça fait {voyelle || consonne } {si consonne = voyelle sinon = voyelle} {consonne} {voyelle} etc.

Le problème c’est que si on a une voyelle ça fera : {voyelle} {consonne} {consonne} {voyelle} …

On va ajuster ça pour que ce soit d’un plus lisible et de deux plus efficace ;)

String generate04({String strBase = "", int syll = 2}) {

String pickCon(int index) {
var t = pickRandom(con);
if (index == 0) {
while (t.length > 1)
t = pickRandom(con);
}
return t;
}
  String finalStr = strBase;
bool startWithVow = chanceOf(40);
for (var i = 0; i < syll; ++i) {
String first = startWithVow ? pickRandom(vow) : pickCon(i);
String second = startWithVow ? pickRandom(con) : pickRandom(vow);

finalStr += first + second;
}
return capitalize(finalStr);
}

J’ai ajouté une méthode à l’intérieur pour pouvoir dire que c’est typique à cette fonction. Ensuite j’ai conditionné le programme en fonction du tirage de(s) première(s) lettre(s).

Bon j’imagine que vous voulez voir le fabuleux résultat de notre petit algorithme :

Giwan
Eissong
Wonrtei
Lapru
Hiquanh
Eysrairt
Waxhi
Auvann
Heyrre
Mike
Nauley
Zendrhi
Zurrou
Onsenh
Nemiu
Beysren
Enhonl
Oymeyp
Tigen
Tiovon
Koken
Paisciu
Maychen
Utoev
Lissio
Oevak
Cendi
Abrich
Zurren
Fippan
Ypenqu

Le résultat est plutôt pas mal, j’ai même réussi à générer quelque chose de correct : “Mike” à partir de là moi je suis content :)

Merci beaucoup d’avoir lu.

A single golf clap? Or a long standing ovation?

By clapping more or less, you can signal to us which stories really stand out.